美文网首页iOS 开发 iOS Developer
这样写代码,肯定是跟代码有仇吧

这样写代码,肯定是跟代码有仇吧

作者: 南京在下大暴雨 | 来源:发表于2016-07-07 17:03 被阅读328次

“你代码写得这么烂,有问过代码是什么感受吗?”

一,完全不能被读懂的代码

哎,憋了这么多天,今天我实在憋不住了!

本小姐我,快-被-一-段-代-码-气-炸-了!

是的,你没看错,惹我生气的是一段根本就没有生命的代码。

但是不得不说,这段代码有够魔性!

一个明明没有生命的东西,硬生生把一个活的人给惹炸毛了。

它还不够魔性吗?

事情的经过是这样的。

姐姐我最近负责跟进的是一个教育类软件的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!

举个很简单的例子,《天龙八部》中的扫地僧,他出手时,摆什么花里胡哨的招数了吗?没有!

所以你是希望自己做个随便一举手投足都自带功力的高手,还是做个金玉其外的花架子,选择权在你自己。

毕竟,代码是承载我们技术水平的东西,它跟我们没有深仇大恨

在敲下每行代码的时候,我们还是稍微用点心,不要总满足于功能似乎实现了就万事大吉的入门级别!

相关文章

网友评论

    本文标题:这样写代码,肯定是跟代码有仇吧

    本文链接:https://www.haomeiwen.com/subject/azbkjttx.html