`
xiao_yi
  • 浏览: 395019 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java程序开发者需要了解的十大清规戒律

阅读更多

对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开发人员的十个重要的规则。重要的不仅仅是知道这些规则,在编码的过程中遵从这些规则更为重要。希望这些规则能够帮助我们成为更好的编程人员和专业人员。

 
分享到:
评论

相关推荐

    酒店服务经典案例-清规戒律.docx

    酒店服务经典案例-清规戒律.docx

    手机越狱方法

    这些软件或者是苹果商店因为某种理由而拒绝的(通常是因为违反了苹果的清规戒律)或者开发者没有MAC系统,也可能是作者拒绝付100美元 才能发布他们的作品。而越狱后就能够使用这些软件了。 iPhone的iOS与其他手机...

    1390 (最新清零程序).zip

    传统的1390打印清规程序,报错2000068 2000010 2000011报错,均可解决。2017年以后的EPSON 1390打印机均可使用,成功在WIN10下清零

    三星ML1670清规软件,100%成功

    很好,很强大,加粉的同学可以不用换芯片,节省成本

    基于matlab实现V2G系统simulink仿真图以及电动汽车充电和放电图.rar

    基于matlab实现V2G系统simulink仿真图以及电动汽车充电和放电图.rar

    共创在线考试系统(JSP+SERVLET)130223.rar

    共创在线考试系统(JSP+SERVLET)130223.rar,这是一个针对计算机专业学生的JSP源码资料包,旨在帮助学生更好地理解和掌握Java Web开发技术。该资料包包含了一个基于JSP和Servlet技术的在线考试系统,具有以下特点:功能齐全:该系统包括了在线考试、成绩查询、试题管理、用户管理等多个模块,能够满足学生进行在线考试的需求。界面友好:系统采用了简洁明了的界面设计,使得用户能够快速上手,方便地进行操作。代码规范:源码遵循Java编程规范,结构清晰,注释详细,便于学生学习和理解。可扩展性强:系统采用了模块化的设计思路,可以根据需要进行功能的扩展和修改。数据库支持:系统使用了MySQL数据库进行数据存储,可以方便地进行数据的增删改查操作。通过学习这个JSP源码资料包,学生可以掌握JSP和Servlet的基本用法,了解Java Web开发的基本流程,提高自己的编程能力。同时,该系统还可以作为学生课程设计或者毕业设计的参考项目,帮助他们完成学业任务。总之,这个共创在线考试系统(JSP+SERVLET)130223.rar资料包对于计算机专业的学生来说,是一个非常有价值的学习资

    医药集团能源集团汽车集团大型集团战略规划顶层战略设计方案PPT(4份)

    医药集团能源集团汽车集团大型集团战略规划顶层战略设计方案PPT(4份)

    基于matlab实现非常齐全的wsn定位matlaB仿真程序.rar

    基于matlab实现非常齐全的wsn定位matlaB仿真程序.rar

    matlab GPS与捷联惯导的组合导航程序,可以运行.rar

    matlab GPS与捷联惯导的组合导航程序,可以运行.rar

    3D模型009,可用于建模、GIS、BIM、CIM学习

    3D模型009,可用于建模、GIS、BIM、CIM学习

    大一C++作业,功能完善的学生成绩管理系统 支持信息的增删改补,虚拟信息生成,排序,硬盘数据的写入与读取.zip

    大一C++作业,功能完善的学生成绩管理系统 支持信息的增删改补,虚拟信息生成,排序,硬盘数据的写入与读取.zip

    毕业设计:基于SSM的mysql-软件缺陷管理系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_软件缺陷管理系统(源码 + 数据库 + 说明文档) 第2章 可行性分析 3 2.1技术的可行性 3 2.2经济的可行性 3 2.3操作可行性 4 2.4法律的可行性 4 第3章 需求分析 5 3.1开发工具需求 5 3.1.1开发语言和工具 5 3.1.2基于B/S结构开发 5 3.1.3 JAVA语言简介 5 3.1.4 JavaScript技术 6 3.1.5 MySQL数据库 6 3.1.7软硬件需求 6 3.2 系统需求 6 第4章 总体设计 8 4.1 系统模块总体设计 8 4.2 数据库设计 10 4.2.1 数据分析 10 4.2.2 数据库的详细设计 10 4.3 本章小结 12 第5章 详细设计与实现 13 5.1 管理员管理 13 5.1.1 管理员登录管理 13 5.1.2 欢迎页 13 5.1.3 项目经理管理 14 5.1.4 员工管理 15 5.1.5 用户登录日志管理 15 5.1.6 个人信息管理 16 5.2 项目经理管理 17 5.2.1 项目经理登录 17 5.2.2 项目管理 18 5.3 调试员端 1

    大型集团企业财务共享业财一体化应用平台建设方案.pptx

    大型集团企业财务共享业财一体化应用平台建设方案.pptx

    银行智能化数据安全分类分级实践方案.pdf

    银行智能化数据安全分类分级实践方案.pdf

    node-v6.10.1.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    知乎小程序算法.zip

    知乎小程序算法.zip

    基于嵌入式AI的人脸识别课堂签到系统.zip

    优秀源码设计,详情请查看资源源码内容

    基于matlab实现文档+程序边缘计算任务卸载与资源调度的算法,是论文的源代码,具有价值.rar

    基于matlab实现文档+程序边缘计算任务卸载与资源调度的算法,是论文的源代码,具有价值.rar

    毕业设计:基于SSM的mysql-软件学院互助答疑平台(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_软件学院互助答疑平台(源码 + 数据库 + 说明文档) 2 开发技术简介 13 2.1 基于B/S结构开发 13 2.2 JSP简介 13 2.3 MySQL数据库 13 2.4 JDBC 13 2.5 SSM框架 14 3 需求分析 14 3.1 需求分析 14 3.2 可行性分析 15 3.2.1 经济可行性 15 3.2.2 技术可行性 15 3.2.3 操作可行性 16 3.3 非功能需求分析 16 4 系统设计 17 4.1 数据库表设计 17 4.2 功能设计 18 5 系统详细设计 18 5.1 用户登录 18 5.2 问题发布 19 5.3 回答提问 20 5.4 用户资料 20 5.5 热门回答 21 5.6 最新回答 21 6 系统测试 22 6.1 调试目的 22 6.2 调试的主要内容 23 6.3 调试案例 23 6.4 测试方法 23 6.5 测试的重要性 24 6.6 不登陆测试 25 6.7 性能测试 25

    基于JSP技术的猎头公司管理软件的设计和实现-内部事务部分(源代码+论文).rar

    这个资料包名为"基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+论文).rar",是一个针对计算机专业学习者或开发者提供的实用资源。它涵盖了一个以Java Server Pages (JSP)技术为基础开发的猎头公司管理软件项目,专注于公司的内部事务处理。该软件旨在简化猎头公司的工作流程,提高工作效率,并使得管理工作更加系统化和自动化。资料包中包含了完整的源代码,这意味着用户可以直接查看、修改和部署这些代码来适应自己的需求。源代码的开放性为用户提供了学习和自定义的巨大空间,可以深入理解JSP技术在实际项目中的应用,以及如何结合数据库、前端页面设计和后端逻辑控制来构建一个完整的Web应用程序。除了源代码之外,资料包还附带了一篇论文,这篇论文详细阐述了软件的设计理念、系统架构、功能模块划分、关键技术点以及实现过程等。对于学生或研究者来说,这篇论文不仅提供了技术上的指导,还展示了如何将理论知识转化为实践操作的过程,具有一定的学术价值和参考意义。整体而言,这个资料包是计算机专业学生、软件开发者或对JSP技术感兴趣的人士宝贵的学习资源。无论是作为教学案例、课程项目,还是实际

Global site tag (gtag.js) - Google Analytics