`
ariyue
  • 浏览: 337902 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

写好你程序之Java基础规约

    博客分类:
  • mind
阅读更多


    学习大多数语言刚开始的时候要接触到的东西都是差不多的。命名空间,访问权限,类,方法,属性,加减乘除的数学运算,接收键盘输入,输出到控制台。这些就是所谓的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,等等。
分享到:
评论

相关推荐

    ICE104规约Java解析源码

    ICE104Java解析源码,自己使用的,解析从站发送的遥信、遥测数据进行解析,自己可以在我的基础上写自己的处理代码。

    java开发规范拥抱易读代码

    在阿里规范的基础上整理了本公司的java代码开发规范,帮助学程序开发的同学,从最初的代码开始,规范自己的编码习惯,并不是读不懂的代码才是牛逼的代码,牛逼的代码是过了一个月或者更久,自己还能知道这是自己写得...

    java面试题目与技巧1

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题及技巧4

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题以及技巧

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    贪吃蛇java程序源码-humingk.github.io:个人博客

    贪吃蛇java程序源码 layout title post 博客导航 博客总目录,从这里快速找到你想看 (⊙o⊙) 博客导航 博客地址: 正则表达式相关 正则表达式就是那种,写的时候看文档,写完之后能用,过段时间看不懂,下一次写的...

    java面试题及技巧3

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题以及技巧6

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    魔法值是指程序中随意定义并赋值的变量值,如果代码编写者明白变量值意义是可以任意使用的,例如在代码中写if(status == 3) return error;符合规范。 C .如果变量值仅在一个范围内变化推荐用Enum类。 D .在程序...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...

    Ajax基础教程(扫描版)

    ajax为什么会这么热,它到底有什么奇妙之处?ajax是少数高手才能使用的尖端技术吗?如何用ajax开发全新用户体验的web应用,如何用ajax赋予原有应用新的生命?本书将给你满意的答案!  书中不仅详细讲述了如何结合使用...

    ZhiqimKernel即知启蒙内核,是Zhiqim Framework的核心,负责工程的生命周期管理

    ZhiqimKernel即知启蒙内核,是Zhiqim Framework的核心,负责工程的生命周期管理:包括工程开发和发布的目录结构管理、统一的配置规约、单多例服务接口定义、服务启动运行更新和销毁管理。并提供基础开发工具:包括...

    FreeMarker 手册

    文档规约................................................................................................................... 8 联系我们.....................................................................

    超完整FreeMarker中文教程,代码

    文档规约................................................................................................................... 8 联系我们.....................................................................

Global site tag (gtag.js) - Google Analytics