代码整洁之道

不知道为什么,在读完神书(菜场)之后看其他书,总会有一种“这东西看了有毛用”的感觉。但是生活还是要继续。


命名:

如果名称需要注释来补充,那命名其实就不算完美。

长名称要优胜于短名称,并且名称的长短与其作用域大小相对应。但是与此同时,把类型和作用域编进名称里,突然增加了解码的负担。没理由要求每位新人都在弄清楚代码之前去搞懂另一套编码“语言”

匈牙利命名法:现在他们增加了修改变量,函数货类的名称、类型的难度,他们增加了阅读代码的难度,制造了让编码系统误导读者的可能性。
也不必使用前缀来表名成员变量。应当把类和函数做的足够小,消除对成员前缀的需要。

老实说,这一章很受教。因为我一直以来都在探索最佳的命名方案。尝试过好多。

入行时,用的是下面这种极简命名,在写的时候痛快,review的时候一脸懵逼,为了缓解懵逼,只能用注释去解释。
class A{
   var b, //XXXXX
   function c(){} //XXXX
}
在做了无数次的注释翻译代码之后又成了另一个极端,极端长命名。
class Generate{
  var Generate_type;
  function Generate_begin(){}
}
如书上所说,第一种会让人不知所云,第二种长命名又让人看得又臭又长。

函数:

  1. 代码的第一规则是短小,第二条规则还是短小。
  1. 逻辑判断中的代码块只应该有1行。这一样大抵应该是函数的调用语句。而且块内调用的函数拥有较具说明性的名称。从而增加了文档上的价值。
  2. 函数应该做一件事,做好这件事,只做这件事。

不好的函数:

  1. 过多的参数
  1. 输出参数
  2. 标示参数
  3. 死函数

一如既往地贴代码

刚入行:面条代码
for{
  head1.html = 'xxx';
  head1.offsetleft = x+122+'px'
  head1.background = host+path+'.png'
  foot.html = 'xxx';
  foot.offsetleft = x+122+'px'
  foot.borderImg = host+path+'.png'
}else{
}
现在作为老司机的话写法:--------------------------------------------------------
for{
  generateHead();
  generateFoot();
}else{}
----------上为调用,下为声明------------------
generateHead(){
  head1.html = 'xxx';
  head1.offsetleft = x+122+'px'
  head1.background = host+path+'.png
}
generateFoot(){}
  1. 最理想的参数数量是0,越少越好。

重复可能是软件中一切邪恶的根源。许多原则和实践规则都是为控制与消除重复而创建。软件开发领域所有的创新都是在不断尝试从源码中消灭重复。 (感觉无比正确啊)

注释:

注释的恰当用法是弥补我们在用代码表达意图时而遭遇的失败。极端地说,拥有注释的代码,其实就算得上是失败。

我一开始接受到这个理论的时候 前一句是很赞同的,后一句一直都理解不了。也听过前辈们说“代码即文档”的观点。注释给了coder更加自由的发挥空间,可为什么会遭到如此的鄙视,终于在书里找到了答案。

  1. 注释会撒谎。注释存在的时间越久,就离其所描述的代码越远,注释的描述也就越加偏差。
  1. 代码在变动,在演化。只有代码能最准确地描述当前的意图,而注释不行。
  2. 不准确的代码比没注释的代码危害要大得多。因为有可能注释的预期是永远无法实现的。


真真有感触,刚入行的时候用的短命名。为了能在review中知道代码意图,源码中的注释永远都比代码写的还多。随着代码的演化,在修改注释的时候就会瞻前顾后,甚至直接偷懒直接改了代码而忽略的注释。深受其害。

好的注释:
  1. 版权
  1. 提供信息的注释。(返回值类型、穿参类型等)
  2. 对意图的解释(复杂逻辑的说明)
  3. 警示
  4. TODO
  5. 强调(放大)某个代码段的重要性
坏的注释:
  1. 喃喃自语
  1. 多余的注释
  2. 误导性注释
  3. 循规式注释
  4. 日志性注释
  5. 废话注释
  6. 能用函数或者变量的时候就不要用注释。
  7. author(因为版本管理会帮忙做这个事情)
  8. 注释掉的代码

格式

好的代码如同读报纸一样。名称简单并且一目了然。名称本身就应该足够告诉我们是否在正确的模块中。源文件顶部最应该给出高层次的概念和算法,细节应该往下中间展开。


错误处理

  1. 在业务逻辑和错误处理之间要有良好的区隔
  1. 代码异常不要反悔null值。返回null值,不光给自己增加了工作量,也给调用者添乱。只要有1处没检查null值,程序就有可能失控。

--
最近在跟刚入门的后台同学合作,上面第二条无比感同身受。。


  1. 保持内聚性就会得到许多短小的类
  1. 系统应由许多短小的类而不是少量巨大的类组成。每个小类封装一个权责,只有一个修改的原因,并与少数其他类一起协同达到期望的系统行为

其他

  1. 毁坏程序最好的办法之一就是以改进之名大动其结构,有些程序永远不能从这种所谓的“改进”中恢复回来。

这个观点也很同意。 很多时候在开发时候图方便,给日后留了包袱,总想着日后会优化。怎想真正到了优化的时候,无数的代码已经高度耦合,动一发则牵全身,同时分配出来的优化时间比开发时间要短,但实际上优化要消耗更大的精力。同时优化没有新开发功能那么效果显著,所以有种“吃力不讨好”的样子。
于是乎,留着日后优化就成了空话。要么会甩给接盘侠,要么只能花更大的代价重写。。都得不偿失。。


其他不好的代码实践:

  1. 一个源文件中存在多种语言。
    无法避免,但是应该尽量减少
  1. 明显的行为未被实现。
  2. 不正确的边界行为
  3. 忽视安全
  4. 重复
  5. 在错误的抽象层级上的代码
  6. 基类依赖于派生类
  7. 信息过多
  8. 死代码
  9. 垂直分隔
  10. 前后不一致
  11. 混淆视听
  12. 人为耦合
  13. 特性依恋
  14. 选择算子参数(参数为bool)
  15. 晦涩的意图
  16. 位置错误的权责
  17. 不恰当的静态方法

好的代码实践

  1. 用解释性变量
  1. 函数名称应该表达其行为
  2. 理解算法
  3. 把逻辑依赖改成物理依赖
  4. 用多态代替if/else switch/case
  5. 遵循标准约定
  6. 用命名常量来代替魔术数
  7. 准确
  8. 结构甚于约定
  9. 封装条件
  10. 避免否决性条件
  11. 函数只做一件事
  12. 掩蔽时序耦合
  13. 别随意
  14. 封装边界条件
  15. 函数只应该在一个抽象层级上
  16. 在较高层级上放值可配置数据
  17. 避免传递浏览
  18. 采用描述性名称
  19. 名称应与抽象层级相符合
  20. 尽可能使用标准命名法
  21. 无歧义命名
  22. 为较大作用范围选用较长名称
  23. 避免编码
  24. 名称应该说明副作用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容