以下是笔者列举的Java开发人员的十大戒律:

一. 在你的代码里加入注释

每个人都知道这点,但不知何故忘记了遵守。算一算有多少次你“忘记”了添加注释?这是事实:注释对程序在功能上没有实质的贡献。但是,你需要一次又一次的回到你两个礼拜之前写的代码上来,可能一辈子都是这样,你一定记不住这些代码为什么会这样。如果这些代码是你的,你还比较的幸运。因为它有可能让你回忆起。但是不幸的是,很多时间,这些代码是别人的,而且很有可能他已经离开了公司。

二. 不要让事情复杂化

我以前就这么干过,而且我相信所有的人都这么干过。开发人员常常为一个简单的问题而提出一个解决方案。我们为仅仅只有5个用户的应用而引入EJBs.我们为一个应用使用框架而它根本不需要。我们加入属性文件,面向对象的解决方案,和线程到应用中,但是它根本不需要这些。为什么我们这样做?我们中的一些人是因为不知道怎么做更好,但是还有一些人这样做的目的是为了学习新的知识,从而使得这个应用对于我们自己来说做得比较有趣。

三. 牢牢记住“少即是多(less is more)”并不永远是好的

代码的效率是一伟大的事情,但是在很多情况下,写更少的代码行并不能提高该代码的效率。请让我向你展示一个简单的例子。

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陈述句中,难道不是更简单一些吗?现在,考虑下面的修正代

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”和两对多余的括弧。但是代码有了更好的可读性和可理解性。

四. 请不要有硬代码

开发人员常常有意识的忘记或者忽视这条规则,原因是我们,和一般时候一样,在赶时间。如果我们遵从这条规则,我们可能会赶不上进度。我们可能不能结束我们的当前状态。但是写一条额外的定义静态常量的代码行又能花费我们多少时间呢?

这里有一个例子。

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,对于这样一个应用,没有什么“控制”请求的。

六. 不要打印行和字符串相加

我知道,为了调试的目的,开发人员喜欢在每一个我们认为适合的地方添加System.out.println,而且我们会对我们自己说,会在以后删掉这些代码的。但是我们常常忘掉删去这些代码行,或者我们根本就不想删掉它们。我们使用System.out.println来测试,当我们测试完成以后,为什么我们还能接触到它们呢?我们可能删掉一行我们实际需要的代码,仅仅是因为你低估了System.out.println所带来的伤害,考虑下面的代码:

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秒。

避免这样一个CPU浪费的最好方法是引入一个包装器方法,就象下面这样:

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秒来运行。选择是显而易见的。

七. 关注GUI

不管这听起来有多么可笑,我都要再三地说明:GUI对于商业客户来说和功能和性能一样重要。GUI是一个成功的系统的必要的一部分。(但是),IT杂志常常倾向于忽视GUI 的重要性。很多机构为了省钱而不雇用那些在设计“用户友好”GUI方面有丰富经验的设计人员。Java开发人员不得不依赖他们自己的HTML知识,但是他们在这方面的知识十分有限。我看到过很多这样的应用:它们是“计算机友好”,而不是“用户友好”我很少很少能看到有开发人员既精通软件开发,又精通GUI 开发。如果你是那个不幸的开发人员,被分配去开发用户接口,你应该遵从以下的三条原则:

1、不要重复发明轮子。寻找有相似用户接口需求的已经存在的系统。

2、首先创建一个原型。这是非常重要的步骤。客户喜欢看看他们将要得到什么。这对你来说也是很好的,因为在你全力以赴而做出一个将要使用户生气的用户接口之前,你就得到了它们的反馈。

3、戴用户的帽子。换一句话说,站在用户的视角检查应用的需求。例如,一个总结页面到底要不要分页。作为一个软件开发者,你倾向于在一个系统中忽视分页,因为这样使得你有比较少的开发复杂性。但是,这对于从一个用户的视角来说却不是最好的解决方案,因为小结的数据将会有成百上千个数据行。

八. 永远准备文档化的需求

每一个业务需求都必须文档化。这可能在一些童话故事里才能成真,但是在现实世界却不可能。不管时间对于你的开发来说是多么紧迫,也不管交付日期马上就要到来,你永远都必须清楚,每一个业务需求是文档化的。

九. 单元测试、单元测试、单元测试

我将不会深入地讨论哪些什么是把你的代码进行单元测试的最佳方法的细节问题。我将要说的是单元测试必须要做。这是编程的最基本的法则。这是上面所有法则中最不能被忽略的一个。如果你的同事能为你的代码创建和测试单元测试,这是最好不过的事。但是如果没有人为你做这些事,那么你就必须自己做。在创建你的单元测试计划的时候,遵从下面的这些规则:

1、在写代码之前就写单元测试用例。

2、在单元测试里写注释。

3、测试一切执行“interesting”功能的公有方法(“interesting”的意思是非setters或getters方法,除非它们通过一种特殊的方式执行set和get方法)。

十. 记住质量,而不是数量。

不要在办公室里呆得太晚(当你不必呆的太晚的时候)。我理解有时,产品的问题、紧迫的最终期限、意想不到的事件都会阻止我们按时下班。但是,在正常情况下,经理是不会赏识和奖赏那些下班太晚的员工的,他赏识他们是因为他们所做产品的质量。如果你遵从了我上面给出的那些规则,你将会发现你的代码更加少的bug,更加多的可维护性。而这才是你的工作的最重要的部分。

总结

在这篇文章里,我给出了针对Java开发人员的十个重要的规则。重要的不仅仅是知道这些规则,在编码的过程中遵从这些规则更为重要。希望这些规则能够帮助我们成为更好的编程人员和专业人员。

转载于:http://developer.51cto.com/art/201103/252389.htm

必读!Java开发人员的十大戒律相关推荐

  1. Java开发人员的十大戒律

    对Java开发者来说,有许多的标准和最佳实践.本文列举了每一个开发人员必须遵从的十大基本法则:如果有了可以遵从的规则而不遵从,那么将导致的是十分悲惨的结局. 1.    在你的代码里加入注释 每个人都 ...

  2. 高级Java开发人员的十大书籍

    高级Java开发人员的十大书籍 Java是当今最流行的编程语言之一.有很多适合初学者的书籍.但对于那些使用Java编程一段时间的人来说,其中一些可能看起来多余.然而,高级Java书籍并不总是在眼前,不 ...

  3. 高级java开发_适用于高级Java开发人员的十大书籍

    高级java开发 Java是当今最流行的编程语言之一. 有很多适合初学者的书籍. 但是对于那些使用Java进行过一段时间编程的人来说,其中有些人看起来有些简单和多余. 初学者的书没有带来新鲜有趣的想法 ...

  4. 适用于高级Java开发人员的十大书籍

    Java是当今最流行的编程语言之一. 有很多适合初学者的书籍. 但是对于那些使用Java进行过一段时间编程的人来说,其中有些人看起来有些简单和多余. 初学者的书没有带来新鲜有趣的想法. 但是,高级Ja ...

  5. web前端angular_针对Web开发人员的十大Angular课程,教程和书籍

    web前端angular 大家好,如果您有兴趣学习Angular框架 (一种最流行JavaScript框架之一,用于开发基于组件的Web GUI并寻找一些很棒的资源,如课程,教程和书籍),那么您来对地 ...

  6. Web开发人员的十大最佳角度课程,教程和书籍

    大家好,如果您有兴趣学习Angular框架 ,这是最流行的JavaScript框架之一,用于开发基于组件的Web GUI并寻找一些很棒的资源,例如课程,教程和书籍,那么您来对地方了. 在本文中,我将分 ...

  7. php 编辑器格式输出_高效PHP开发人员的十大PHP开发工具

    图说:怎样选择最好的PHP开发工具 PHP是用于构建网站与Web应用程序最快,并且使用最广泛的服务器端脚本语言. 有几个很好的理由可以说明开发人员更喜欢PHP或一些其他的脚本语言,例如Python和R ...

  8. 一周极客热文:Java开发牛人十大必备网站

    新时代的学习不再是陈旧的课堂教学,而是个性化的学习,而网络自学也成为很多人的学习新方式,网站可以提供信息,以及一些很棒的讲座, 还能解答一般问题.面试问题等,质量是衡量一个网站的关键因素.日前,一个资 ...

  9. Html node.js开源项目,2020年面向开发人员的十大NodeJS框架

    Node.js 是一个基于 Chrome V8 引擎的,开源的,跨平台的 JavaScript 运行环境.事件驱动的.非阻塞 I/O 模型使 NodeJS 框架 能够开发极其轻便且高效的 Web 应用 ...

最新文章

  1. 关于Vue实例的生命周期created和mounted的区别
  2. 如何在 C# 中使用 RabbitMQ
  3. 从开发者角度谈Mysql主键
  4. maven项目发布到tomcat里lib包没有发布的问题
  5. .12-浅析webpack源码之NodeWatchFileSystem模块总览
  6. iOS - OC RunLoop 运行循环/消息循环
  7. mysql热备工具innobackupex参数详解
  8. Ubuntu 18.04安装: failed to load ldlinux.c32
  9. 抓取知网摘要、搜狗微信文章、搜狗新闻的爬虫
  10. 笔记本gtx1650最好用驱动_各型号笔记本显卡定位
  11. html飞机大战游戏实验报告,飞机大战实验报告.docx
  12. 从零开始配置腾讯云 CDN
  13. 6开机白苹果一闪一灭_我的苹果6p突然死机,一直出现白苹果又黑屏,反复出现,无法开机,请...
  14. rem与px之间的换算
  15. python下载b站视频_爬虫可以当是一个批量下载工具!用Python批量下载B站视频
  16. Pytorch预训练模型加载
  17. python判断数是整数还是小数
  18. 【Python】使用qrcode库实现某校校门口进校二维码实时刷新
  19. Android 添加微信分享三种实现方案
  20. 怎么转换AZW3格式?介绍几个AZW3转PDF工具给你

热门文章

  1. apache配置多https域名对应单个证书和多个不同的https域名对应多个不同的证书
  2. 未来已来——工作空间 WorkSpace 和物联网 IoT (1)
  3. The Importance of Money in Life
  4. Flex 布局实例教程
  5. javascript 商务通
  6. CALLBACKS IN C++ USING TEMPLATE FUNCTORS
  7. [转载]我的WCF之旅(3):在WCF中实现双工通信
  8. SQL Serever学习4
  9. 华为p20:拍美景,听讲解,旅行更智能
  10. 64位x86的函数调用栈布局