改变编码坏习惯

转载 2011年01月10日 19:40:00

 

1.对局部变量(local variables),字段(fields),参数(method arguments)这三种变量的命名没有区分,造成了代码的阅读困难,增加了代码的维护成本。

 

作者举了个例子:

Java代码 
  1. public boolean equals (Object arg) {  
  2.   if (! (arg instanceof Range)) return false;  
  3.   Range other = (Range) arg;  
  4.   return start.equals(other.start) && end.equals(other.end);  
  5. }  

 

在这个方法中,arg直接用argument的缩写,虽然大家一看就知道这是参数了,但这种命名方式却丢失了参数代表的对象本身的含义。大家知道这是参数,却不知道这是什么参数。如果方法的参数多一点,都按照arg1,arg2这样的方式命名,阅读代码的时候很头疼。另外两个字段变量,start和end,突然凭空而出,想一下才知道这应该是字段。当然,这个方法很短,造成的困难还不大,如果这个方法比较长的话,突然看到start和end两个变量,一般会先在前面找一下是不是局部变量,然后才能确定是类的字段变量。

 

这个问题貌似微不足道,但为什么要让代码阅读者花费额外时间在这些琐碎的问题上呢?如果有个方案能让代码阅读者一目了然的明白变量是那种变量,为什么不采用呢?就如同Steve McConnell在 《代码大全》中说的:"让人费神去琢磨神秘杀人凶手这没有问题,但你不需要琢磨程序代码,代码是用来阅读的。"


作者提出了解决方案:

  • 方法参数用前缀a开始
  • 类字段变量用前缀f开始
  • 局部变量不用前缀

修正后的代码样式应该是:

Java代码 
  1. public boolean equals (Object aOther) {  
  2.   if (! (aOther instanceof Range)) return false;  
  3.   Range other = (Range) aOther;  
  4.   return fStart.equals(other.fStart) && fEnd.equals(other.fEnd);  
  5. }  

 

这样的代码看起来一目了然,如果你没有一目了然,说明还是习惯问题,习惯养成了就好了。

 

不过作者的方案里,给类字段变量前面加 f 前缀,如果用代码生成工具生成get,set方法是会比较麻烦。get,set方法中我们不希望出现个f。不过这个问题可以用修改代码生成工具的方式解决。如果这个习惯普遍被java界接受,这些应该都不成问题了。

 

 

 

2.类成员的排序没有按照成员的作用域(scope) 的大小从大到小排列,而是喜欢把private放在前面。

 

作者举了一个常见的类样式:

Java代码 
  1. public class OilWell implements EnergySource {  
  2.    private Long id;  
  3.    private String name;  
  4.    private String location;  
  5.    private Date discoveryDate;  
  6.    private Long totalReserves;  
  7.    private Long productionToDate;  
  8.      
  9.    public Long getId() {  
  10.       return id;  
  11.    }  
  12.    public void setId(Long id) {  
  13.       this.id = id;  
  14.    }  
  15.      
  16.   //..elided  
  17. }  

 这种方式将private变量放在最前面。作者认为应该倒过来,把private变量的申明放在最后面。

 

因为人们认识一个事物的通常过程都是从一般到特殊,从抽象层次来说,是从高到底的认识过程。如果你倒过来的话,就不能从整体上把握事物,也不能抓住事物的本质,只能在一堆具体的片段事实中迷失。

 

整体的抽象允许你忽略细节。抽象的层次越高,你可以忽略越多的细节。读者阅读一个类时可以忽略的细节越多他会越高兴。脑袋里填充太多的细节是痛苦的,所以细节越少越好。因此,将private成员方在最后会显得更富有同情心,因为这样阻止了不必要的细节显露给读者。

 

原来C++程序的习惯也是把private成员放在最开始。然而,C++社区迅速的认识到这是一个有害的规范,这个规范现在已经被修正。(参看 a typical C++ style guide )

注意:public 接口应该放在class的最开始,其次是protected成员,最后是private成员。原因是:

  • 程序员应该更关心接口而不是具体实现。
  • 当程序员需要用一个类的时候,他们需要的是接口而不是实现。

把接口放在开始是非常有意义的。把实现部分,private 片段,放在开始是一个历史遗留问题。最后还是要反复强调一下,一个类的接口的重要性超过实现细节。

 

将私有成员放在类的开始是一个等待打破的怀习惯,它似乎是sun早期的编码规范造成的。

 

将代码按照javadoc的顺序编排是非常好的:首先是构造方法,然后是非私有方法,最后是私有字段和方法。这样读者阅读的时候很自然的从抽象层次的高向低运动。

 

相关文章推荐

从今天开始努力做一个优秀的程序员,戒掉坏习惯,坚持好好练功,2013改变!

一个不想当大牛的菜鸟不是什么好鸟!开个玩笑,说来惭愧,毕业已经将近三年了,在上家公司只做过一个项目,虽然离职前已经能够单独解决相关模块的各类问题,但差不多都是已经遇到过的bug,打个比方就像每天都吃面...

使用Photoshop的10个坏习惯

Photoshop是一个非常灵活的应用程序,使用Photoshop完成同样一个任务有无数种方法。对于 Photoshop 用户而言,想搞清楚完成一项任务的最佳方法是很困难的。该教程中,我们将和大家分享...

影响成绩的十大坏习惯

习惯是经过反复练习而形成的较为稳定的行为特征,好的习惯可以带来好的结果,而坏的习惯只能带来不好的结果,在许多时候,孩子的学习成绩不理想,就是由于有一些坏的习惯在作怪。   一、学习无计划   学习...

十个坏习惯毁掉你的牙齿 刷牙时使劲漱口

刷牙是我们每天要做的事情,即使每天认真刷牙、饭后仔细漱口,牙齿也可能被一些不起眼的习惯损伤。下面专家盘点出“最让你意想不到的毁牙习惯”,大家一定要警惕了。   运动过量。德国海德堡大学医院一项最新研...

年长程序员,坏习惯在扼杀你的职业生涯

英文原文:Older Developers: Bad Habits Are Killing Your Career   我在最近一次《关于年长程序员的5个误传》文章评论中收获颇丰。毕竟,它有望打破被...

没有躲过的坑--使用using namespace std的坏习惯

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。在C++中,变量、函数和类都是大量存在的。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。比如,如果我...

一定要理解程序员 程序员的坏习惯

如果你是一个程序员,或者你就读计算机相关专业,那么你应该能理解下面这些诡异的小习惯是怎么养成的,或者你本身就有着其中的某些习惯: 0.程序员数数会从0开始数起. 例:程序员吵架的时候会说:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)