- 浏览: 524399 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
飞天奔月:
public List<String> gener ...
实践中的重构30_不做油漆匠 -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道public class A {
...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在世界的中心呼喚愛 写道在classB ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在classB的finalize上打断 ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
iteye比较少上,如果可以的话,可以发e-mail交流:ch ...
深入理解ReferenceQueue GC finalize Reference
注释一直是软件开发中的一个老大难问题。
代码中一个注释都没有是一种常见情况,给后来的开发维护带来巨大的成本。
代码中注释零零散散也是一种常见情况,这个依赖于程序员,有的程序员自觉的写上注释,有的觉得无所谓,干脆不写,有的在该写的地方写,不该写的地方省略,有的在不该写的地方写,该写的地方留白让后人抓狂。
系统大了,代码多了,公司一般都会出台一些强制性的代码规范,规范中自然少不了注释规范。于是,程序员为了满足代码注释规范,辛辛苦苦的添加了满屏的注释。
而实际上这种出发点是为了满足规范的注释是少有人看,也少有被看的价值。大家的关注点是在有没有注释上,而不是在注释的质量上。因为该注释被加上去的原因是规范需要,而不是代码或者程序员需要。这样的注释自然就少有人去精心维护。越是少有人去维护,注释和代码就越脱节,于是注释的价值随着时间的推移就更小了,一个恶性循环就这样华丽的诞生了。
有的注释为了满足规范写的很详尽,以为这样的注释就是好的注释。殊不知注释和代码一样,也是有质量的,也一样有可能散发一些不好的味道。
且看下面一个类的方法注释。
可以说这个注释已经很详尽了,每个方法都详尽的注释了上传文件的路径名的相关信息。
但是同代码一样,这段注释是有些不好的味道的。
方法注释中有重复的片段,而重复的注释意味着如果上传文件的目录规则改变的话,一大堆方法的注释都要改动。重复总是不好的。
OOP的最小构建单位是类,而不是方法。这句话不仅适用于领域对象,一样适用于工具类。通过抽取方法级别的详尽注释到类上,集中上传文件的目录规则,从而减少重复。
+1
多写为什么的注释代码
对于简单的代码可以这么做,不过复杂的操作还是必须介绍一下!
同意这个观点,但是一定的注释还是有必要的
恩,重构中也有这种观点,它把过多的注释也看成一种bad smell。尽量用良好的命名取代注释。
赞成你的说法。你看国外那些开源代码,那命名基本上一看就知道什么意思,然后再看一下参数,应该就很清楚了。
代码中一个注释都没有是一种常见情况,给后来的开发维护带来巨大的成本。
代码中注释零零散散也是一种常见情况,这个依赖于程序员,有的程序员自觉的写上注释,有的觉得无所谓,干脆不写,有的在该写的地方写,不该写的地方省略,有的在不该写的地方写,该写的地方留白让后人抓狂。
系统大了,代码多了,公司一般都会出台一些强制性的代码规范,规范中自然少不了注释规范。于是,程序员为了满足代码注释规范,辛辛苦苦的添加了满屏的注释。
而实际上这种出发点是为了满足规范的注释是少有人看,也少有被看的价值。大家的关注点是在有没有注释上,而不是在注释的质量上。因为该注释被加上去的原因是规范需要,而不是代码或者程序员需要。这样的注释自然就少有人去精心维护。越是少有人去维护,注释和代码就越脱节,于是注释的价值随着时间的推移就更小了,一个恶性循环就这样华丽的诞生了。
有的注释为了满足规范写的很详尽,以为这样的注释就是好的注释。殊不知注释和代码一样,也是有质量的,也一样有可能散发一些不好的味道。
且看下面一个类的方法注释。
/** * 上传文件帮助类。 * */ public class FillUploadHelper { /** * 得到一个用户上传文件的文件路径。 * * <pre> * 用户上传文件的文件路径为: * 最高一级目录\年月\年月日\用户userId的8-10位\5-7位\2-4位\文件名。 * 例如一个用户的id为0123456789,文件上传的日期为20110103,文件名为"allen.txt",则上传文件的文件路径为: * 最高一级目录\201101\20110103\789\456\123\allen.txt。 * </pre> * * @param userId * 用户id,10位。 * @param date * 上传文件的时间 yyyymmdd格式。 * @param fileName * 文件名。 * * */ public String getFilePath(String userId, String date, String fileName) { return null; } /** * 得到一个用户上传文件的目录。 * * <pre> * 用户上传文件的目录为: * 最高一级目录\年月\年月日\用户userId的8-10位\5-7位\2-4位。 * 例如一个用户的id为0123456789,文件上传的日期为20110103,则上传文件的目录为: * 最高一级目录\201101\20110103\789\456\123。 * </pre> * * @param userId * 用户id,10位。 * @param date * 上传文件的时间 yyyymmdd格式。 * * */ public String getFileDir(String userId, String date) { return null; } /** * 得到一个用户上传文件的用户目录。 * * <pre> * 该用户目录为: * \用户userId的8-10位\5-7位\2-4位。 * 如userId为0123456789,则用户目录为: * \789\456\123。 * </pre> * * @param userId * 用户id,10位。 * @return 用户目录。 * */ private String getUserDir(String userId) { return null; } /** * 得到一个用户上传文件的日期目录。 * * <pre> * 该日期目录为: * \年月\年月日。 * 如日期为20110103, 则日期目录为: * \201101\20110103。 * </pre> * * @param date * 上传文件的时间 yyyymmdd格式。 * */ private String getDateDir(String date) { return null; } /** * 得到用户上传文件的最高一级目录。 * * @return 用户上传文件的最高一级目录。 * */ private String getUploadDir() { return null; } }
可以说这个注释已经很详尽了,每个方法都详尽的注释了上传文件的路径名的相关信息。
但是同代码一样,这段注释是有些不好的味道的。
方法注释中有重复的片段,而重复的注释意味着如果上传文件的目录规则改变的话,一大堆方法的注释都要改动。重复总是不好的。
OOP的最小构建单位是类,而不是方法。这句话不仅适用于领域对象,一样适用于工具类。通过抽取方法级别的详尽注释到类上,集中上传文件的目录规则,从而减少重复。
/** * 上传文件帮助类。 * * <pre> * * 用户上传文件的文件路径分为4部分。 * * 系统配置的最高一级目录。uploadDir。 * 用户上传文件的日期目录dateDir,格式为\年月\年月日。 * 用户上传文件的用户目录userDir,格式为\用户userId的8-10位\5-7位\2-4位。 * 用户上传文件的文件名。fileName。 * * 例如系统配置的目录为\saveUpload,一个用户的id为0123456789, * 文件上传的日期为20110103,文件名为"allen.txt",则上传文件的文件路径为: * * \saveUpload\201101\20110103\789\456\123\allen.txt * * <pre> * */ public class FillUploadHelper2 { /** * 得到一个用户上传文件的文件路径。 * * @param userId * 用户id,10位。 * @param date * 上传文件的时间 yyyymmdd格式 * @param fileName * 文件名 * * */ public String getFilePath(String userId, String date, String fileName) { return null; } /** * get uploadDir+dateDir+userDir。 * * @param userId * 用户id,10位。 * @param date * 上传文件的时间 yyyymmdd格式 * * */ public String getFileDir(String userId, String date) { return null; } /** * get userDir。 * * @param userId * 用户id,10位。 * @return 用户目录。 * */ private String getUserDir(String userId) { return null; } /** * get dateDir。 * * @param date * 上传文件的时间 yyyymmdd格式。 * */ private String getDateDir(String date) { return null; } /** * get uploadDir。 * * @return 用户上传文件的最高一级目录。 * */ private String getUploadDir() { return null; } }
评论
19 楼
c.zhiwu
2011-03-23
这是代码和文档的同步问题,well design 的代码远比详尽的注释好
18 楼
mtnt2008
2011-03-22
Bruce.Sun 写道
关于注释我看了许多,我发现一个奇怪的问题,许多人写注释喜欢写what,但是不喜欢写why,很简单的一个列子,给一个变量赋值
a = 0,我看到过很多人的注释是“ //令a的值变为0”
但是对于我们程序员而言,很多时候这种注释对我们没什么帮助,我们更希望知道为什么要使a=0,对此修改会造成何种影响等等,至于a=0这句描述的是什么意思,我相信任何一个智商正常的人都看的明白的,也就是说这句注释是个累赘,拙见 哈哈
a = 0,我看到过很多人的注释是“ //令a的值变为0”
但是对于我们程序员而言,很多时候这种注释对我们没什么帮助,我们更希望知道为什么要使a=0,对此修改会造成何种影响等等,至于a=0这句描述的是什么意思,我相信任何一个智商正常的人都看的明白的,也就是说这句注释是个累赘,拙见 哈哈
+1
多写为什么的注释代码
17 楼
mercyblitz
2011-03-22
月落码农 写道
我的观点从来都是代码自注释,比如方法名,参数名,一个方法他自己应该告诉别人我是做什么的,而不是写上一段注释告诉别人我是做什么的。而且如果注释没有维护好,反而会误导别人,本来一开始你想放方法A做A,但是后来你把方法A改成去做其他了,注释没有相应的维护好,那么后面人就被你忽悠了。
对于简单的代码可以这么做,不过复杂的操作还是必须介绍一下!
16 楼
月落码农
2011-03-22
我的观点从来都是代码自注释,比如方法名,参数名,一个方法他自己应该告诉别人我是做什么的,而不是写上一段注释告诉别人我是做什么的。而且如果注释没有维护好,反而会误导别人,本来一开始你想放方法A做A,但是后来你把方法A改成去做其他了,注释没有相应的维护好,那么后面人就被你忽悠了。
15 楼
yangguo
2011-03-22
少写注释,多写自解释的代码。
14 楼
Bruce.Sun
2011-03-22
关于注释我看了许多,我发现一个奇怪的问题,许多人写注释喜欢写what,但是不喜欢写why,很简单的一个列子,给一个变量赋值
a = 0,我看到过很多人的注释是“ //令a的值变为0”
但是对于我们程序员而言,很多时候这种注释对我们没什么帮助,我们更希望知道为什么要使a=0,对此修改会造成何种影响等等,至于a=0这句描述的是什么意思,我相信任何一个智商正常的人都看的明白的,也就是说这句注释是个累赘,拙见 哈哈
a = 0,我看到过很多人的注释是“ //令a的值变为0”
但是对于我们程序员而言,很多时候这种注释对我们没什么帮助,我们更希望知道为什么要使a=0,对此修改会造成何种影响等等,至于a=0这句描述的是什么意思,我相信任何一个智商正常的人都看的明白的,也就是说这句注释是个累赘,拙见 哈哈
13 楼
chan.d
2011-03-22
其实注释是写给别人看,也是写给自己看。
12 楼
dsjt
2011-03-22
见过最蛋疼的注释就是:
1.在构造方法上加注释:
2. 在setter getter上加注释:
1.在构造方法上加注释:
/** * 无参构造方法 */ /** * 有参构造方法 */
2. 在setter getter上加注释:
/** * xxx的set方法 */ /** * xxx的get方法 */
11 楼
mercyblitz
2011-03-22
这不是注释的问题,注释越简明越好,注释拖拉不是注释的问题,而是方法操作比较复杂!
10 楼
sakajiaofu
2011-03-22
aws 写道
好的程序员写出的代码,直接看代码,看命名和逻辑和接口就会很清晰明了,不需要太多注释
没经验的程序员往往写出一堆逻辑乱七八糟,命名稀奇古怪,胡乱跳转的东西,这种加了再多注释也是枉然
没经验的程序员往往写出一堆逻辑乱七八糟,命名稀奇古怪,胡乱跳转的东西,这种加了再多注释也是枉然
同意这个观点,但是一定的注释还是有必要的
9 楼
hyj1254
2011-03-22
引用
好的程序员写出的代码,直接看代码,看命名和逻辑和接口就会很清晰明了,不需要太多注释
恩,重构中也有这种观点,它把过多的注释也看成一种bad smell。尽量用良好的命名取代注释。
8 楼
xiaoyaosheng86
2011-03-22
aws 写道
好的程序员写出的代码,直接看代码,看命名和逻辑和接口就会很清晰明了,不需要太多注释
没经验的程序员往往写出一堆逻辑乱七八糟,命名稀奇古怪,胡乱跳转的东西,这种加了再多注释也是枉然
没经验的程序员往往写出一堆逻辑乱七八糟,命名稀奇古怪,胡乱跳转的东西,这种加了再多注释也是枉然
赞成你的说法。你看国外那些开源代码,那命名基本上一看就知道什么意思,然后再看一下参数,应该就很清楚了。
7 楼
aws
2011-03-22
好的程序员写出的代码,直接看代码,看命名和逻辑和接口就会很清晰明了,不需要太多注释
没经验的程序员往往写出一堆逻辑乱七八糟,命名稀奇古怪,胡乱跳转的东西,这种加了再多注释也是枉然
没经验的程序员往往写出一堆逻辑乱七八糟,命名稀奇古怪,胡乱跳转的东西,这种加了再多注释也是枉然
6 楼
xhpscdx
2011-03-21
代码书写 ,整洁度,可读性。是看一个程序员好撇
5 楼
zhang_xzhi_xjtu
2011-03-21
这个属于类的spec了,所以我觉得放在类里面比较好,这个类应该包含使用该类的信息。
拖来拖去的问题,我的看法是这样的,如同我们使用类库一样,首先看的是类说明,然后才看方法说明。
当然放在测试类里面也是一个选择。
拖来拖去的问题,我的看法是这样的,如同我们使用类库一样,首先看的是类说明,然后才看方法说明。
当然放在测试类里面也是一个选择。
4 楼
sleepinglord
2011-03-21
测试类更好+1。
全都搁到类注释里,如果代码很长,你就得拖来拖去。
但我支持像lz那样,提供一个类的总体需求描述的方法。
全都搁到类注释里,如果代码很长,你就得拖来拖去。
但我支持像lz那样,提供一个类的总体需求描述的方法。
3 楼
抛出异常的爱
2011-03-21
这段注释写在对应的测试类中更好吧
而且工具放在工具类中静态化更好.
而且工具放在工具类中静态化更好.
2 楼
zhang_xzhi_xjtu
2011-03-20
多处零散的点集中到了一个,原本多处的改动只需要改动一处,这个就是进步。
规则如果小变,比如用户级目录从\789\456\123变为\89\67\45的话,改动的点是很少的。主要是把目录结构抽象成了概念而不是实现。
规则如果大变,整个类都变掉了,那么也是没有办法的。
规则如果小变,比如用户级目录从\789\456\123变为\89\67\45的话,改动的点是很少的。主要是把目录结构抽象成了概念而不是实现。
规则如果大变,整个类都变掉了,那么也是没有办法的。
1 楼
tenderuser
2011-03-20
感觉想法挺好的,但是下面的代码中的注释并没有很好的解决你上面提到的问题,如果系统规则变了 , 方法上的注释还是要改的。。。并且如果你在类级别上注释太多的话,感觉也是很麻烦。。
发表评论
-
实践中的重构32_使用标准的IO操作写法。
2012-07-14 18:42 1359看到这样一段代码,功能为读取一个指定文件的内容然后返回。 ... -
实践中的重构31_结果类两种实现的比较
2011-09-13 19:58 1068在查询接口结果类设计 ... -
实践中的重构30_不做油漆匠
2011-08-15 23:42 1232油漆匠的故事是编程文化中的一个著名故事。本地化如下。 小强毕业 ... -
实践中的重构29_不自动的自动化测试
2011-07-31 18:00 1036测试的精髓之一就是自 ... -
实践中的重构28_小心怀疑类库
2011-07-24 10:25 1038一般而言,类库的使用频率较高,场景较多,隐藏的bug就较少。 ... -
实践中的重构27_不要忘了内存空间
2011-06-06 18:31 1163方法在设计中,一般关注的是方法的功能契约,即方法需要什么样的参 ... -
实践中的重构26_奇怪的接口注释
2011-06-06 16:10 1330最近又看到奇怪的注释。 /** * 用户查询服务。 ... -
实践中的重构25_UT也需要持续重构
2011-05-01 11:20 957UT是个好东西,在对代 ... -
实践中的重构24_持续的方法重构
2011-05-01 02:20 1064很少有人可以一遍就写出好的代码。写代码和写文章差不多,大部分人 ... -
实践中的重构22_不要垃圾
2011-03-20 13:31 1038Java引入了GC当然很好,减轻了程序员手工管理内存的负担,但 ... -
实践中的重构21_给她一个好名字
2011-03-20 13:03 896名字的重要性实在是再怎么强调都不为过的。 为什么名字这么重要呢 ... -
实践中的重构20_一段可笑的异常处理逻辑
2011-03-06 20:32 1664Code review也是一个充满 ... -
实践中的重构19_脱裤子放屁
2011-03-03 23:17 2012每当看到代码中有一个 ... -
实践中的重构18_不对称的美
2011-02-26 22:30 968一般而言,自然界是以 ... -
实践中的重构17_表驱动法
2011-02-22 00:10 837代码以及初始的单元测试见 http://zhang-xzhi- ... -
实践中的重构16_多即是少
2011-01-16 23:44 1501在编写UT的过程中,随处可见重复,硬编码等等使得代码僵化的代码 ... -
实践中的重构15_null的意义和集合类作为方法结果类型
2011-01-12 22:16 629在编程中,估计null应该是一个很常写的词汇了。 实践中,经常 ... -
实践中的重构14_用方法设计保证正确性
2011-01-04 21:40 987一般来说,方法的调用方遵循方法的契约调用某方法来完成某功能。每 ... -
实践中的重构13_利用递归提高代码的可维护性
2010-12-30 01:38 721有这么一段代码,是用来解析国内的地址信息的。 AddressI ... -
实践中的重构12_不要乱用异常
2010-12-30 00:36 1466code review的时候,发现了如下代码。 /** ...
相关推荐
用于信号的EMD、EEMD、VMD分解_vmd重构_故障诊断emd_故障诊断_故障重构_VMD信号重构_源码.rar.rar
reconfiguration_配电网_配电网络重构_reconfiguration_配电网重构_配电网重构_源码.zip
提取MFCC参数,再由MFCC重构幅值谱,利用幅值谱重构语音。
对经验模态分解后的各分量IMF进行重构代码,函数可直接调用。
重构__改善既有代码的设计_高清 绝对清晰
mutual_information_相空间重构matlab_互信息熵_源码.zip
资源名:用于信号的EMD、EEMD、VMD分解_vmd重构_故障诊断emd_故障诊断_故障重构_VMD信号重构 资源类型:matlab项目全套源码 源码介绍:用于信号的分解、降噪和重构,实现故障诊断 源码说明: 全部项目源码都是经过...
牛顿拉普逊法就算配电网重构的潮流程序,结构清晰易懂。
PMSM_无传感器FOC_的单分流三相电流重构算法_01299a_cn
mutual_information_相空间重构matlab_互信息熵.zip
配电网重构是一个多目标、多时段、多组合、多约束的非线性优化问题。该问题的复杂性,决定了难以用单纯的数学方法得到满意的解。尝试用改进的遗传算法进行配电网络重构,建立评价函数,寻求该评价函数最优解
压缩传感重构算法中的子空间追踪算法,用于信号的重构
可重构密码_博士论文_COBRA1
重构——改善既有代码设计,经典文档,架构师必须教程
医学图像三维重构平台,实现了三维重构用VC++实现
reconfiguration_配电网_配电网络重构_reconfiguration_配电网重构_配电网重构.zip
数据信号处理matlab,程序实现压缩感知重构过程,仅供参考。
初中语文语文论文体验中转换拓展后重构__例谈鲸等常识性课文的教学