改变编码坏习惯

转载 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,打个比方就像每天都吃面...
  • jidanpi
  • jidanpi
  • 2013年03月06日 21:42
  • 466

让IT工作者过劳的13个坏习惯

  • 2011年07月19日 18:56
  • 14KB
  • 下载

程序员注意了:21种坏习惯悄悄使你寿命减短

1.起床先叠被   人体本身─也是一个污染源。在一夜的睡眠中,人体的皮肤会排出大量的水蒸气,使被子不同程度地受潮。人的呼吸和分布全身的毛孔所排出的化学物质有145种,从汗液中蒸发的化学物质有15...

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

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

程序员:编程给你现实生活带来了哪些坏习惯

程序员:编程给你现实生活带来了哪些坏习惯 导读:似乎任何职业都会给从业人员带来这样那样的习惯。国外某网站上有位朋友(应该也是程序员)想了解其他程序员在投身堆码事业后有什么样的坏习惯。结果一呼百应...

为什么有些坏习惯很难改掉?

因为你内心没有把他们当成坏习惯,甚至沾沾自喜。 我以前酗酒,经常大醉,多次自我批评,发誓戒酒,但一直没成功。为什么? 因为我内心根本没认为酗酒是“坏习惯”,反而觉得酒酣之际,挥斥方遒的样子...

生活中有哪些坏习惯一旦改正就能带来立竿见影的好处?

作者:edmond 链接:https://www.zhihu.com/question/56000916/answer/150034675 来源:知乎 著作权归作者所有。商业转载请联系作者获得授...

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

如果你是一个程序员,或者你就读计算机相关专业,那么你应该能理解下面这些诡异的小习惯是怎么养成的,或者你本身就有着其中的某些习惯: 0.程序员数数会从0开始数起. 例:程序员吵架的时候会说:...
  • tearsmo
  • tearsmo
  • 2011年08月25日 11:23
  • 1909

使用Photoshop的10个坏习惯

Photoshop是一个非常灵活的应用程序,使用Photoshop完成同样一个任务有无数种方法。对于 Photoshop 用户而言,想搞清楚完成一项任务的最佳方法是很困难的。该教程中,我们将和大家分享...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:改变编码坏习惯
举报原因:
原因补充:

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