juicy0592 发表于 2009-2-28 11:12:21

Java之路(2)--写好你程序之共通基础规约

学习大多数语言刚开始的时候要接触到的东西都是差不多的。命名空间,访问权限,类,方法,属性,加减乘除的数学运算,接收键盘输入,输出到控制台。这些就是所谓的3天会走5天会跑7天会飞中能够学到的大部分的内容。学习了这些就可以开始编写一些程序,做一些联系,甚至紧急状况下顶一下,做一些低端的开发工作。当然,这篇文章并不是这些基础知识的教程,那些3天会走5天会跑7天会飞的教程网络上有很多,写得都挺好的,可以随便找一本来学习。而且笑着本人推荐先找一本这样的书来学习一下。整体了解一下这一门语言大概是怎么样的,可以快速的开始我们的第一个非HelloWord程序。
    这篇文章要讨论的,是关于高质量编程方面的。高质量编程将要贯穿我们的整个职业生涯,能在学习开始的时候有个不错的开始,那么对未来的发展将会产生不可估量的好处。高质量编程一般是从可读性,可靠性,高效率,代码结构,重用性,使用适当的底层功能等等方面来考虑代码是否优秀。学习了一门语言的基础语法时候,主要涉及到的就是代码的可读性,其他方面需要对一门语言的深入了解。目前一般讨论这些问题的书籍文章都是分开的,技术就是技术,技术OK了,站在一个较高的高度来回头学习高质量编程。但是这样的缺点就是习惯养成了不太好改,很多人就不会再重视高质量编程这方面的事情。而且习惯的养成需要时间,先学好技术,然后回头重视程序质量这并不是一个好的学习方式。但是要提高某方面的程序质量又必须有相应的技术基础,所以笑着这个系列的文章打算从另外一个角度,按照学习的不同阶段来慢慢涉及到高质量编程以及其他种种注意事项的方方面面。会在后面的文章中慢慢讨论。
    好了,下面我们来看看学会了Java的基础语法之后,我们应该,可以注意些什么。当然,所有的一切努力都是为了让您的代码美观,易读,高效,易维护。请牢记我们的目的,规矩不是死的,这里只是给出一些建议。事实上,每一个观点具体如何做好都曾经,或者还在引起广泛的讨论。笑着掌握的也许不是最新的。而且每个公司都会有自己的开发标准。适合自己的,才是最好的。记住我们的目的,其他人能够给你的,只是建议,参考。
    首先,是一些基础的规范。大家也许已经知道,简单介绍一下。
    1. 良好的命名。包括,
    a. 类,函数,变量的名称要尽量体现出其所具有的功能。单词之间用大小写,下划线等明确区分。
    b. 全局变量,局部变量,函数参数有明确的区分。比如函数的参数采用下划线开头的写法等。(一些编译器会自动采用不懂得颜色来帮忙区别,比如RAD)
    c. 常量与变量有明确区别,比如常量所有字符大写。
    d. 表明变量数据类型,比如nInput,strInput.这一点,曾经是C里面经典的规范,但是Java世界里这条规范没有引起太广泛的共鸣。就个人喜好来讲,小这是比较喜欢这个规范的。
    e. 尽量不要定义相同的类名。虽然不同的包下允许使用相同的类名,但是两个同样的名称为User类,会给自己带来不必要的麻烦。比如Java里面就有java.util.Date和java.sql.Date,这会给我们编程的时候造成困扰。所以不要认为不会出现这种情况。很容易,你就会“不小心”的定义两个同名的类。这多少是个设计上的问题,已经超出了基础的范围。
    2. 区分你的代码块儿。
    a. 把你的类的属性统一定义到类的开始或者结束的位置。现在应该很少人把类的属性跟类的方法穿插定义了。存在特殊情况,但是这里不想讨论。
    b. 把你的属性,或者方法,按照访问权限不同来顺序定义。比如先定义public的属性(这里是举个例子,原则上是不推荐定义public属性的),然后protected的属性,然后private的属性,然后public的方法……以此类推。之所以这样,是因为代码阅读的时候会更加关心接口部分,也就是public出来,公开给别人部分的代码会更加引起关注。
    c. 把同种类别的属性(方法)定义在一起,用换行来明确分隔。比如:
    // 用户信息
    private String a;
    private String b;
    private String c;
    // 业务信息
    private String d;
    private String e;
    private String f;
    不分块儿的话就会很难快。效果如下:
    private String a;
    private String b;
    private String c;
    private String d;
    private String e;
    private String f;
    d. 关于函数内使用的局部变量的定义,现在函数开始的地方统一定义,然后开始业务处理。这一条曾经争议非常大,因为存在另外一条矛盾的规则,尽量让你定义的变量保持最小的作用范围。不知道现在有什么结论。笑着的倾向是尽量遵守这个规则,但是可以根据具体情况将少量的变量定义在使用开始的地方。或则折衷一点每一个作用范围开始的地方定义所有的变量。这也许需要根据具体情况来采取不同的策略。
    e. 函数内每一段相对独立的业务逻辑结束之后用换行来分割一下。参照c.把同种类别的属性(方法)定义在一起,用换行来明确分隔。
    3. 适当的缩进,空格,对齐。
    a. 适当的缩进。现在编译器应该都提供这个格式化功能了。但是这里有一个问题,缩进,你是用4个空格好呢?还是用Tab好呢?知道我再说什么?不同的IDE对于Tab的长度的解释是不一样的,它默认是4个空格,但是有的IDE可能把它定义为8个空格,程序员可能有的时候用Tab,有的时候用4个空格。于是乎,当你换一个IDE来看统一份代码的时候……天下大乱了……
    b. 适当的空格,比如
    a=a 1;
    a = a 1;
    a = a   1;
    哪一种看起来比较舒服?最后一种被采用的比较多。第二种也不错。第一种?有可能你需要调整一下自己的审美观点以保持跟大众的审美观一致。
    c. 适当的对齐。一般出现在类的属性定义的时候。比如:
    对齐前:
    private String abc = “1”;
    private String abcd = “1”;
    private String abcde = “1”;
    对齐后:
    private String abc = “1”;
    private String abcd = “1”;
    private String abcde = “1”;
    有一些极端喜欢对齐的人存在。但是笑着个人观点,差不多就可以了。属性定义这里会非常有效果,其他的地方,自己看着办就好了。
   
                  
    4. 适当的列数。
    适当的列数。当一行代码太多会影响阅读。从前一般定义列数不要超过80,现在因为种种原因,也有定义到120的。跟这一条相关的一个规则就是不要在函数调用中欠套过多的函数调用。比如,下面是一个反面例子。
    g.draw(t.getText(s.getXXX(c.getXXX())));
    下面列举几个其他的常见的例子。
    例子1,函数参数过多。
    反:
    public void setXXX(String _param1, String _param2, String _param3, String _param4)
    正:
    public void setXXX(String _param1,
    String _param2,
    String _param3,
    String _param4)
    例子2,append
    反:
    s.append(a)。append(b) .append(c) .append(d)
    正:
    s.append(a)
    。append(b)
    。append(c)
    。append(d)
    意思一下,类似的状况很多。不在编译器里面代码格式调整比较费劲不多举了。
    5. 适当的行数。
    一个函数,一个类,应该提供相对单纯的功能。如果你的函数,类的行数超过了一定的范围。那么一方面会影响到阅读代码时对代码的理解。另外一方面,那么多行的代码,这里肯定包含了过多的业务逻辑,耦合性加大对你的维护会带来非常大的麻烦。
    6. 善用常量
    尽量用一些有意义的常量来代替无意义的数值。比如:
    if(status == 0){}
    就不如定义一个常量,比如int opened = 0; 然后
    if(status == opened){}
    7. 不要过多的嵌套逻辑分支控制,比如
    if(){
    if(){
    if(){
    if(){
    if(){
    }
    }
    }
    }
    }
    这样的代码会让人很难读懂你的程序。你自己回头也很难读懂自己的程序。发生错误的可能性,测试的复杂度也会相应大幅度增加。而且,嵌套这么多层的话,你本身对业务需求的理解肯定或多或少的出了一些问题。最多嵌套3层左右也许是个比较合理的选择。
    基础的,适用于任何开发语言的一些注意事项基本就是上面这么多。在基础之上,我们需要考虑一些语言特性。比如,
    int i;
    double a = 0;
    for ( i = 0; i < 10 ; i){
    a = a   0.1;
    if (a == 1){
    System.out.println("0.1加10次应该等于1" );
    }
    }
    这里期待值是0.1加10次应该等于1,但是实际上是不是这样的呢?这段代码预期值跟实际值是不是一样的呢?
    再比如String和StringBuffer,等等。
    作为结束,这里先举这个个例子。下一篇文章中会列举一些常见的语言特性相关的问题来讨论。好了,在进一步学习之前,我们可以把3天会走的教程扔掉了,去找一个详细介绍Java的书籍把基础打牢吧。
    顺便说一句,Java编程思想虽然是本好书,但是书里面更多的是面向C转Java程序员的论述,可以考虑适当的忽略,如果你就是要做Java,那些占了很大篇幅的论述对你可能不是那么的重要。    上一页
页: [1]
查看完整版本: Java之路(2)--写好你程序之共通基础规约