`
zhang_xzhi_xjtu
  • 浏览: 525122 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

老生常谈之如何写好的代码

阅读更多
这两天一直做code review,经常看着看着就有一种要死的冲动。
好的代码,一个老生常谈的问题。结合最近的实践,总结一下常见的问题。

1 了解你的代码
很多程序员并不了解自己的代码。
比如null!=Object,很多人已经不知道为什么会有这样一个编码规范,怕if(Object!=null)写成Object=null通过判断。我并不喜欢这个规范,因为读起来不自然。

2 不要盲从
一段程序catch一个RuntimeException,把这个RuntimeException封装成一个新的RuntimeException又抛出来,问他为什么这么做,他说上层的程序catch不到这个RuntimeException,要自己构建一个RuntimeException才能catch住。而且他还咨询了别人的意见,参考了其他的代码。
我问他这样合理吗,这样可以解决问题吗,一段程序catch不到原生的RuntimeException,凭什么就能catch住你封装又抛出的RuntimeException。他的最大理由是别人这么说,所以就这么做了。同学,坚持一下自己。你应该知道这是不可能的。
后来发现问题在于打日志的程序写错了,打的是原生的toString方法,所以导致他以为没有catch到异常。
别人的代码catch是为了加入一些自定义错误消息。

3 不要产生无用的对象
A a=new A();
if(condition){
  a=getAFrom();
}else{
  a=getAFrom();
}
这样的new有什么用,唯一的用处就是产生垃圾。

4 不要轻易怀疑类库,先怀疑自己
一段js返回一个日期的7天前的日期,结果多了一天。结果理由就是类库出错,需要java程序员计算该值,然后传入。
当然不能这么搞了,仔细研究了代码之后,发现是js写错了。

5 命名
这个基本所有的编程书都讲了,但是估计很多的程序员对这个东西并没有足够的重视。变量,方法,类的命名一定要想一些时间再命名,不要贪图一时之快。

6 去除重复代码
这个应该算是最著名的bad code smell了。但是看代码的时候还是会不时发现一大堆重复code。
该重构了,今天重构的时候就发现了一个简单的常量两处设置不一样,但是程序的内容和意义都是一样。如果这个拖到以后,又是一个坑。

7 遵循习惯
java的实例变量的默认值大家都是知道的。请不要在一个有20-30个实例变量的类中,突然有一个boolean设成true。我一般一看这么多的实例变量,都是默认认为它们的初始值是java默认初始值。当然,一个类本身有20-30实例变量本身就是一个很扯的事情。

8 不要无用的代码
系统总是有一些历史原因,永远不会执行到的代码,发现了就删掉吧。程序员已经很辛苦了,不要让大家把时间浪费在没有用的事情上。而且,这个东西,很有可能引起读着对程序的误读。

9 没有小事
别催了。让我专业的写程序,哪怕你觉的只是加一个变量的问题,我还有很多东西需要考虑呢。这个变量加在什么地方,叫什么名字,什么类型,如何使用,测试怎么办。一大堆问题等着我呢。

10 态度
这两天看代码,总结就是如下:
前人拉屎,后人擦屁。
你不想擦屁吧,那么不要到处。。。。。。。
分享到:
评论
32 楼 J-catTeam 2010-11-05  
在一个公司中出现不规范的代码常常都是由于
1.程序员的水平和自我要求。
2.紧张的工时和不完善的review环节。
3.系统经手太多,开发人员太杂。

我理解的好的代码是
流程清晰,注释友好,命名规范,格式合理,异常处理恰当。==多种
31 楼 116427 2010-11-05  

现在对楼主的话深有感触啊!

我做过一个系统,主页面上JS代码 平均1000以上,


有些人写的一个java类中的方法有上千行,还么有注释
30 楼 116427 2010-11-05  
代码如此,

情何以堪啊?
29 楼 tuti 2010-11-05  
yuyue618 写道
很多人喜欢写 if (userList.size()==0){
                  ...
               }
  惯用法应该写成
              if (userList.isEmpty()){
                  ...
               }


意思很大吗?
源码:
public synchronized boolean isEmpty() {
return elementCount == 0;
    }
难道不同吗?


程序要朗读出来,你就会发现不同在哪里了。
28 楼 hijude 2010-11-05  
垃圾人在垃圾公司,谁叫你生在中国,认命吧。
27 楼 gh_aiyz 2010-11-05  
对楼主的看法深有同感。公司的一个项目,一份代码存在四五份的情况到处都是,很多代码看了半天才发现根本不会使用。原来,这几位写代码的仁兄都是这样做的:发现A需要某个功能,发现这在B不是写过了吗,于是CTRL+C,CTRL+V,再改吧改吧。甚至一个类里面有两个功能相似度达到99%的方法。这样的代码就是一个噩梦。

最近对这个项目进行重构,其中一个子项目重构完之后代码从9000行变成不到3500行。
26 楼 yuyue618 2010-11-05  
很多人喜欢写 if (userList.size()==0){
                  ...
               }
  惯用法应该写成
              if (userList.isEmpty()){
                  ...
               }


意思很大吗?
源码:
public synchronized boolean isEmpty() {
return elementCount == 0;
    }
难道不同吗?
25 楼 凤舞凰扬 2010-11-05  
   如何确保项目团队写好代码,如何让自己的代码提高,以下步骤可以参考:
1. 代码格式化检查文件(或者说编程规范,但不要是文档型的,可以是checkstyle,可以是PMD)
2. 明确的结构和明确的第三方包依赖(同样是工具类,有的人用spring,有的人用apache,有的人干脆自己写),避免项目组的歧义。
3. 消除代码中所有的警告(包括eclipse的警告),这是代码质量变好的基础。
4. 可自动检查的代码检查工具(包括Jdepend, PMD, metric, findbugs),并修复检查出来的问题。
5. 不定期的人为抽查及比较说明。
24 楼 cs_man 2010-11-05  
tuti 写道
paranoid945 写道

很多情况是很搞笑的,比如有好些人特意不写注释,为的就是让这块代码只有自己懂,然后别人搞不定只能找他。


太高估他们的记忆了,到时候其实他们自己也看不懂。
自己的烂摊子基本都还要自己来收拾,只是这种事情他本人也不好意思向别人抱怨什么。

“免死金牌”这类情况即使存在,也是很少见的。
更多的情况是,他们其实压根不知道,程序应该写成什么样。

高手和入门者的主要区别不在了解语法的多少,而是在对于惯用法“idioms”,知道得多少。
要写好代码,态度只是一小部分,大多数是水平和能力的问题。


楼上 写道

我以前有个同事,然后有个留言本模块的字段,叫‘标题’,一般人就起个名字叫'title'对吧,他不知道,然后查字典,起名叫’superscription‘,其他组员有时候也说这些玩意儿究竟是啥意思。


这就是个惯用法的例子。惯用法不仅是命名,更多是在代码逻辑中,虽然也能达到功能,但一看就不太讲究。

举个例子:
  很多人喜欢写 if (userList.size()==0){
                  ...
               }
  惯用法应该写成
              if (userList.isEmpty()){
                  ...
               }

这个例子的问题我一直在犯,刚注意到。。。
23 楼 tuti 2010-11-05  
paranoid945 写道

很多情况是很搞笑的,比如有好些人特意不写注释,为的就是让这块代码只有自己懂,然后别人搞不定只能找他。


太高估他们的记忆了,到时候其实他们自己也看不懂。
自己的烂摊子基本都还要自己来收拾,只是这种事情他本人也不好意思向别人抱怨什么。

“免死金牌”这类情况即使存在,也是很少见的。
更多的情况是,他们其实压根不知道,程序应该写成什么样。

高手和入门者的主要区别不在了解语法的多少,而是在对于惯用法“idioms”,知道得多少。
要写好代码,态度只是一小部分,大多数是水平和能力的问题。


楼上 写道

我以前有个同事,然后有个留言本模块的字段,叫‘标题’,一般人就起个名字叫'title'对吧,他不知道,然后查字典,起名叫’superscription‘,其他组员有时候也说这些玩意儿究竟是啥意思。


这就是个惯用法的例子。惯用法不仅是命名,更多是在代码逻辑中,虽然也能达到功能,但一看就不太讲究。

举个例子:
  很多人喜欢写 if (userList.size()==0){
                  ...
               }
  惯用法应该写成
              if (userList.isEmpty()){
                  ...
               }
22 楼 l4borland 2010-11-05  
fool_leave 写道
dir_murong 写道
Zahir 写道
skzr.org 写道
Thanks!

总结的非常棒啊
自己的一点想法,打算尝试下:
对于命名一直在纠结中,取名太费时间了
A 通用命名规则大家都差不多
B 从Action到用户这一端,直接使用汉语拼音命名!
C 用户的数据表,表名和字段也用汉语拼音

这样客户和英语不好的都可以看懂。



public class YongHuGuanLiAction {

    public String tianJiaYongHu() {
      //....
    }

    public String shanChuYongHu() {
     //....
    }

}



这样的代码你真的能忍?

哈哈  我是受不了



如果程序员连简单的单词都不知道,那还是去种菜吧。做程序员不懂英语,以后的路会很苦。
用拼音做名字,实际上很屎


我以前有个同事,英语不行(我也一般)。然后有个留言本模块的字段,叫‘标题’,一般人就起个名字叫'title'对吧,他不知道,然后查字典,起名叫’superscription‘,为这事我们还辩论了一番,后来也是查字典才知道,这单词中文意思也是该死的‘标题’。
这种事情那同事做了不少,让我印象深刻,其他组员有时候也说这些玩意儿究竟是啥意思。

也许他以后会很NB,但是在和你工作的时间段,他可能就是很屎。
用拼音是很怪,但是后来我的方法是让他加注释,几个字就行。总比搞些生僻英文强
21 楼 l4borland 2010-11-05  
第三条我看见很多次了。。有时候是这么个原因。
A a=new A();
if(condition){
  a=getAFrom();
}else{
  a=getAFrom();
}
在eclipse里面或者装了插件的地方,如果第一行只写
A a;
他会给个警告大概就是要初始化变量之类的,其实很多时候就写成A a = null;就可以了,但是很多人会直接new一个
20 楼 fool_leave 2010-11-05  
对,我也见过用汉字做名字的,好酷。
不过汉字就和编码有关系了。同样,不支持用汉字来写代码。用英语,这样你的代码让哪国人看都看得懂。
19 楼 chenlixun 2010-11-05  
抛出异常的爱 写道
Zahir 写道
skzr.org 写道
Thanks!

总结的非常棒啊
自己的一点想法,打算尝试下:
对于命名一直在纠结中,取名太费时间了
A 通用命名规则大家都差不多
B 从Action到用户这一端,直接使用汉语拼音命名!
C 用户的数据表,表名和字段也用汉语拼音

这样客户和英语不好的都可以看懂。



public class YongHuGuanLiAction {

    public String tianJiaYongHu() {
      //....
    }

    public String shanChuYongHu() {
     //....
    }

}



这样的代码你真的能忍?

不如用中文.....
ps 中文不支持代码提示.


难怪楼主有一种要死的冲动。还有人以用拼音命名的方法为荣?

“这样客户和英语不好的都可以看懂。”
这是给那些人看的吗?何况还有注释、文档。这也是理由?!
18 楼 cleanerje 2010-11-05  
fool_leave 写道
dir_murong 写道
Zahir 写道
skzr.org 写道
Thanks!

总结的非常棒啊
自己的一点想法,打算尝试下:
对于命名一直在纠结中,取名太费时间了
A 通用命名规则大家都差不多
B 从Action到用户这一端,直接使用汉语拼音命名!
C 用户的数据表,表名和字段也用汉语拼音

这样客户和英语不好的都可以看懂。



public class YongHuGuanLiAction {

    public String tianJiaYongHu() {
      //....
    }

    public String shanChuYongHu() {
     //....
    }

}



这样的代码你真的能忍?

哈哈  我是受不了



如果程序员连简单的单词都不知道,那还是去种菜吧。做程序员不懂英语,以后的路会很苦。
用拼音做名字,实际上很屎

其实,java用汉字做函数名也是可以的。
我之前做过一个生成报表方面的程序,因为翻译太麻烦了,用报表编码也看不懂,最后干脆用:编码_报表名(xxxxx)做函数名了
17 楼 抛出异常的爱 2010-11-05  
Zahir 写道
skzr.org 写道
Thanks!

总结的非常棒啊
自己的一点想法,打算尝试下:
对于命名一直在纠结中,取名太费时间了
A 通用命名规则大家都差不多
B 从Action到用户这一端,直接使用汉语拼音命名!
C 用户的数据表,表名和字段也用汉语拼音

这样客户和英语不好的都可以看懂。



public class YongHuGuanLiAction {

    public String tianJiaYongHu() {
      //....
    }

    public String shanChuYongHu() {
     //....
    }

}



这样的代码你真的能忍?

不如用中文.....
ps 中文不支持代码提示.
16 楼 zouzou 2010-11-05  
code review总是或多或少有些问题
15 楼 fool_leave 2010-11-05  
dir_murong 写道
Zahir 写道
skzr.org 写道
Thanks!

总结的非常棒啊
自己的一点想法,打算尝试下:
对于命名一直在纠结中,取名太费时间了
A 通用命名规则大家都差不多
B 从Action到用户这一端,直接使用汉语拼音命名!
C 用户的数据表,表名和字段也用汉语拼音

这样客户和英语不好的都可以看懂。



public class YongHuGuanLiAction {

    public String tianJiaYongHu() {
      //....
    }

    public String shanChuYongHu() {
     //....
    }

}



这样的代码你真的能忍?

哈哈  我是受不了



如果程序员连简单的单词都不知道,那还是去种菜吧。做程序员不懂英语,以后的路会很苦。
用拼音做名字,实际上很屎
14 楼 langyu 2010-11-05  
skzr.org 写道
Thanks!

总结的非常棒啊
自己的一点想法,打算尝试下:
对于命名一直在纠结中,取名太费时间了
A 通用命名规则大家都差不多
B 从Action到用户这一端,直接使用汉语拼音命名!
C 用户的数据表,表名和字段也用汉语拼音

这样客户和英语不好的都可以看懂。

请问这是“程序员杀手”教程么?
13 楼 dir_murong 2010-11-05  
Zahir 写道
skzr.org 写道
Thanks!

总结的非常棒啊
自己的一点想法,打算尝试下:
对于命名一直在纠结中,取名太费时间了
A 通用命名规则大家都差不多
B 从Action到用户这一端,直接使用汉语拼音命名!
C 用户的数据表,表名和字段也用汉语拼音

这样客户和英语不好的都可以看懂。



public class YongHuGuanLiAction {

    public String tianJiaYongHu() {
      //....
    }

    public String shanChuYongHu() {
     //....
    }

}



这样的代码你真的能忍?

哈哈  我是受不了

相关推荐

    网页右侧点击可展开收缩的在线QQ客服代码

    老生常谈的一款网页右侧在线客服代码,红色版本,其实在线客服代码都差不多,只是设计效果不同而已。懒人们可根据自己的网站设计样式使用

    C#,深度好文,精致好码,文本对比(Text Compare)算法与源代码

    C#,深度好文,精致好码,文本对比(Text Compare)算法与源代码 在日常应用中,文本比较是一个比较常见的问题。文本比较算法也是一个老生常谈的话题。 文本比较的核心就是比较两个给定的文本(可以是字节流等)之间...

    老生常谈JS中的继承及实现代码

    主要介绍了js中的继承及实现代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    【原创】C#导出数据到EXCEL方法谈(附实例源码和超级无敌详细讲解)

    C#导出数据到EXCEL表格是个老生常谈的问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,...

    重构_改善既有代码的设计

     当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,...

    老生常谈Python基础之字符编码

    我们知道,计算机只能识别二进制,我们平时写的代码都需要转成二进制才能被计算机识别。所以,我们写的字符怎么转换成二进制呢,这个过程实际就是通过一个标准使我们写的字符与特定数字一一对应,这个标准就称为字符...

    重构-改善既有代码的设计+中文版

    当对象技术成为老生常谈之后,尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与...

    重构改善既有代码的设计

    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与...

    重构-改善既有代码的设计

    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与...

    重构-改善既有代码的设计.chm

    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与...

    重构_改善既有代码的设计[高清版]

    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与...

    重构-改善即有代码的设计.pdf

    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与...

    重构-改善既有代码的设计(中文版)

     当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,...

    重构-改善既有代码的设计中文版

    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,...

    js老生常谈之this,constructor ,prototype全面解析

    javascript中的this,constructor ,prototype,都是老生常谈的问题,深入理解他们的含义至关重要。在这里,我们再来复习一下吧,温故而知新! this this表示当前对象,如果在全局作用范围内使用this,则指代当前页面...

    重构-改善既有代码的设计(中文版)

    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与...

    重构-改善既有代码的设计

    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与...

    老生常谈Bootstrap媒体对象

    下面小编就为大家带来一篇老生常谈Bootstrap媒体对象。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Global site tag (gtag.js) - Google Analytics