三Don't原则

来源:互联网 发布:java中屏蔽敏感词汇 编辑:程序博客网 时间:2024/05/07 13:55

Don’t Repeat yourself!Don’t Repeat others!Don’t Repeat public!

最近一次code review发现了不少问题。结合前些日子写的东西,我再写一个小专题。
一个程序员的成长过程中应该独立做到三个Don’t:

Don’t Repeat youself!
这就是《程序员的修养》一书中提到过的DRY。我就不详细解释了。
犯错起因:
1.缺少对于软件修改和维护的考虑;(不是懒惰而是缺乏经验和意识)
2.懒惰;(这是最可恶的)
避免方法:
1.在每一次粘贴代码的时候,都思考一下重构可能性;
2.虽然俗话说“懒人都很聪明”,但是,明知道应该做而不去做的人称不上聪明。优秀的程序员应该十分愿意随时重构自己的程序。(重构的时候有测试代码来保证重构的正确性吗?)

Don’t Repeat Others!
通过代码,我可以很容易把项目组的人员分开来,根本不需要看注释中的作者。大家在编码上都有自己的风格和习惯。例如,在java中,对于字符串是否为空的判断有两种略有不同的做法
甲做法:
if ( strTmp == null || strTmp.equal(“”)) {
……
}
乙做法:
if(strTmp == null || “”.equal(strTmp)) {
……
}
(你觉得哪一种做法更好?我认为后一种,尽管第一种也不会出什么错。至于道理,并不是现在想说的)

上面例子的区别并不明显,令我忧虑的情况就是对于同样的逻辑,A程序员会写一个函数a,B程序员会写一个函数b。因为程序员的差异,函数编写的质量存在一定的差别。这样的现象破坏了整个软件系统的一致性,对软件系统的质量构成威胁。
犯错原因:
1.项目组开发人员之间缺少足够的交流;
2.项目leader对代码Rview的力度不够;
避免方法:
1.采取各种办法加强交流与学习,推荐方法两个:
    a)开发人员互相Review代码,通过Review的机会来互相学习和交流;
    b)项目leader在Review中注意此类现象。当发现的时候,在多种做法中找出最好的一种在开发人员中推广。
(开发人员应该以开放的心态去多看看别人编写的代码,思考为什么别人会和自己的做法不一样?谁的更好?代码Review不仅仅是Reviewer检查Reviewed的代码,其实Reviewer也在学习。我就是这样。从大家的代码中学到了不少东西。谢谢!)

Don’t Repeat Public!
这也是我本次Review中发现的一个大问题。

                Date initDate = new Date();
                int initYear  = initDate.getYear() + 1900;
                int initMonth = initDate.getMonth() + 1;
                int initDay   = initDate.getDate();
                String initMonthString = new Integer(initMonth).toString();
                String initDayString   = new Integer(initDay).toString();
                if (initMonthString.length() == 1) {
                        initMonthString = "0" + initMonthString;
                }
                if (initDayString.length() == 1) {
                        initDayString = "0" + initDayString;
                }

                String initDateString = new Integer(initYear).toString().substring(2)
                                + initMonthString + initDayString;

上面例子的作者是想得到一个形如“yyyy mm dd”的字符串。Java的sdk中,提供了SimpleDateFormat类来取得特定格式的日期。利用SimpleDateFormat,我们可以很简单就完成这段代码:

SimpleDateFormat sdfOperator=new SimpleDateFormat("yMMdd");
Date dToday        =new Date();
String initDateString =sdfOperator.format(dToday);


明明有现成的API,却不去使用。自己发明的算法不会有问题吗?
犯错原因:
1.对使用语言的不熟悉;
2.认为现成的API或者工具不好使,不如自己做;

避免方法:
1.第一个问题比较好解决,通过不断的工作去积累经验;
2.第二个问题就难了一点。“血气方刚”的程序员通常会有一点“傲气”,但是,当你打算舍弃现成的东西而要重新”make a new wheel”的时候,最好对自己是100%有信心。比较好的做法就是编写比较好的单体测试代码来证明自己的轮子“是圆的”!


总结:
在这三个问题中,第一个和第三个问题可以归结为个人问题,比较好解决。但是,问题2就不那么简单了。因为他强调的是开发团队的交流,这也正是决定项目能够成功的重要因素。
优秀的团队不仅仅是大家相处气氛是否和谐,思想和经验是否得到有效的传播才是气氛和谐的目的。无论什么时候还是让我们用“代码”来讲话吧!

原创粉丝点击