Java程序员应当知道的10个面向对象设计原则
面向对象设计原则是哦编程的核心,但我见过的大多数Java程序员热心于像单(单例),装饰(装饰器),观察者(观察者)等设计模式,而没有把足够多的注意力放在学习面向对象的分析和设计上面。学习面向对象编程像“抽象”,“封装”,“多态”,“继承”等基础知识是重要的,但同时为了创建简洁,模块化的设计,了解这些设计原则也同等重要。我经常看到不同经验水平的Java程序员,他们有的不知道这些哦和坚实的设计原则,有的只是不知道一个特定的设计原则会带来怎样的益处,甚至不知道在编码中如何使用这些设计原则。
(设计原则)底线是永远追求高内聚,低耦合的编码或设计。Apache和太阳的开源代码是学习Java和哎呀设计原则的良好范例。它们向我们展示了,设计原则在Java编程中是如何使用的. Java JDK使用了一些设计原则:BorderFactory类中的工厂模式,运行时类中的单例模式,Java。io类中的装饰器模式。
虽然学习设计模式(原则)最好的方法是现实中的例子和理解违反设计原则带来的不便,本文的宗旨是向那些没有接触过或正处于学习阶段的Java程序员介绍面向对象设计原则。我个人认为哦和坚实的设计原则需要有文章清楚的介绍它们,在此我一定尽力做到这点,但现在请您准备浏览以下设计模式(原则):)
干,不要重复自己
我们第一个面向对象设计原则是:干燥,从名称可以看出干(不要重复你自己)意思是不写重复代码,而是抽象成可复用的代码块。如果您有两处以上相同的代码块,请考虑把它们抽象成一个单独的方法,或者您多次使用了硬编码的值,请把它们设置成公共常量。这种面向对象设计原则的优点是易于维护。重要的是不要滥用此原则,重复不是针对代码而是针对功能来说。它的意思是,如果您使用通用代码来验证OrderID和SSN,这并不意味着它们是相同的或者他们今后将保持不变。通过把通用代码用于实现两种不同的功能,或者您把这两种不同的功能密切地联系在一起,当您的OrderID格式改变时,您的SSN验证代码将会中断。所以要当心这种耦合,而且不要把彼此之间没有任何关系却类似的代码组合在一起。
封装经常修改的代码封装
什么变化在软件领域永远不变的是“变化”,所以把您认为或怀疑将来要被修改的代码封装起来。这种面向对象设计模式的优点是:易于测试和维护恰当封装的代码。如果您在用Java编程,那么请遵守以下原则:变量和方法的访问权限默认设置为私有,并且逐步放开它们的访问权限,例如从“私人”到“受保护的”,“不公开”. Java中的一些设计模式使用了封装,工厂设计模式就是一个例子,它封装了创建对象的代码而且提供了以下灵活性:后续生成新对象不影响现有的代码。
打开/关闭设计原则开闭式设计原则
类、方法/函数应当是对扩展(新功能)开放,对修改闭合。这是另外一个优雅的固体设计原则,以防止有人修改通过测试的代码。理想情况下假如您添加了新功能,那么您的代码要经过测试,这就是打开/关闭设计原则的目标。顺便说一句,固体中的字母“O”指的是打开/关闭设计原则。
单一职责原则单一责任原则(SRP)
单一职责原则是另外一个坚实的设计原则,固体中的字母“S”指的就是它。按照SRP,一个类修改的原因应当有且只有一个,或者一个类应当总是实现单一功能。如果您在Java中的一个类实现了多个功能,那么这些功能之间便产生了耦合关系,如果您修改其中的一个功能,您有可能就打破了这种耦合关系,那么就要进行另一轮测试以避免产生新的问题。
依赖注入/反转原则依赖注入或倒置原则
不要问框架的依赖注入功能将会给你带来什么益处,依赖注入功能在春天框架里已经很好的得到了实现,这一设计原则的优雅之处在于:DI框架注入的任何一个类都易于用模拟对象进行测试,并且更易于维护,因为创建对象的代码在框架里是集中的而且和客户端代码是隔离的。有多种方法可以实现依赖注入,例如使用字节码工具,其中一些AOP(面向切面编程)框架如切入点表达式或者春天里使用的代理。想对这种固体设计原则了解更多,请看奥委会和DI设计模式中的例子。固体中的字母“D”指的就是这种设计原则。
优先使用组合而非继承支持组合在继承
如果可以的话,要优先使用组合而非继承。你们中的一些人可能为此争论,但我发现组合比继承更有灵活性。组合允许在运行时通过设置属性修改一个类的行为,通过使用多态即以接口的形式实现类之间的组合关系,并且为修改组合关系提供了灵活性。甚至有效的Java也建议优先使用组合而非继承。