- 浏览: 538309 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
飞天奔月:
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 1446看到这样一段代码,功能为读取一个指定文件的内容然后返回。 ... -
实践中的重构31_结果类两种实现的比较
2011-09-13 19:58 1098在查询接口结果类设计 ... -
实践中的重构30_不做油漆匠
2011-08-15 23:42 1301油漆匠的故事是编程文化中的一个著名故事。本地化如下。 小强毕业 ... -
实践中的重构29_不自动的自动化测试
2011-07-31 18:00 1071测试的精髓之一就是自 ... -
实践中的重构28_小心怀疑类库
2011-07-24 10:25 1073一般而言,类库的使用频率较高,场景较多,隐藏的bug就较少。 ... -
实践中的重构27_不要忘了内存空间
2011-06-06 18:31 1198方法在设计中,一般关注的是方法的功能契约,即方法需要什么样的参 ... -
实践中的重构26_奇怪的接口注释
2011-06-06 16:10 1366最近又看到奇怪的注释。 /** * 用户查询服务。 ... -
实践中的重构25_UT也需要持续重构
2011-05-01 11:20 1075UT是个好东西,在对代 ... -
实践中的重构24_持续的方法重构
2011-05-01 02:20 1099很少有人可以一遍就写出好的代码。写代码和写文章差不多,大部分人 ... -
实践中的重构22_不要垃圾
2011-03-20 13:31 1074Java引入了GC当然很好,减轻了程序员手工管理内存的负担,但 ... -
实践中的重构21_给她一个好名字
2011-03-20 13:03 926名字的重要性实在是再怎么强调都不为过的。 为什么名字这么重要呢 ... -
实践中的重构20_一段可笑的异常处理逻辑
2011-03-06 20:32 1723Code review也是一个充满 ... -
实践中的重构19_脱裤子放屁
2011-03-03 23:17 2084每当看到代码中有一个 ... -
实践中的重构18_不对称的美
2011-02-26 22:30 1001一般而言,自然界是以 ... -
实践中的重构17_表驱动法
2011-02-22 00:10 874代码以及初始的单元测试见 http://zhang-xzhi- ... -
实践中的重构16_多即是少
2011-01-16 23:44 1527在编写UT的过程中,随处可见重复,硬编码等等使得代码僵化的代码 ... -
实践中的重构15_null的意义和集合类作为方法结果类型
2011-01-12 22:16 656在编程中,估计null应该是一个很常写的词汇了。 实践中,经常 ... -
实践中的重构14_用方法设计保证正确性
2011-01-04 21:40 1031一般来说,方法的调用方遵循方法的契约调用某方法来完成某功能。每 ... -
实践中的重构13_利用递归提高代码的可维护性
2010-12-30 01:38 748有这么一段代码,是用来解析国内的地址信息的。 AddressI ... -
实践中的重构12_不要乱用异常
2010-12-30 00:36 1547code review的时候,发现了如下代码。 /** ...
相关推荐
描述中的“幅值谱重构语音”指的是从MFCC中恢复出幅度谱,然后使用IFFT将其转换回时间序列。 **谱重构**是指根据频率域信息(如幅度谱或功率谱)重建原始信号的过程。在语音处理中,谱重构对于语音识别、语音合成...
在描述中提到的"对经验模态分解后的各分量IMF进行重构代码,函数可直接调用",意味着这个压缩包中包含了一个名为"EMDchonggou.m"的MATLAB脚本文件,该文件提供了实现IMF重构功能的代码。用户可以直接运行这个函数,...
《重构:改善既有代码设计》是一本由Martin Fowler所著的经典IT著作,它详细阐述了在软件开发过程中如何通过重构来提升代码质量、可读性和维护性。重构是一种系统性的方法,旨在不改变软件外在行为的前提下,改进其...
重构__改善既有代码的设计_高清 绝对清晰
在本文中,我们将深入探讨基于Matlab的压缩感知(Compressive Sensing,简称CS)重构算法的实现。压缩感知是一种理论先进的信号处理方法,它允许我们以远低于奈奎斯特定理所要求的采样率捕获信号,并能恢复原始信号...
在IT行业中,尤其是在医疗影像处理领域,三维重构技术扮演着至关重要的角色。"NewPrjName.rar" 是一个与三维医学图像重构相关的项目文件压缩包,它涉及到的是使用C++编程语言来实现这一复杂的计算过程。这个项目的...
资源名:用于信号的EMD、EEMD、VMD分解_vmd重构_故障诊断emd_故障诊断_故障重构_VMD信号重构 资源类型:matlab项目全套源码 源码介绍:用于信号的分解、降噪和重构,实现故障诊断 源码说明: 全部项目源码都是经过...
牛顿拉普逊法就算配电网重构的潮流程序,结构清晰易懂。
这个压缩包中的"第13章 MATLAB图像重构实战"可能包含了一系列的MATLAB脚本和函数,用于演示如何使用MATLAB实现fanbeam变换。这些脚本可能包括数据读取、预处理、fanbeam投影、反投影以及图像重构等步骤。在学习和...
经验模态分解(Empirical Mode Decomposition,简称EMD)是一种强大的数据分析技术,尤其...通过对这些资源的深入理解和实践,我们可以更好地掌握EMD技术,并将其应用到实际问题中,实现非平稳信号的有效分析和重构。
在图像处理领域,小波分析是一种非常重要的工具,它能够对图像进行多尺度、多分辨率的分析,从而在不同层次上提取图像特征。本项目主要关注的是使用...对于学习和研究图像处理的人员来说,这是一个很好的实践案例。
在电力系统领域,配电网重构是一项关键的技术,其目的是通过改变配电网络的...总之,配电网重构源码的获取为研究和实践提供了宝贵的工具,通过深入学习和应用,可以提升电力系统的运行效率,为智能电网的发展做出贡献。
压缩传感重构算法中的子空间追踪算法,用于信号的重构
文件"chonggou_29.6MB"可能是该书的电子版,包含了书中详尽的讲解和实例分析,对于想要深入理解重构技术的人来说,是一份宝贵的资源。通过阅读和应用书中的知识,开发人员可以将重构技巧运用到实际项目中,提升软件...
这个压缩包中的源码很可能是实现了以上步骤的MATLAB函数或脚本,对于学习和实践互信息和相空间重构的学者来说,这是一个宝贵的资源。用户可以通过阅读和运行这些代码,理解相关算法的原理,并将其应用到自己的项目中...
北理新源,TBOX项目RTT代码重构项目_BTFS_TBOX_RTT
用户重构0113_20160129094530.rp,用户系统重构产品设计,原型和设计
在IT领域,稀疏重构算法是信号处理和数据科学中的一个重要概念,特别是在压缩感知理论(Compressive Sensing, CS)中。压缩感知是一种革命性的理论,它表明,如果一个信号可以用较少的非零元素(即稀疏表示)来描述...