JavaEE编程规范(中级)_第1页
JavaEE编程规范(中级)_第2页
JavaEE编程规范(中级)_第3页
JavaEE编程规范(中级)_第4页
JavaEE编程规范(中级)_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/开发编程规范J2项目一般是大型项目,大型项目都需要团队协作开发。团队协作开发的成功需要一致的开发规范。对软件进行后续的维护成本远远要大于它最初的开发成本,保证开发的系统是可持续工作易于维护就至关重要了。可靠的设计原理实践及一个良好的编程规范在整个J2项目生命周期中变得十分重要。在团队开发中,应该保持所有的代码上都乎合-1-一个相同的标准,并且代码在风格上应该保持一致。

编程标准为什么会显得这么重要呢?我们经常会发生这样的情况:太注重于j2的某方面的技术细节,而乎略了良好的程序设计和编程习惯。太多的J2项目的失败就是因为在项目中含有太多草率的代码,使得整个系统变得脆弱、不可维护,最终只得放弃整个项目。关于编程规范,它是一个巨大的领域。在这里不作详细的阐述。这里只列出了在实际J2开发中十分重要的问题进行讨论,同时对这些问题有不同的见解和解决方法。一切都应该以实践为主。不要去发明自己的标准几乎每一门编程语言都有自己的一套编程标准,但是千万不要去发明自己的编程标准。

是一门简单的语言,我们应该以的编程标准作为准则。在它的基础上进行扩充。比如语言使用的匈牙利命名法,并不适合用于在。也千万不要在一种开发语言中使用另外一种开发语言的编程标准。类中代码的组织结构

1.按照方法的功能,而不是按照方法的可访问性来组织方法。

比如:不是把所有的方法放在方法的前面,而是把一个方法放成使用它的那些方法的附近。

2.类的组织约定

静态变量和方法。

成员变量。

构造函数。

接口的实现方法,连同支持它们的私用方法

该类独有的公有方法(不包括已实现接口的公用方法)。

抽像保护方法

提供给子类使用的保护方法

及前面任何一组都无关的实现方法。按职责进行分类,做你该做的事情!

每一个类应该具有一个明确的职责,不要把它相干和不相干的代码都填进来。那些不相干的代码应该重构为另一个单独的类或者是助手类。如果一个不同概念级别上的代码对相同的对象重复调用,那么它可能需提升为一个父类。而其它对象通过继承这个父类。

通过把相干的重复代码提取到父类和把不相干的代码重构为一个助手类是解决代码重复的常用方法。

这样可以阻止一个类的爆炸式增长,变成一个臃肿的类。一个类,包括和内部注释,如果超过了500行代码,它都是需要重构的候选者。因为它可能已经承担了太多的职责。可以运用策略模式来用一个接口把原类及助手类分开,实现助手类在不同的情况可以有不同的实现。来提高系统的灵活性。

每一个方法都应该具有一个单一而清晰明确的职责。否则这个方法应该进行重构。同时这也可以防止方法变得很长。 (){ ="00000000";读取 =()() (,); ; =(); =""; =(); (()>2){ =(0,2); } = +(0,()-) +; ()设置主键 (,)插入柜面数据 ; }

上面的方法是新增一个柜面信息,它有三个步聚:

1.读取指定的,获得一个唯一柜面流水号

2.根据柜面的机构代码和流水号产生一个唯一8位的柜面号,柜面号由两位的机构代码+6位的流水号组成。流水号不足6位,在前面以0补充。

3.设置柜面信息的柜面号为新产生的柜面号,并插入数据库,成功则返回新的柜面号。

重构后的代码:读取,获得流水号 (){ ()()( ,); }根据机构代码来生成柜面号 () { ="00000000"; =(); ; =(); =""; (()>2){ =(0,2); } = +(0,()-) +; ; }新增柜面 (){ =; =(())产生主键 ()设置主键 (,)插入柜面数据 ; }重构后的代码大大的便于阅读和维护。使方法具有明确的责任。

注意在重构的时候,通过我们把那些相对独立的任务变成一个私有的方法。

关于一个方法应该限制为多长,没有明确的规定。它应该以人的舒服度为主。一个方法包括注释(不含)的实现代码能够在一屏中可以进行阅读。否则它就应该需要进行重构。一般来说,一个方法的代码控制在30-40行是最佳的。

四、避免重复的代码

在一个类中,可能在各个方法中产生了相同的代码块。这就是重复的代码。重复的代码是难以维护和难以理解的。

有一个类其中有两个方法如下:发送一个包裹 () { =() (); =()( ,"00");………… }根据包号得到包信息 () { =() (); =()( ,"00");……… }

这似乎没有任何问题,但是这样的代码重复可能会导致严重的问题。

1.太多的代码:如果重构后只用两行就可以了

2.令阅读者迷惑不解,阅读者可能会对开发人员产生怀疑,认为这两处是两个不相同的代码,从而去进行比较,花费更多的时间和精力。

3.造成修改的不一致,经常可能发现对一个方法进行了修改,而忘记也应该对另一个方法也进行相同的修改。增加代码的维护量。

修改后的代码: (); (){ =() (); ; } (){ =().().( ,"00"); ; }发送一个包裹 () { =(); }根据包号得到包信息 () { =();……………….. }

五、最小的作用范围和权利

成员变量和方法通常应该拥有尽可能小的可见度(包括和缺省的变量和方法)。变量应该尽可能局部地进行声明。

1.绝不使用成员变量

2.成员变量首先考虑为。避免使用的成员变量,唯一的例外可能是声明为的成员变量。

成员变量声明为是可能需要提供给子类使用,但是这样同样也破坏了类的封装性。更好一点的做法是把成员变量声明为的。并提供一个的方法供子类调用,在这个方法中返回的成员变量。

3.一个类只应该有它所实现接口的公有方法和必要的成员变量的和方法以及这个类提供给外部访问的方法声明为。其它的统统为或

4.一个类的方法需要提供给子类有不同的实现而进行重写,或者需要把实现交给子类去完成应该声明为。其它的统统声明为尽可能的把方法隐藏起来,,默认的方法;方法越少这个类就越简洁。就更便于使用,测试和重构。

虽然方法的调用不像对成员变量的直接访问那样危险。但是尽可能的降低方法的可见度在于:降低了类之间的耦合度。把一个类的外在需求及一个类的实现逻辑分开来是十分有必要的。这既可防止这个类的内部状态遭到意外的破坏,同时也简化开发人员处理这个类的任务。通常只提供他们所需要的方法。

5.变量应该尽可能的在使用它的地方声明。

作用范围内的变量越少,可阅读性就越高,也更加便于调试。杜绝使用C语言或的变量声明方式(变量在方法的开始处声明)

六、关键字的使用

是一个中经常使用的关键字,但是我们也经常忘记使用而使得在访问两个变量时造成意外的错误。

下面的方法将会被编译通过,而并没有给成员变量赋值 ; (){ =; }还有另外的一种形式也会被编译通过(在录入方法参数时候可能输错某个字母) (){ =; }

在上面的两种情况中,假如没有什么方法对进行初始化,那么在运行的时候出现莫名其妙的空指针异常。

在第一个方法中把方法参数赋给方法参数自身,在第二方法中把成员变量赋给成员变量自身。除了没有达到预期的效果外都还会造成空指针异常。并且这种错误在编译时都能正常通过。

建议:采用下面良好的习惯来避免上面出现的错误:

1.访问成员变量总是使用关键字。这样使得我们总是给期望的成员变量进行访问。而解决变量的多议性。 (){ =; }

2.给方法参数赋予一个有意义或有区别的名字(不要使用_下划线来命名变量,只有常量才使用下划线.正确的反映参数的用途或代表的意义,并且避免了我们刚才见过的问题 (){ =; }

3.局部变量名变该相对短而成员变量名应该相对冗长。例如,I应该是一个变部变量,

应该是一个成员变量。

通常,成员变量名以一个小写字母开头的接口或类名,而局部变量名应在当前的上下文环境中代表它的含议。 ; (){ =(); }七、不要使用字面常量

除了一些大家都明白的如0值,空值,和空串””外,不要在代码中使用字面常量

(){ (() ()()>100){ (,"物品数量超过了上限,请您将物品数量控制在100件以内"); } }

看上面的例子。无耐的是,我们经常在j2项目中大量出现这样的代码。

1.这样的代码没有明确的意义。必须被迫阅读代码来猜测100的含义。

2.代码容易出错,我们必须被迫比较不同的字面值来确信它们是相同的,而且我们很容易错误的输入。

3.修改100这个常数时,可能需要修改多处。

比较好的做法是使用一个常数,在中意味作使用的变量. =100; (() ()()>){ (,"物品数量超过了上限,请您将物品数量控制在100件以内"); }

一般情况下,这已经了。但是在有些情况下它仍然不够好,假如对于每次发送的物品数量限制并不是总是相同的,今天的常量,在明天可能就是一个经常变化的变量。

可能下面的版本会更灵活一些: =100; (){ ; } (() ()()>()){ (,"物品数量超过了上限,请您将物品数量控制在”++”件以内"); }

这样我们可以把对物品数量的控制延迟到子类进行,子类可以通过重写()方法来灵活控制。

如何设计一个常量,可以有下面的标准来进行参照:

1.如果字面常量应该是代码中的一部分,不应该使用常量变量或方法。

比如:语句。语句本身就应该是代码的一部分,所以不应该再它们声明一个常量。

2.永远都不会变化的常量或者变化的可能性相当少的常量,声明为的常量。

例如:在所有应用服务器都相同的名。

3.在编译时可能会发生改变的常量,声明子类可以重写的的方法。

例如:在应用服务器中可能需要变化的名,如的名称

4.在运行时可能会发生改变的常量,声明一个方法.

例如:物品数量限制

5.受国际化影响的常量,声明一个的方法。

例如:根据不同的信息,需要显示不同的错误信息或语言

这个方法返回一个从中查找的值。

八、内部类和接口

在中使用内部类和接口可以避免命名空间污染,内部类通常用来帮助外部类有一个一致的责任。除非进行编程,尽可能的少用匿名内部类。而使用一个有类名的内部类会带来更多的好处。比如可以使用构造函数。

使用内部类不能够实现代码重用。会导致重复代码的产生。在使用的时候要进行权衡。

九、关键字

1.方法重写及方法。

方法重写可能违反“理氏代换原则”和“开闭原则”。使用方法有助于保证类的完整性。确保一些关键性的方法不让子类去重写。保证系统的安全性。

比如:需要调用一系列的()方法。而这些方法都是十分重要的。

任何重写都可能会导致破坏系统的行为

通常的做法声明一个()的空方法。没有任何代码。

在()方法的最后调用()这个空方法。

而子类可以去重写()这个方法来扩展功能,而又不破坏父类

2.类

只有能够保证永远不变的对象才使用类。

3.成员变量

一个的成员变量只可以被初始化一次,只能在两个地方进行初始化(声明时,或构造函数),此后就将不能改变。

只有常量才使用

十、实现有用的方法。

实现一个有用的方法对于我们调试是十分重要的。实现方法在中有专门的规范。在这不作讨论,简单一点说,是应该能够显示一个类的成员变量等关键信息。可以考虑使用辅助类,来实现方法。

使用辅助类的方法,来实现方法

十一、使用而不是

当需要进行多次字符串操作时优先考虑使用。而不是使用

是一个类。

使用进行字符串操作,会带来更大的性能提升。

十二、可恶的空指针异常

是一个常见的错误,由于是所以它总是隐式的出错,无需要我们人为的去捕获。产生,它又没有相关的有用的帮助信息,所以很难以跟踪。我们只能通过一些编程标准来减少它在运行时出现的次数。

1.处理空值的原则:

a.没有充分的依据,永远都不要假设对象在某一时刻不可能为空。

b.假如认为空值是一个错误的代码调用,则应该以文字说明。不要让它简单的抛出;而是要记录为业务异常,并有直接的异常说明。

c.通常对方法参数进行空值检查。

2.在页面参数传递中正确的对待空值和空串

编程是无状态编程,页面只能传递字符串给后台。通常后台程序在获取页面参数的时候要进行特殊字符处理,去掉字符串两端的空格,制表格等特殊字符。

从页面获取的参数如果是空串应该认为它是空值。

典型的处理如下: s=()(); (s){ s=(); } (""(s)){ s=; }3.正确处理从页面参数传递后把字符串转换为非字符串类型

我们通常需要获取页面参数并转换为非字符串类型。一般是数值或日期类型。

这需要有两个步骤:

第一步是从页面获取字符串参数,如果是空串则要变为空值

第二步是把字符串转为相应的类型。

例如:从页面获取一个年龄的参数。 =(“”); (){ =(); } (“”()){ =; } =.();在太多的项目中有这样的代码出现,能够正常编译通过。

但如果页面的参数是一个录入域,可以由用户随便录入。并且在页面可能没有做相应完整的控制的时候,很容易

就输入了一些不能进行转换为整数的非法字符串。()就会抛出.

同样的情况也会出现在日期转换中。

=(“”);

.();

这也有可能抛出

和都是。都不需强迫用户去处理。不知不觉就会让系统报异常,使得系统十分脆弱。

像这种异常我们应该手动去处理,处理方法有两种:

1.把异常当空值处理,凡是报这种异常我都把它处理为空值。 ; =(""); { =(); }(e){ =; }2.把异常当输入错误处理,应该把相应的提示信息返回输入页面,要求用户重新输入合法的数据 ; =(""); =; { =(); }(e){ ="日期必须为格式"; } =; (){ =(""); ("",); }

3.编写辅助类来处理页面参数{ =""; (, ){ s=()(); (s){ s=(); } (s""(s)){ ; } { s; } } (, ,){ s=()(); (s){ s=(); } (s""(s)){ ; } { s; } } (,) { =(,); =(); { (!""()){ (); }{ ; } }(e){ ("无效的日期输入:格式错误:"+); } } (, ,){ =(,); =(); { (!""()){ (); }{ ; } }(e){ ("无效的日期输入:格式错误:"+); } } () { =(); { (!""()){ (); }{ ; } }(e){ ("无效的日期输入:格式错误:"+); } } (,) { =(); { (!""()){ (); }{ ; } }(e){ ("无效的日期输入:格式错误:"+); } }}

十三、正确的进行对象比较

1.总是把不为空的对象放在比较的前面。 =(""); (("")){ }在j2项目中,这样的代码并不少见很容易是一个空值。那么在运行时就很容易抛出.

换成第二种形式 (""()){ }

这样当为空值时条件为,及我们期望相符。而第一种形式则是一种隐患。说不准它什么时候就抛出了空指针异常。(""()){}

这样的写法也可以,但是没有必要。第二种写法更简单也同样安全

2.使用短路计算 (){ (()>10){ } }

在j2项目中,这样的代码也是频繁出象,没有做任何判断就调用对象的方法。谁又能保证调用者一定不会传一个空值对象进来呢? (){ (()(()>10)){ } }当为空时,第二个测试条件不被执行,这样才是安全的代码!在布尔表达式,当前面的有一个条件为时,那么结果为假,后面的条件不再进行测试。

同样在布尔表达式中,当前面的有一个条件为时,结果为真,后面的条件不再进行测试 (()(()>10)){ }

当为时,结果为真,那么后面的条件将不进行测试

十四、小心遍历集合对象

在对集合进行遍历时,经常是下面的代码 =(); (i=0;i<();){ =() (i); }当为时,那么它后面的遍历代码就抛出.所以在遍历集合时应该总是小心一些。 (i=0; i<();){ =() (i); }

这样的代码是安全的。我们时刻要防止可恶的产生。

可能有些代码是这样的, (){ (i=0;i<();){ =()(i); } }

但我觉得上面的方法更简洁一些,特别是没有理由进行太多的语句嵌套。嵌套增加了代码的复杂性,更难以阅读和理解。十五、对象创建是要付出代价的

重复的使用一个对象,而不是在每次需要的时候都去创建一个等价的新对象。对象创建是要付出内存消耗和时间代价。特别是当一个对象创建需要初始化外部环境时,比如数据库连接,查找等。

s=("")千万别要这样做比 s="";要付出更多的开销。如果第一种形式频繁的使用,那么会创建出成千上万个变量.

而第二种形式则不会,s="";只使用一个实例。

1.应当重用一个已有的对象时,就不要试着去创建新的对象

看看下面的方法:

(){ =()() (,"00")读中心数据库 ; }

这是要根据不同的机构代码去访问不同的数据库,再获得一个对象,每次都会创建一个新的对象

下面的方法会多次调用的方法 () { ()()删除此柜面所有子柜面信息 =();本柜面的子柜面列表 (i=0;i<();){ =()(i); (()); ()(); } }特别是在()()这个语句,需要去更新每一个柜员的关系,那么这样就会创

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论