对Java开发者来说,有许多的标准和最佳实践。本文列举了每一个开发人员必须遵从的十大基本法则;如果有了可以遵从的规则而不遵从,那么将导致的是十分悲惨的结局。
1. 在你的代码里加入注释
每个人都知道这点,但不知何故忘记了遵守。算一算有多少次你“忘记”了添加注释?这是事实:注释对程序在功能上没有实质的贡献。但是,你需要一次又一次的回到你两个礼拜之前写的代码上来,可能一辈子都是这样,你一定记不住这些代码为什么会这样。如果这些代码是你的,你还比较的幸运。因为它有可能让你回忆起。但是不幸的是,很多时间,这些代码是别人的,而且很有可能他已经离开了公司。
2. 不要让事情复杂化
我以前就这么干过,而且我相信所有的人都这么干过。开发人员常常为一个简单的问题而提出一个解决方案。我们为仅仅只有5个用户的应用而引入EJBs。我们为一个应用使用框架而它根本不需要。我们加入属性文件,面向对象的解决方案,和线程到应用中,但是它根本不需要这些。为什么我们这样做?我们中的一些人是因为不知道怎么做更好,但是还有一些人这样做的目的是为了学习新的知识,从而使得这个应用对于我们自己来说做得比较有趣。
3. 牢牢记住——“少即是多(less is more)”并不永远是好的
代码的效率是一伟大的事情,但是在很多情况下,写更少的代码行并不能提高该代码的效率。请让我向你展示一个简单的例子。
<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>if(newStatusCode.equals("SD") && (sellOffDate == null ||
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
todayDate.compareTo(lastUsedDate)>0)) ||
(newStatusCode.equals("OBS") && (OBSDate == null ||
todayDate.compareTo(OBSDate)<0))){
newStatusCode = "NYP";
}
|
我想问一句:说出上面的那段代码的if条件想干什么容易吗?现在,我们再来假设无论是谁写出这段代码,而没有遵从第一条规则——在你的代码里加入注释。
如果我们把这个条件分到两个独立的if陈述句中,难道不是更简单一些吗?现在,考虑下面的修正代码:
<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>if(newStatusCode.equals("SD") && (sellOffDate == null ||
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
todayDate.compareTo(lastUsedDate)>0))){
newStatusCode = "NYP";
}else
if(newStatusCode.equals("OBS") && (OBSDate == null ||
todayDate.compareTo(OBSDate)<0))
{
newStatusCode = "NYP";
}
|
难道它不是有了更好的可读性?是的,我们重复了陈述条件。是的,我们多出了一个多余的“IF”和两对多余的括弧。但是代码有了更好的可读性和可理解性。
4. 请不要有硬代码
开发人员常常有意识的忘记或者忽视这条规则,原因是我们,和一般时候一样,在赶时间。如果我们遵从这条规则,我们可能会赶不上进度。我们可能不能结束我们的当前状态。但是写一条额外的定义静态常量的代码行又能花费我们多少时间呢?
这里有一个例子。
public class A {
public static final String S_CONSTANT_ABC = "ABC";
public boolean methodA(String sParam1){
if(A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){
return true;
}
return false;
}
}
现在,每一次我们需要和某一些变量比较字符串“ABC”的时候,我们只需要引用S_CONSTANT_ABC,而不是记住实际的代码是什么。它还有一个好处是:更加容易在一个地方修改常量,而不是在所有的代码中寻找这个代码
不要发明你自己的frameworks
已经推出了几千种frameworks,而且它们中的大多数是开源的。这些frameworks中间有很多是极好的解决方案,被应用到成千上万的应用中。你们需要跟上这些新frameworks的步伐,最起码是肤浅的。在这些极好的、应用广泛的frameworks中间,一个最好的、最直接的例子是Struts。在你所能想象到的frameworks中,这个开源的web frameworks对于基于web的应用是一个完美的候选者。但是你必须记住第二条规则——不要让事情复杂化。如果你开发的应用只有三个页面—请,不要使用Struts,对于这样一个应用,没有什么“控制”请求的。
6. 不要打印行和字符串相加
我知道,为了调试的目的,开发人员喜欢在每一个我们认为适合的地方添加System.out.println,而且我们会对我们自己说,会在以后删掉这些代码的。但是我们常常忘掉删去这些代码行,或者我们根本就不想删掉它们。我们使用System.out.println来测试,当我们测试完成以后,为什么我们还能接触到它们呢?我们可能删掉一行我们实际需要的代码,仅仅是因为你低估了System.out.println所带来的伤害,考虑下面的代码:
<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>public class BadCode {
public static void calculationWithPrint(){
double someValue = 0D;
for (int i = 0; i < 10000; i++) {
System.out.println(someValue = someValue + i);
}
}
public static void calculationWithOutPrint(){
double someValue = 0D;
for (int i = 0; i < 10000; i++) {
someValue = someValue + i;
}
}
public static void main(String [] n) {
BadCode.calculationWithPrint();
BadCode.calculationWithOutPrint();
}
}
|
根据测试,calculationWithOutPrint()方法的运行花了0.001204秒。相比较而言,运行calculationWithPrint()方法花了令人惊讶的10.52秒。
(如果你不知道怎么得到一个像这样的表格,请参阅我的文章“Java Profiling with WSAD” Java Profiling with WSAD)
避免这样一个CPU浪费的最好方法是引入一个包装器方法,就象下面这样:
<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>public class BadCode {
public static final int DEBUG_MODE = 1;
public static final int PRODUCTION_MODE = 2;
public static void calculationWithPrint(int logMode){
double someValue = 0D;
for (int i = 0; i < 10000; i++) {
someValue = someValue + i;
myPrintMethod(logMode, someValue);
}
}
public static void myPrintMethod(int logMode, double value) {
if (logMode > BadCode.DEBUG_MODE) { return; }
System.out.println(value);
}
public static void main(String [] n) {
BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);
}
}
|
根据测试,使用了StringBuffer的那个方法只花了0.01秒来执行,而那个使用了字符串相加的方法却花了0.08秒来运行。选择是显而易见的。
7. 关注GUI
不管这听起来有多么可笑,我都要再三地说明:GUI对于商业客户来说和功能和性能一样重要。GUI是一个成功的系统的必要的一部分。(但是),IT杂志常常倾向于忽视GUI的重要性。很多机构为了省钱而不雇用那些在设计“用户友好”GUI方面有丰富经验的设计人员。Java开发人员不得不依赖他们自己的HTML知识,但是他们在这方面的知识十分有限。我看到过很多这样的应用:它们是“计算机友好”,而不是“用户友好”我很少很少能看到有开发人员既精通软件开发,又精通GUI开发。如果你是那个不幸的开发人员,被分配去开发用户接口,你应该遵从以下的三条原则:
一、不要重复发明轮子。寻找有相似用户接口需求的已经存在的系统。
二、首先创建一个原型。这是非常重要的步骤。客户喜欢看看他们将要得到什么。这对你来说也是很好的,因为在你全力以赴而做出一个将要使用户生气的用户接口之前,你就得到了它们的反馈。
三、戴用户的帽子。换一句话说,站在用户的视角检查应用的需求。例如,一个总结页面到底要不要分页。作为一个软件开发者,你倾向于在一个系统中忽视分页,因为这样使得你有比较少的开发复杂性。但是,这对于从一个用户的视角来说却不是最好的解决方案,因为小结的数据将会有成百上千个数据行。
8. 永远准备文档化的需求
每一个业务需求都必须文档化。这可能在一些童话故事里才能成真,但是在现实世界却不可能。不管时间对于你的开发来说是多么紧迫,也不管交付日期马上就要到来,你永远都必须清楚,每一个业务需求是文档化的。
9. 单元测试、单元测试、单元测试
我将不会深入地讨论哪些什么是把你的代码进行单元测试的最佳方法的细节问题。我将要说的是单元测试必须要做。这是编程的最基本的法则。这是上面所有法则中最不能被忽略的一个。如果你的同事能为你的代码创建和测试单元测试,这是最好不过的事。但是如果没有人为你做这些事,那么你就必须自己做。在创建你的单元测试计划的时候,遵从下面的这些规则:
一、在写代码之前就写单元测试用例。
二、在单元测试里写注释。
三、测试一切执行“interesting”功能的公有方法(“interesting”的意思是非setters或getters方法,除非它们通过一种特殊的方式执行set和get方法)。
10. 记住—质量,而不是数量。
不要在办公室里呆得太晚(当你不必呆的太晚的时候)。我理解有时,产品的问题、紧迫的最终期限、意想不到的事件都会阻止我们按时下班。但是,在正常情况下,经理是不会赏识和奖赏那些下班太晚的员工的,他赏识他们是因为他们所做产品的质量。如果你遵从了我上面给出的那些规则,你将会发现你的代码更加少的bug,更加多的可维护性。而这才是你的工作的最重要的部分。
总结
在这篇文章里,我给出了针对Java开发人员的十个重要的规则。重要的不仅仅是知道这些规则,在编码的过程中遵从这些规则更为重要。希望这些规则能够帮助我们成为更好的编程人员和专业人员。
分享到:
相关推荐
酒店服务经典案例——清规戒律,主要探讨的是在酒店行业中如何制定并执行服务规范,以及员工素质和服务灵活性的重要性。案例一中,一家新开业的酒店由于服务规范不完善,导致了与日本客人的沟通障碍。酒店要求客人...
这些软件或者是苹果商店因为某种理由而拒绝的(通常是因为违反了苹果的清规戒律)或者开发者没有MAC系统,也可能是作者拒绝付100美元 才能发布他们的作品。而越狱后就能够使用这些软件了。 iPhone的iOS与其他手机...
- 此处“清规戒律”可能是指朝廷新近推行的一些法令制度,或是对士人行为规范的新要求。这反映出当时社会正在经历某种变革或转型期。 - 诗人感觉自己虽然满腔热血,却难以有所作为,这种无力感与其登楼时的豪情...
而“清规戒律”则描绘了店主对于顾客挑选习惯的理解,但作者的选择打破了这一常规,表达了即使面对普遍的“规则”,我们也应该有自己的判断和选择。 文章中划线句子揭示了作者的处世哲学。张晓风认为,在生活中不必...
传统的1390打印清规程序,报错2000068 2000010 2000011报错,均可解决。2017年以后的EPSON 1390打印机均可使用,成功在WIN10下清零
很好,很强大,加粉的同学可以不用换芯片,节省成本
2. 清规戒律:酒店前厅的规章制度是提供优质服务的基础,员工需严格遵守,以确保服务的专业性和一致性。 3. 开房的抉择:合理安排房间资源,避免重复预订导致的客诉,需精准掌握预订信息。 4. 客人不肯付账离去:...
5. 成语运用:成语“出奇制胜”、“削足适履”、“清规戒律”、“焕然一新”的正确理解和使用,以及在具体语境中的得当性。 6. 病句辨析:分析并改正句子中的语病,例如句子结构不完整、关联词使用不当等问题。 7....
"基于《Java高级编程语言》的“五主”教学法探讨" 基于《Java高级编程语言》的“五主”教学法探讨,旨在解决职业技术院校学生职业技能培养的教育教学方法问题。本文通过对传统教学方法进行组合优化,提出了“五主”...
3. 成语运用:题中提到了成语的正确使用,如“清规戒律”、“耳旁风”、“厝火积薪”等,成语的运用考察了学生对成语含义、用法和语境适应性的理解。 4. 语病判断:题中包含了一个判断语病的题目,要求识别正确的...
5. 清规戒律:提醒员工严格遵守服务规程,以避免因不规范操作引发的问题。 6. 处理客人信件的失误:讨论了信件处理不当可能带来的后果,及如何预防和弥补错误。 7. 客人拒付房租:面对客人拒付的情况,展示了如何...
- “清规戒律”常用来形容佛教徒的规则,也比喻严格的规定,这里用来形容中央的八项规定,是合适的。 - “七月流火”出自《诗经》,原指农历七月天气渐凉,这里被误用为夏季过去的标志。 - “了如指掌”形容对...
4. 成语运用:成语填空题(第4题)考察成语理解及恰当运用,例如“金科玉律”和“清规戒律”分别表示不可改变的规则或行为准则,“不翼而飞”和“不胫而走”形容事物突然消失,“畏首畏尾”和“畏缩不前”形容做事...
- **清规戒律**:泛指束缚人的规章制度,通常含有贬义。 17. **不约而同** vs **不谋而合**: - **不约而同**:没有约定而行动一致,侧重于行动上的巧合。 - **不谋而合**:想法或行动不谋而合,强调观念上的...
例如,汉字拼音的正确读音(如“癣”、“酵”、“拈”的读音),词语的正确使用(如“清规戒律”、“侦察”与“侦查”的区别、“富余”与“富裕”的含义辨析),以及成语的理解和应用(如“得陇望蜀”、“轻描淡写”...
- 11题考查成语替换,A选项中的“金科玉律”不能被“清规戒律”替换,因为后者含有贬义,改变了原句的意思。 以上就是基于题目内容分析出的行政职业能力测试的相关知识点,主要涵盖了语文素养、逻辑推理和社会现象...
清规戒律表明,酒店服务人员必须熟知并遵守各项规章制度,确保服务质量。面对突发状况,如客人突然来访,员工应保持冷静,妥善应对。成功转化客人情绪,如从怒转喜,是处理投诉的关键。巧妙推销豪华套房展示销售策略...
他因打死恶霸镇关西而被迫逃亡,最终在五台山出家,却因难以忍受清规戒律而流落江湖。在大相国寺,他倒拔垂柳,收服泼皮,结识林冲,展示了他豪迈而不拘小节的性格。在林冲被陷害后,他一路护送,体现了他的忠诚和...
- 题目中提到的成语如"耸人听闻"、"无所不至"、"清规戒律"、"语焉不详",需要理解成语的准确含义并判断其在句子中的适用性,这是成语理解和运用的基础知识。 4. 病句辨析 - 题目要求找出没有语病的句子,如选项A...
3. 成语运用:题目中提到成语的恰当使用,如"削足适履"表示不合理的迁就,"出奇制胜"意为用奇招取胜,"清规戒律"常用于贬义,指过于严格的规矩。这要求学生理解成语的含义和适用语境。 4. 语病判断:题目考察了语病...