技术开发 频道

Java开发者十大戒律


    【IT168 专稿】对于一名Java开发者来说,有许多编程规范和最优方法需要学习。本文概括了是个最为基本的十大戒律,以供每位Java开发者学习和遵守,如果不遵守的话,就会出现一些灾难性的结果。

    第一条:务必在代码中添加注释。
    这是每个人都知道的,但是并不是每个人都能做到,有时总是忘了执行这条戒律。你自己扪心自问,有多少次“忘了”添加注释了?的确,注释并不能实现你程序的任何有用的功能。但是,当你回头看你两个星期前写的程序的时候,你却想不起来这些代码真正想实现什么功能。如果这些代码是你写的话,那么你还是非常幸运的。在这种情况下,你或许能回忆起来。不幸的是,在大多数情况下,这些代码并不是你亲自写的,并且写这些代码的人已经不再在你现在的公司。俗语说的好啊,“己所不欲,勿施于人”。所以,要替他人着想,也替你自己着想,记住:往你的代码里添加注释。

    第二条:不要将事情复杂化。
    我以前干过这种事情,并且我也可以很负责人的说,所有人肯定也干过这种事情。开发者倾向于简单问题复杂化,本来一个很简单的问题,却拿出了很复杂的解决方案。我们为只有五个用户的应用程序却引进了EJBs。我们还为一些不需要框架的应用程序实施了框架。另外,我们给应用程序添加配置文件,面向对象方案,和线程,其实,这些应用简单的应用程序根本不需要这些复杂的东西。细想这些问题,我觉得是由于一下原因造成的:我们中的一些人是由于不知道怎么做才是更好的解决方案,所以被迫使用这些复杂的方案,而另外一些人是故意用的,他们想学习一些新的技术,满足自己的兴趣。对于那些不知道怎么做才是更好的解决方案的人来说,我建议他们向更有经验的程序员请教。而对于我们中的那些故意把应用程序设计复杂化,以满足自己的个人兴趣的人,我建议你们要更有职业道德,更加专业。

    第三条:“代码越少越好”并不是放任四海皆准的。
    没错,代码更加有效率,是一件重要的事情,但是,在许多的情况下,编写行数少的代码并没有提高你代码的效率。下面我举个简单的例子:
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"条件语句,但是代码更加易读和容易理解了。效率也没有差多少。${PageNumber}

    第四条:不要埋头coding,注意技巧。
    开发者通常会忘记或者故意忽略这一条,因为我们通常时间很宝贵,抓紧时间,勤勤恳恳编写代码。但是,如果你遵守这条戒律的话,或许能从这种忙绿的情况下解脱出来。用一行定义一个静态常量能需要你多长时间?
举个例子:
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"的时候,你可以引用A.S_CONSTANT
    _ABC,而不是记住实际的代码。同时,它还是很容易修改这个常量,而不用在你的整个代码中一一修改。 

    第五条:不要发明自己的框架。
    已经有上千种的框架,并且大部分都是开源的。这些框架已经是非常好的解决方案了,并且应经应用于上千种的应用程序。我们需要紧跟学习这些新的框架,至少不会犯大的错误。Struts就是一个使用广泛并且非常好的例子之一。对于基于web的应用程序来说,这个开源的框架是非常完美的。请不要拿出自己的Struts版,你的版本会很快消亡的。你应该牢记第二条:不要将事情复杂化。如果你的程序只有三个用户的话,请不要使用Struts,这种应用程序是不需要Struts的。

    第六条:慎用Print语句和字符串。
    我知道为了调试的需要,许多程序员喜欢添加到处添System.out.println语句。事先我们会告诉自己我们过一会把它删除掉。但是,我们常常忘了删除这些代码,或者我们不想删除这些代码。我们使用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); } }
    字符串是浪费cpu资源的另一原因。看看下面的例子:
public static void concatenateStrings(String startingString) { for (int i = 0; i < 20; i++) { startingString = startingString + startingString; } } public static void concatenateStringsUsingStringBuffer( String startingString) { StringBuffer sb = new StringBuffer(); sb.append(startingString); for (int i = 0; i < 20; i++) { sb.append(sb.toString()); } }
${PageNumber}

    第七条:注意GUI。
    当我说到这条时,无论你觉得有多么的可笑,我还是要再三重复的说。其实GUI和你程序的业务逻辑功能以及性能一样的重要。一个良好的GUI其实是一个好的应用程序的重要部分。IT经理通常会强调GUI的重要性。许多的公司为了节约人力成本,不去聘用具有设计友好界面经验的设计师。Java开发者不得不依靠特们自己的一点HTML技能和他们在友好界面设计领域的有限知识去设计界面。我看到许多应用程序,它们是“计算机友好”,并非“用户友好”。我很少能看到既精通计算机开发又精通GUI开发的人才。如果你是非常不走运,是一名需要设计应用程序界面的Java开发者,那么你要遵守一下三个原则:

    1 不要重蹈覆辙。模仿现存的、和你非常像的应用程序的界面。
    2 首先制作一个界面的模型。这是非常重要的一步。用户想看到他想要的应用程序是什么样子的。这对你来说这是一件好事,在你全力以赴的工作前需要知道用户们的输入。
    3.时刻替用户着想。换言之,就是从用户的角度检查你的需求分析。举个例子,一个一般的应用程序,可以先做一些页面也可以不做,作为一名软件开发者,对于一个不是很复杂的应用程序,忽略了一些页面并不是意见很容易的事情。但是,从用户的角度出发, 它需要解决上百行数据的应用程序,你所提供的解决方案或许不是最好的。

    第八条: 时刻准备着需求分析文档。
    每一个业务需求都需要用文档记录下来。无论你的开发时间是多么的紧迫,无论你的期限是多么的短,你必须时刻保证每一个业务需求都一一记录在案。

    第九条:单元测试,单元测试,还是单元测试。
    我并不想详细的说哪一种是最好的方法去单元测试你的代码。我仅仅想说明的是它是非常重要,务必要去做的一件事情。这是编程的最基本的法则。这条法则是无论如何也不能被忽略的。如果你的同事能为你的代码有制定和执行一个测试的计划的话,它将是一件很好的事情。但是,那是不可能的,你必须自己做单元测试。但你制定一个单元测试计划的时候,遵守一下规则:
    1 在写类之前先写单元测试
    2 在单元测试中获得代码注释
    3 测试所有的pulic方法(出了getters 和 setters方法)

    第十条:牢记:注意代码的质量,而不是数量。
    不要推迟项目完工的期限(当你不得不的时候又另说了)。我明白有时由于一些产品问题,紧迫期限,意外事件导致我们不能准时提交项目。但是,经理是不赏识和奖励那些停留在常见问题的员工身上,他们会赏识那些保证项目质量的员工身上。如果你遵循我上面总结的规则,你会发现你的代码很少有bug,并且是维护性良好的代码。这就是工作中最为重要的。

    结论
    这篇文章中,我讲述了十个Java程序员应该遵守的戒律。知道这些戒律并不是一件非常重要的事情,执行它们才是最为关键的。我希望这些戒律能够帮助你称为一名更好,更专业的Java程序员。
0
相关文章