文档章节

Java程序员应了解的10个面向对象设计原则

effort_fan
 effort_fan
发布于 2012/04/09 18:44
字数 1665
阅读 67
收藏 5

      面向对象设计原则是 OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数 Java 程序员追逐像 Singleton、Decorator、Observer 这样的设计模式,而不重视面向对象的分析和设计。甚至还有经验丰富的 Java 程序员没有听说过 OOPS 和 SOLID设计原则,他们根本不知道设计原则的好处,也不知道如何依照这些原则来进行编程。

      众所周知,Java 编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计。查看 Apache 和 Sun 的开放源代码能帮助你发现其他 Java 设计原则在这些代码中的实际运用。Java Development Kit 则遵循以下模式:BorderFactory 类中的工厂模式、Runtime 类中的单件模式。你可以通过 Joshua Bloch 的Effective Java一书来了解更多信息。我个人偏向的另一种面向对象的设计模式是 Kathy Sierra 的 Head First设计模式》 以及 Head First Object Oriented Analysis and Design

      虽然实际案例是学习设计原则或模式的最佳途径,但通过本文的介绍,没有接触过这些原则或还在学习阶段的 Java 程序员也能够了解这 10 个面向对象的设计原则。其实每条原则都需要大量的篇幅才能讲清楚,但我会尽力做到言简意赅。

      原则1:DRY(Don’t repeat yourself)

      即不要写重复的代码,而是用“abstraction”类来抽象公有的东西。如果你需要多次用到一个硬编码值,那么可以设为公共常量;如果你要 在两个以上的地方使用一个代码块,那么可以将它设为一个独立的方法。SOLID 设计原则的优点是易于维护,但要注意,不要滥用,duplicate 不是针对代码,而是针对功能。这意味着,即使用公共代码来验证 OrderID 和 SSN,二者也不会是相同的。使用公共代码来实现两个不同的功能,其实就是近似地把这两个功能永远捆绑到了一起,如果 OrderID 改变了其格式,SSN 验证代码也会中断。因此要慎用这种组合,不要随意捆绑类似但不相关的功能。

      原则2:封装变化

      在软件领域中唯一不变的就是“Change”,因此封装你认为或猜测未来将发生变化的代码。OOPS 设计模式的优点在于易于测试和维护封转的代码。如果你使用 Java 编码,可以默认私有化变量和方法,并逐步增加访问权限,比如从 private 到 protected 和 not public。有几种 Java 设计模式也使用封装,比如 Factory 设计模式是封装“对象创建”,其灵活性使得之后引进新代码不会对现有的代码造成影响。

       原则3:开闭原则

       即对扩展开放,对修改关闭。这是另一种非常棒的设计原则,可以防止其他人更改已经测试好的代码。理论上,可以在不修改原有的模块的基础上,扩展功能。这也是开闭原则的宗旨。

      原则4:单一职责原则    

      类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。

      原则5:依赖注入或倒置原则

      这个设计原则的亮点在于任何被 DI 框架注入的类很容易用 mock 对象进行测试和维护,因为对象创建代码集中在框架中,客户端代码也不混乱。有很多方式可以实现依赖倒置,比如像 AspectJ 等的 AOP(Aspect Oriented programming)框架使用的字节码技术,或 Spring 框架使用的代理等。

     原则6:优先利用组合而非继承

      如果可能的话,优先利用组合而不是继承。一些人可能会质疑,但我发现,组合比继承灵活得多。组合允许在运行期间通过设置类的属性来改变类的行为,也可以通过使用接口来组合一个类,它提供了更高的灵活性,并可以随时实现。《Effective Java》也推荐此原则。

     原则7:里氏代换原则(LSP)

      根据该原则,子类必须能够替换掉它们的基类,也就是说使用基类的方法或函数能够顺利地引用子类对象。LSP 原则与单一职责原则和接口分离原则密切相关,如果一个类比子类具备更多功能,很有可能某些功能会失效,这就违反了 LSP 原则。为了遵循该设计原则,派生类或子类必须增强功能。

      原则8:接口分离原则

      采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。设计接口很棘手,因为一旦释放接口,你就无法在不中断执行的情况 下改变它。在 Java 中,该原则的另一个优势在于,在任何类使用接口之前,接口不利于实现所有的方法,所以单一的功能意味着更少的实现方法。

     原则9:针对接口编程,而不是针对实现编程

     该原则可以使代码更加灵活,以便可以在任何接口实现中使用。因此,在 Java 中最好使用变量接口类型、方法返回类型、方法参数类型等。《Effective Java》 和《Head First Design Pattern》书中也有提到。

     原则 10:委托原则

      该原则最典型的例子是 Java 中的 equals () 和 hashCode () 方法。为了平等地比较两个对象,我们用类本身而不是客户端类来做比较。这个设计原则的好处是没有重复的代码,而且很容易对其进行修改。

总之,希望这些面向对象的设计原则能帮助你写出更灵活更好的代码。理论是第一步,更重要的是需要开发者在实践中去运用和体会。

英文原文:10 Object Oriented Design principles Java programmer should know

本文转载自:http://blog.jobbole.com/15297/

共有 人打赏支持
effort_fan
粉丝 10
博文 22
码字总数 1981
作品 0
西安
程序员
私信 提问
10个不容错过的Java面向对象设计原则

面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton、Decorator、Observer这样的设计模式,而不重视面向...

牵着蜗牛去西藏
2015/07/16
152
2
Java程序员应该了解的10个面向对象设计原则

摘要:Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计。查看Apache和Sun的开放源代码能帮助你发现其他Java设计原则在这些代码中的实际运用。 面向对象设计原则是OOP...

ajson
2013/02/18
0
1
Java程序员应当知道的10个面向对象设计原则

面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) 、 Decorator(装饰器)、Observer(观察者) 等设计模式,而没有把足够多的注意力放在学习面向对象的...

银月光海
2015/03/16
0
0
Java开发人员需知的十大面向对象设计原则

面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序设计人员不重视面向对象的分析和设计。甚至还有经验丰富的Java程序员没...

飓风2000
2014/06/21
0
0
Java 书籍 Top 10

陈皓 http:// blog.csdn.net/haoel 下面是Java Inside上推荐的十本Java书籍(文章来源),我把中文版的也列了出来。 1)Java Language Specification, Third Edition (by James Gosling) 本书...

JavaGG
2009/09/21
12.5K
20

没有更多内容

加载失败,请刷新页面

加载更多

开始看《ES6标准入门》

写得非常好,全是干货。还以为是很容易上手的,结果一看还是要有一些JS基础才行的 1.ES6简介。可以了解一下,特别是ES6和ES2015的关系 2.Let和Const命令。这个感觉是帮JS打补丁了。之前的Var...

max佩恩
32分钟前
1
0
SpringBoot入门系列HelloWorld

根据咱们程序员学习的惯例,学习一门新技术都是从HelloWorld开始的。 感觉编程是一件非常富有意义的事情,程序员也是一群可爱的人,渴望被关怀和关注,因为我们总在和世界say Hi. 好了进入正...

凌宇之蓝
今天
4
0
Linux之《荒岛余生》(二)CPU篇

温馨提示,动图已压缩,流量党放心查看。CPU方面内容不多,我们顺便学点命令。本篇是《荒岛余生》系列第二篇,垂直观测CPU。其余参见: Linux之《荒岛余生》(一)准备篇 如何做一个CPU cpu...

mskk
今天
1
0
Java基础教程,第十讲,继承

前面我们学习了类和对象的概念,学习了方法的重载,今天我们将学习面向对象另一个重要特性,继承(inheritance)。利用继承,我们可以基于一个已经存在的类狗仔一个新的类,继承已经存在的类...

程序员补给栈
今天
2
0
nginx的日志

nginx的日志包括错误日志和访问日志,分别使用不同的指令来定义其输出位置和相应的级别。 下面介绍其各自的用途。 错误日志 nginx提供了error_log指令来指定错误日志的输出文件和级别。 指令...

xtof
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部