剑客
关注科技互联网

现代 Java 风格所具备的的元素

代码风格及其作用

编译器和解释器需要符合编程语言语法的正确语句,而人需要更多的信息来理解冰冷的机器指令。代码风格正好提供了这样的信息,它包括基本的文本格式、缩进以及短小的方法等。

风格同样适用于代表着最佳实践的设计模式,比如构建方法链、异常处理和同步等。具有良好风格的代码易于阅读,那感觉就像在阅读写得漂亮的散文一样。而易于阅读的代码意味着易于理解,意味着健壮,意味着更少错误,意味着开发者们的工作会更加愉快。

代码风格也能使代码库中的代码更具一致性。然而,有时会存在好多年不具有良好风格的代码,这种情况下,最好不要急于修改代码,而应该考虑先改善其风格。改善代码不能急躁,最好从较新的文件开始。接下来修改文件中需要修改的部分,比如产生BUG的代码,而不要动其它的地方。一旦某个文件的修改量达到了某个程度(比如75%),剩下的不具良好风格的代码就更容易改善了。

还有一点非常值得关注,现代集成开发环境(IDE)允许设置格式规则,这一点应该好好的利用起来。

现代Java代码风格的规则

简单,是代码风格最重要的一个方面,越简单的风格就越容易被记住和被应用。没有哪个开发者愿意去记忆上百条规则和数不清的特例。 有一个总体指导原则,通常被称为“软件开发的童子军规则”
这就是说,开发者应该让代码不段的变得更好,就像童子军以他们的信仰保持着营地。

代码格式

格式包括所有类型的约定,如基本外观、缩进、注释和括号应该放在哪里等。

一些最佳实践:

使用4个空格缩进代码。这即强调了文本的层次,又使得文本不会因为层次太多而被推得太远。使用空格进行缩进,不要使用制表符(Tab)。制表符不容易从空格中区分出来,但如果二者混用会引起一些麻烦,因为制表符的长度是由环境决定的。只使用空格就能保持一致的缩进长度。

较长的代码行应该以80、120或132个字符为右边界,并在这之前折行。80 作为边界时,双边对比或多路合并会看起来更好,同时它也会造成更多的折行。

使用空格、空行和注释使代码更容易阅读。

大括号

大括号一直是各种代码风格讨论的焦点,不过总的来说只有两个主要的流派:后置和对齐。这两种方式都有自己的优缺点,下面会进行说明。

后置大括号方式将左括号放在语句的右边,最后一个位置,而反括号会独自一行。对于一些关联的关键字(如 “else”  和 “if”),会放在与反括号相同的行。

if (condition) {
    statement;
} else {
    statement;
}

这种风格会减少代码的行数,这样一屏可以看到更多的代码行。不过由于信息被压缩,也可能降低可读性。而对齐的大括号会直接将括号放在行的最前。

if (condition)
{
    statement;
}else{
    statement;
}

这种风格会在关键字周围引入空行,因为括号换行了。这种风格下左右括号的位置是一致的,它们同是在同样的列位置上,同时也于语句的第一个字符对齐。

对齐的大括号使代码看起来更整齐划一,这个优势在括号之前的语句由于过长而折成多行的情况下尤其明显。

if (long condition with
    keyword and keyword and
    keyword and keyword)
{
    keyword;
}

如果采用后置的大括号风格,在上面示例的情况就需要在每个折行处多一层缩进,和括号内的执行语句区分开来。

在使用对齐的大括号风格时,格式化会自动对齐文本,使各项条件对齐,而不需要其它的格式规则或缩进。从这一点来说,推荐对齐的大括号风格。

命名规范

命名是编码中重要的一个部分——选择一个合适的名字,需要能表达其含义,并在其作用域和生命周期内都适用。

总体上,表述能力强的命名要优于简洁的命名,但是,通常要先考虑其作用域。作用域小的时候简短的命名更好,而长命名对于生命周期长的对象来说是合适的。

简短的或一个字母的命名用在自维护的循环中会很合适:

for (int i = 0; i < listSize; i++){
   if (condition)
   {
       sum += list.getItemAt(i);
   }
}

作用域大的变量需要更长也更具表达能力的名字:

private CommandProcessor sequentialCommandProcessor =
     new CommandProcessor();

这个变量可能会在类的各个地方都会用到,调用的不同位置可能不能同时在显示屏幕中展示。

sequentialCommandProcessor.init();
...
sequentialCommandProcessor.addCommand(...);
...
sequentialCommandProcessor.execute();
...
sequentialCommandProcessor.cleanUp();
...

一个具有表达能力的命名会减少花在推测变量意图的时间。上例中,长变量用驼峰大写连接单词,然而缩写时不要省略元音字母。首字母缩略词只有第一个字母需要大写,如parseXml()。

为保持整个代码库的一致性,请采用以下命名规范:

  • 类和接口的首字母大写。

  • 变量和方法的首字母小写。

  • 常量全大写,下划线分隔。

  • 包名用单个单词全小写。

编程设计中的亮点

惯例

编程惯例涵盖了诸如类型安全、声明和表达式、链式构造函数、异常处理、断言、并发、异步以及效率等方面的实现。

一些通用惯例:

  • 语句块用大括号括起来,即使语句块为空或者只有一行;如此可提供可阅读性,也可以在这些代码块将来发生变化时阻止一些问题的发生。

  • 用括号表明执行顺序。

  • 用多态来减少switch语句的使用,以及替换那些耗时且在循环中重复调用可以引起性能问题的结构。

  • 使用switch时,添加default的情况,并且在每个case 及default
    语句块最后添加break。

链式构造函数

对象的构造方法很常用,而且经常会用不同的参数来简化创建过程。这种情况下,不要写重复的代码,而是在每个构造方法中做尽可能少的任务,然后将剩余工作交给其他的构造函数。

public ChainedConstructor(){    // Common setup
    ...
}public ChainedConstructor(ObjectTypeA a){
    ChaintedConstrucor();    this.a = a;
}public ChainedConstructor(ObjectTypeA a, ObjectTypeB b){
    ChainedConstructor(a);    this.b = b;
}

异常处理

开发者最重要的事情之一就是要确保软件不会崩溃,即使是在发生意外的情况下也不能崩溃。在运行时,从无效的用户输入到网络中断,都会变成错误。正是因为这个原因,所有的潜在异常情况都必须被处理。

起码,运行时异常应该被日志记录。除非这个异常是非常罕见的,它在真实情况下从不发生,那么这个异常可以被忽略。

try
{
    ...
}

catch (IOException e)
{
    // Should never reach here
    logger.debug(“Unexpected I/O exception:”);
    logger.logStackTrace(e);
}

捕捉异常应该尽可能缩小异常的范围。不要在一个 try 块包装的范围内只捕捉 java.lang.Throwable 异常。一些异常比其他一些异常容易获取;最好不要把不可恢复的错误(如 java.lang.OutOfMemoryError)和可预期的异常(例如 java.lang.NumberFormatException 当把字符串转换成整形时)混在一起。

同步性

同步性保证在某个时刻只有一个线程可以访问一段特定代码或对象。在多线程环境下保证数据完整性有一个最重要的原则,为了达到同步的目的,应该分配并同步某个互斥对象。Java提供了一种机制将同步应用到类或方法,但这需要隐式或显式地使用类的实例对象本身作为同步对象。也就是说,对于类中所有同步的方法,只要线程锁定在其中某一个方法上,其它的方法就会被阻塞。

因此,为了防止意想不到的后果,总是使用一个 Object 对象,而不是当前对象(this)来作为同步锁对象。

private String fileLock = “token”;
public void writeDataFile(String data)
{
    synchronized(fileLock)
    {
        dataFile.write(data);
    }
}

public String readDataFile(int lineNumber)
{
    String result;
    synchronized(fileLock)
    {
        result = dataFile.read(lineNumber);
    }
    return result;
}

同步操作具有排它性,这会降低代码块的运行速度,所以应该只对可能造成线程冲突或数据损坏的操作使用同步。

小结

良好的代码风格是软件开发中一个重要的方面。明智而一致的使用良好的代码风格会使代码变得易读、易懂、易调试也更不容易出错。

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址