“你代码写得这么烂,有问过代码是什么感受吗?”
一,完全不能被读懂的代码
哎,憋了这么多天,今天我实在憋不住了!
本小姐我,快-被-一-段-代-码-气-炸-了!
是的,你没看错,惹我生气的是一段根本就没有生命的代码。
但是不得不说,这段代码有够魔性!
一个明明没有生命的东西,硬生生把一个活的人给惹炸毛了。
它还不够魔性吗?
事情的经过是这样的。
姐姐我最近负责跟进的是一个教育类软件的ios客户端。
已经上线运营了,但是最近甲方领导觉得以前的ui不够美观,于是提出了我们这个月要做个小改版。
我看了需求,无非调调颜色,改改图标排列,再添加几个详情页。
好像也没啥难搞的。
于是我就跟身边一个小伙子简单交待几句,让他去做这个事情。
临了,我还不忘记叮嘱了句,我们现在代码里,这一块之前改来改去,代码结构有点乱,你看时间允许的话,就一起重构下吧。
就是这句话,让我想狠抽自己嘴巴。
是的,代码他重构过了,但是重构后的代码,我更加看不懂了!
昨天转测的版本,今天看到有个问题,通讯录的列表里,有个人的电话号码显示不对。
粗粗一看,这不就是tableview的cell复用数据没更新好的问题嘛?
这种小case,姐姐顺手就可以给处理了。
谁知道啊,姐姐还是太年轻,就这么栽这坑里了!
当我进到这个界面的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath函数中,一下子就傻眼了。
切切实实的阴沟里翻船的感觉。
首先,这个函数有200多行!
直接懵圈了。
但是我也不能这么久放弃,有点没面子。
硬着头皮往下看。
令人想不到的是,这个函数中使用的图片资源,名字竟然还是中文!
怎么样?有没有要吐血的感觉?
哦,那你的承受能力就太差了些。
因为,最让我承受不了的还不是这些。
而是这200多行的代码竟然做的都是cell上控件的创建初始化赋值...
我实在没法淡定啊,对着这样的代码,我竟然不知道还要cell对应的类干嘛。
跟几个朋友吐槽了下,做测试的美眉说我承受不了的这条她不能理解。
我几近咆哮的跟她讲——
“你想想直接让奶奶甩开儿子媳妇,生个孙子是什么感触吧”
还有比这更形象的比喻了么?
肯定有人不相信我讲的话,好吧,我就贴一小段给大家感受下。
ContacterDetailCell * cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[ContacterDetailCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
cell.selectionStyle = UITableViewCellSeparatorStyleNone;
}
BOOL isHasShortDn = [[[NSUserDefaults standardUserDefaults]objectForKey:KEY_ISOPEN_VNET]integerValue];
ADTIMContacter * contacter = self.contacterArray[indexPath.row];
_phoneNum = contacter.m_strDn;
cell.contentView.userInteractionEnabled = YES;
cell.shortDnLabel = [UILabel new];
cell.telLabel = [UILabel new];
cell.classNameLabel = [[UILabel alloc]initWithFrame:CGRectMake(5, 5, MAIN_WIDTH, 40)];
cell.classNameLabel.textColor = [UIColor darkGrayColor];
cell.classNameLabel.font = [UIFont systemFontOfSize:16.0];
[cell.contentView addSubview:cell.classNameLabel];
cell.publicLable = [[UILabel alloc]initWithFrame:CGRectMake(MAIN_WIDTH - 80, 135, 50, 40)];
cell.publicLable.text = contacter.m_isOpen_phone ? @"已公开":@"未公开";
cell.publicLable.textColor = [UIColor redColor];
cell.publicLable.font = [UIFont systemFontOfSize:16.0];
cell.publicLable.textAlignment = NSTextAlignmentCenter;
[cell.contentView addSubview:cell.publicLable];
UIImageView * line = [UIImageView new];
line.backgroundColor = kBWDarkGray;
[cell.contentView addSubview:line];
if ([[LoginUserUtil userId] isEqualToString:_userID[1]]) {
cell.classNameLabel.hidden = NO;
cell.classNameLabel.text = self.classNameArray[indexPath.row];
cell.shortDnLabel.frame = CGRectMake(5, 45, MAIN_WIDTH, 55);
cell.telLabel.frame = CGRectMake(5, 105, MAIN_WIDTH, 55);
line.frame = CGRectMake(0, CGRectGetMaxY(cell.shortDnLabel.frame), MAIN_WIDTH, 1);
UISwitch * my_switch = [[UISwitch alloc]initWithFrame:CGRectMake(cell.publicLable.frame.origin.x, CGRectGetMinY(cell.publicLable.frame) - 25, 0, 0)];
[my_switch setOn:contacter.m_isOpen_phone animated:YES];
[my_switch addTarget:self action:@selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged];
my_switch.tag = 100 + indexPath.row;
if (!IsStrEmpty(contacter.m_strDn)) {
[cell.contentView addSubview:my_switch];
}
我就想问谁特么能把这段代码读完,并理解了?
我肯定是不行!
还不死心的我,又去看了看其他地方。
真心想讲脏话,好嘛?
充斥满屏的魔鬼数字,
完全不知所谓的变量命名,
不考虑属性的使用范围,统一采用public
不考虑内存的优化使用
......
这位大哥,你这样写代码,有没有问问代码什么心情?
最终,我也没找到上面所说问题的解决办法。只好找来制造这段代码的小哥。
没错,这小哥就在刚才处理完问题后,已经领了我甩给他的编码规范去面壁了。
我曾一直天真(臭不要脸)的以为,我的团队能做出完美的应用。经此事件,我突然感觉,对于我目前的团队来说,做出完美的app是多么遥不可及的梦想。
我们甚至都写不出来,能让别人(注意,这里的别人不是所有人,而是你的同行们)看懂的代码!
二、我们为什么写出了不易懂的代码?
不要问我什么是容易被别人读懂的代码。
你只要想想你自己去读别人的代码,你希望看到什么样的代码心中就有答案?
告诉我,你在读代码时
是希望看到排版整齐的,还是很随性的?
是喜欢看变量命名使用同一规则的,还是根本就看不懂使用了什么规则的?
是更乐于看到函数的功能单一的,还是乐于看到囊括了好几个不相关的能力的函数?
是更接受逻辑清晰的还是更接受逻辑繁复的?
是一看就知道作者意图,还是读了半天也不明白作者写这段代码要干嘛?
......
所以,你还要问我什么样的代码是容易被别人读懂的吗?
你自己心中明明早就有很明确的答案了好吗?
你之所以写出这么烂的代码,无非是你对别人(一般是跟你合作项目的伙伴)有明确的要求,而对自己没有!
完全分不清楚好代码和烂代码的人除外。
相信我,在你需要读别人代码的时候,你心中对好代码的定义能细分到三级目录。
然而,到你自己写的时候,都是干脆交给编译器,自己都懒得读,更别说给自己的代码套自己的标准,检验下是否易读。
三、怎么写出容易被读懂的代码?
怎么写出容易读的代码?
方法就一个,写完后自己去读!
然后想象一下,别人读这段代码的心里感受。
当然不排除,有很多自认为大神的人,经常会写出一些晦涩难懂的代码,以此来彰显自己水平牛X。
但是,请看明白,这些人都仅仅是自以为是的牛X。
真正的牛X是什么样的?把复杂的问题用很通俗浅显的方法解决了,那才是真正的牛X!
举个很简单的例子,《天龙八部》中的扫地僧,他出手时,摆什么花里胡哨的招数了吗?没有!
所以你是希望自己做个随便一举手投足都自带功力的高手,还是做个金玉其外的花架子,选择权在你自己。
毕竟,代码是承载我们技术水平的东西,它跟我们没有深仇大恨。
在敲下每行代码的时候,我们还是稍微用点心,不要总满足于功能似乎实现了就万事大吉的入门级别!
网友评论