`

java程序猿应该了解的10个面向对象设计原则(每次看都很有感悟,特意拿来和大家共享)

 
阅读更多

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

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

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

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

原则1DRYDon'trepeatyourself

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

原则2:封装变化

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

原则3:开闭原则

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

原则4:单一职责原则

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

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

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

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

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

原则7里氏代换原则(LSP

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

原则8接口分离原则

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

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

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

原则10委托原则

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

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

分享到:
评论

相关推荐

    Java程序猿技术路线图

    2. Java 语法基础:基于 JDK 和 Eclipse 环境,进行 Java 核心功能开发,掌握 Java 面向对象的语法构成,包括类、抽象类、接口、最终类、静态类、匿名类、内部类、异常的编写。 3. Java 核心 API:基于 JDK 提供的...

    java程序猿必备开发文档

    以上这些知识点在"java程序猿必备开发文档"中可能都有详细的解释和示例,帮助开发者快速查阅和学习。通过深入理解和熟练应用这些概念,Java程序员可以提升他们的编程技巧,更好地应对各种开发挑战。

    java面向对象小程序(猜拳小游戏)

    在这个名为“java面向对象小程序(猜拳小游戏)”的项目中,我们可以看到一个实际应用面向对象思想的例子。 首先,让我们来了解一下面向对象的基本概念: 1. **对象**:对象是类的实例,包含数据(属性)和操作这些...

    java面向对象编程小程序(家庭记账系统)

    Java面向对象编程是一种强大的软件开发技术,尤其适合创建复杂、可维护的应用程序。在这个"家庭记账系统"项目中,初学者可以深入理解面向对象编程的核心概念,这将为他们的编程学习之路打下坚实的基础。 面向对象...

    Java面向对象课程作业(对程序提供两种及两种以上的设计原则和设计模式优化附含类图)【含源码+文档+UML类图】

    面向对象系统分析与设计作业(对程序提供两种及以上的设计原则和设计模式优化) 一、项目总体要求 1、分为两次完成。第一次为基本原则的应用,第二次为设计模式的应用。 2、每个人提交一份,包括文档撰写和代码实现...

    java程序猿面试宝典百问

    《Java程序猿面试宝典百问》是一本专为Java程序员设计的面试指南,旨在帮助求职者全面了解并掌握Java领域的核心知识,从而在面试中展现出扎实的技能和深厚的理论基础。这本书涵盖了从基础语法、面向对象编程、集合...

    最全的java程序猿面试题,欢迎来载

    Java程序员面试是一个全面检验开发者技能、经验和知识深度的过程。这份资料集合了众多常见的Java面试问题,旨在帮助求职者准备充分,提升成功通过面试的概率。以下是一些关键的Java面试知识点,涵盖基础到进阶,从...

    (含源码和设计文档)基于java Swing实现坦克大战采用面向对象思想

    在"java Swing实现坦克大战"项目中,开发者利用Swing构建了一款基于面向对象设计的游戏,这对于学习和理解面向对象编程的概念,以及Swing在实际应用中的使用都非常有帮助。 面向对象编程(OOP)是一种编程范式,它...

    java程序猿面试宝典

    ### Java程序猿面试宝典知识点解析 #### 一、面向对象的基本特征 1. **抽象**:面向对象编程中的抽象是指在设计一个类时,仅关注该类的主要功能和属性,忽略次要细节的过程。例如,在设计一个“汽车”类时,我们会...

    java面向对象学生信息管理系统

    总的来说,"Java面向对象学生信息管理系统"是一个涵盖了Java语言特性、面向对象设计原则、数据库操作、用户界面构建等多个方面的综合性项目。开发者需要具备扎实的Java基础,良好的编程习惯,以及对软件工程的理解,...

    java 程序猿 面试葵花宝典

    继承是面向对象编程中的另一个关键特性,它允许创建一个类来继承另一个类的属性和行为。通过继承,可以减少重复代码,提高代码的复用性和维护性。具体来说: - **类继承**:一个新类可以从现有类派生出来,新类称为...

    java面向对象编程:基于Java Swing愤怒的小鸟小游戏完整源码分享

    这个实战项目旨在帮助学习者理解和掌握Java GUI编程,特别是Swing组件的使用,以及面向对象设计原则和多态性在游戏开发中的应用。让我们深入探讨每个关键知识点。 Java Swing是Java的标准GUI(图形用户界面)工具包...

    面向对象的斗地主案例

    在这个案例中,可以设想有一个基础的`Player`类,然后`Landlord`(地主)和`Peasant`(农民)类继承自`Player`,这样它们就可以共享基本的玩家属性和行为,同时各自添加特有的属性和方法。 3. **封装**:封装是面向...

    基于Java Swing的面向对象电子相册管理系统

    1. **面向对象编程基础**:面向对象编程是一种编程范式,它将程序设计为由多个独立的对象组成,每个对象都有自己的属性(数据)和方法(行为)。在Java中,类是对象的蓝图,通过实例化类来创建对象。在这个电子相册...

    java简介 java简介

    Java是一种高级的面向对象的程序设计语言,它的设计目标之一就是简单易用,这使得它在程序员中广受欢迎。Java的跨平台特性是其一大亮点,这一特性得益于Java虚拟机(JVM)的设计。JVM是Java程序能够在不同操作系统上...

    JAVA WEB程序猿博客天地.zip

    JAVA WEB程序猿博客天地

    推荐给java程序员以及从java转向php程序猿的一本好书

    同时,Spring的实践经验和设计模式也有助于在PHP世界中更好地应用面向对象编程原则和最佳实践。 最后,结合提供的博文链接,读者可以获取更多关于书中内容的实战经验分享和讨论,进一步加深对Spring的理解。通过...

    面向对象程序设计课程要求

    本课程名为《面向对象程序设计》,是一门专为软件工程专业的学生开设的专业平台必修课,旨在帮助学生掌握面向对象程序设计的基本概念和技术。该课程由信息科学与工程学院开设,主要面向软件工程18级1-3班的学生。...

    Java程序猿上班那点事PDF和Java程序员面试笔试宝典-何昊PDF

    Java程序猿上班那点事PDF和Java程序员面试笔试宝典-何昊PDF两本质量挺高的PDF书籍

Global site tag (gtag.js) - Google Analytics