`
clq9761
  • 浏览: 587809 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

JAVA编程指南

 
阅读更多

一、设计方法论

 

1、方法学,是一套用以降解编程问题复杂性的过程与启发。它由许多经验积累而成的,特别是OOP中,
 在采用某种方法论之前,先弄清楚它能解决什么问题就显得十分重要。
 在整个开发过程中,最重要的一点是:不要不知所措。方法论中要尝试去发现的是:
(1)要使用的对象是什么?
(2)这些对象的接口是什么? 


2、无论做了多少分析,总有些问题不到设计阶段是无法发现的,而更多的问题直到编码阶段或者程序运行时
 才会暴露出来。因此,快速完成分析与设计阶段,并且对开发的系统进行测试才是至关重要的。

3、对象的设计并不只限于写程序的那段时间,而是出现在一系列阶段。对象设计的五个阶段如下:
(1)发现对象
(2)对象的组合
(3)系统的构建
(4)系统扩展
(5)对象重用


4、极限编程(XP)既是编程工作的哲学,也是一套实践准则。其中最重要而独特的两个贡献是“优先编写测试”
   和“结对编程”。


二、设计指南


1.优雅终将得到回报,提出优雅的解决方案似乎花费了太多的时间,不过一旦它能够工作,就能够很容易地
 适应新环境,得到的程序不仅易于编写和调试,而且还易于理解和维护。


2.先能运行,再求快速,先尽可能简化设计,让系统运转起来,如果性能不够理想,再求助于性能分析工具,
 要把时间用在刀刃上。


3.谨记"分而治之"原则,如果待解决的问题过于复杂,先设想一下程序的基本操作,把其中最困难的部分
 包装成其他对象,回过头再来研究这个对象。


4.区分类的编写者和使用者(客户端程序员),类的使用者不需要也不希望知道类的底层工作方式。

5.编写类的时候,类的名称要非常清晰,不需要注释也能理解


6.分析和设计必须使系统中的类,它们的公共接口以及类之间(尤其是与基类之间)的关系必须达到最少


7.尽量让所有的东西自动化,首先编写测试代码,并把它和要测试的类放在一起,可以使用构建工具来自动运行测试。


8.在编写类之前先编写测试代码,以验证这个类是否设计完备


9.所有软件设计中的问题,都可以通过"引入额外的间接层次"得到简化,这是软件工程领域的基本原则,
 也是抽象的依据,如果代码过于复杂,那就引入更多的对象。


10.引入间接概念层次要有意义,同准则9一致,如果加入了无意义的间接概念层次,那就会和没有
 引入间接层一样糟糕。


11.尽可能使类原子化,每个类要具有简单明了的用途,用它来向别的类提供服务。


12.当心冗长的参数列表


13.不要一再重复,如果某段代码不断出现在许多派生类方法中,应将该段代码置于基类的某个方法中,
 然后在派生类方法中进行调用。


14.小心Switch语句或嵌套的if-else子句,可以使用继承和多态机制来替代此类代码。

15.从设计的观点来看,要找出变动的因素,并使它和不变的因素相分离

16.不要依靠子类化来扩展基础功能,如果类接口中的某个元素非常重要,那么它应该被放进基类,而不是在继承时添加。


17.更少意味着更多,从类的最小接口开始,尽量在能够解决问题的前提下让它保持简单明了,
 先别急着考虑类可能被使用的所有方式,一旦它被实际使用,你自然会明白该如何扩展接口。


18.大声朗读你的类,确保它们符合逻辑


19.在判断应该使用继承还是组合的时候,考虑一下是否需要向上转型成基类型,如果不需要请优先考虑组合。


20.采用字段来表示数值的变化,使用方法覆盖来表示行为的变化


21.小心重载,方法不应该把参数值作为执行代码的条件,这种情况下,应该编写两个或多个重载方法作为替代。

 

22.使用异常体系,最好是从Java标准异常体系中派生出具体的、适应的异常类。这样,处理异常的用户便可以
在捕获基本异常之后,编写处理程序来捕获指定类型的异常。


23.有时候仅仅使用聚合就能完成工作


24.从客户端程序员和程序维护者的角度进行思考,设计的类要尽可能易于使用。


25.当心"巨型对象综合症


26.如果你只能采用某种别扭的方式才能实现某个功能,请将这部分代码至少局限在某个类内部


27.如果你只能采用某种不可移植的方式才能实现某个功能.请将其抽象成服务,并局限在某个类内部


28.对象不应仅仅用来持有数据,它还应该具有精心定义的行为。


29.在原有类的基础上编写新类时,首先考虑用组合


30.使用继承和方法覆盖来表达行为上的差异,使用字段来表示状态的变化


31.当心"变异性",仅仅为了从继承中获得某些好处,就让其中一个类成为另一个类的子类。这就是所谓的变异性,
 人为地制造出一个其实并不存在的超类/子类关系。


32.注意继承期间的"限制",最有条理的设计将在派生类里添加新的功能,如果在继承过程中去掉旧功能,
 而没有添加新功能,这样的设计就值得怀疑。


33.使用设计模式来消除那些"纯粹的功能性代码"


34.当心"分析瘫痪"的情况,在获得所有信息之前,理解未知部分最好、最快的方式,就是尝试向前推进,
 而不是在完全理解之后才开始工作。


35.当认为自己已经获得了一个优秀的分析,设计或实现时,进行一次全面评审

 

三、实现指南

 

1.一般来说,请遵守Sun的程序编写习惯


2.无论使用何种编写风格,如果你的团队(或整个公司,那就更好了)能够加以标准化,那么的确会带来显著效果

 

3.遵守标准的大小写规范


4.不要为私有字段加上你自己的"修饰"符号


5.编写通用性的类时,请遵守标准形式,包括定义equals(),hashCode(),toString(),clone()
(实现Cloneable接口,或者选择其他对象复制策略,比如序列化),并实现Compareable和Seriliable接口。


6.对于那些"获得或改变私有字段值"的方法,请使用JavaBean的"get","set","is"等命名习惯


7.对于你编写的每一个类,请使用JUnit为它编写测试


8.有时需要通过继承才能访问基类的受保护成员,如果不需要向上转型,可以先派生一个新类以对受保护成员
进行访问,然后在需要访问那个受保护成员的所有类中,将新派生的类作为成员对象,而不要直接使用继承。

9.应避免纯粹为了提高执行速度而采用final方法


10.如果两个类在功能性上产生了关联(比如容器和迭代器),那么请试着让其中一个类成为另一个的内部类


11.在任何时候,都要警惕那些相互之间高度耦合的类,考虑一下使用内部类为程序编写和维护带来的好处,
使用内部类不能消除类之间的耦合,而是使耦合关系更明显,使用起来也更方便。


12.不要跳入过早优化的陷阱


13.尽可能缩小对象的作用域,这样对象的可见范围和生存期也都会尽可能地小


14.使用Java标准库提供的容器,优先选择ArrayList来处理顺序结构,选择HashSet来处理集合,
选择HashMap来处理关联数组,选择LinkedList来处理栈。


15.对一个健壮的程序而言,每一个部件都必须是健壮


16.宁可在编译期发生错误,也不要在执行期发生错误


17.当心冗长的方法定义


18.尽量使用"private"关键字,一旦你把库的特征(包括方法、类、字段)标记为public,你就再也不能
 去掉它们。如果你只公开必要部分,那么其余部分就可以自由改变,而不用担心影响别人,设计总是会演化,
 所以这种自由度非常重要。


19.大量使用注释,并使用javadoc的"文档注释语法"来生成程序的文档


20.避免使用"魔术数字"


21.在编写构造器时,请考虑异常,最佳情况下,构造器不会有任何抛出异常的动作。

22.在构造器中只做必要的动作,将对象设定为正确的状态


23.客户端程序员用完对象之后,如果你的类需要任何清理动作,请将此动作放到一个精心定义的方法中
 (比如命名为dispone(),这样能清楚说明其用途)。


24.finalize()方法的职责只能是为了调试的目的而检查对象的"终结条件"


25.如果对象在某个特定的范围内必须被清理(而不是作为垃圾被回收),请使用以下方法:先初始化对象,
 如果成功的话,立刻进入一个带有finally子句的try块,在finally子句中进行清理动作。


26.在继承的时候如果覆盖了finalize()方法,要记得调用super.finalize()


27.当你编写固定大小的对象容器时,它们要能够被传送给一个数组


28.优先选择接口而不是抽象类


29.为了避免十分令人泄气的经历,请检查类路径,确保所有未放进包里的类的名称互不相同


30.注意无心的重载错误,如果你在覆盖基类方法时没有正确拼写方法的名称,其后果是增加了一个新方法,
 而没有覆盖原有的方法。


31.当心过早优化,先求运行,再求快速,只有在你必须时才这么做。


32.记住,代码被阅读的时间多于它被编写的时间。清晰的设计能使程序易于理解。注释、详细说明、
 测试代码和使用范例的作用是无价的,它能够帮助你和你的后继者。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics