`
thinkerAndThinker
  • 浏览: 286787 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

面向对象设计七大原则

 
阅读更多

1. 单一职责原则(Single Responsibility Principle)

 

每一个类应该专注于做一件事情。

 

2. 里氏替换原则(Liskov Substitution Principle)

 

超类存在的地方,子类是可以替换的。

 

3. 依赖倒置原则(Dependence Inversion Principle)

 

实现尽量依赖抽象,不依赖具体实现。

 

4. 接口隔离原则(Interface Segregation Principle)

 

应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。

 

5. 迪米特法则(Law Of Demeter)

 

又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。

 

6. 开闭原则(Open Close Principle)

 

面向扩展开放,面向修改关闭。

 

7. 组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)

 

尽量使用合成/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。

 

细则

单一职责原则(Single Responsibility Principle)

 

因为:

 

可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;提高类的可读性,提高系统的可维护性;变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。需要说明的一点是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则。

 

所以:

 

从大局上看Android中的Paint和Canvas等类都遵守单一职责原则,Paint和Canvas各司其职。

 

里氏替换原则(Liskov Substitution Principle)

 

因为:

 

里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

 

所以:

 

使用里氏替换原则时需要注意,子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。

 

从大局看Java的多态就属于这个原则。

 

依赖倒置原则(Dependence Inversion Principle)

 

因为:

 

具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类;而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口;这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。

 

所以:

 

采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,减少并行开发引起的风险,提高代码的可读性和可维护性。

 

从大局看Java的多态就属于这个原则。

 

接口隔离原则(Interface Segregation Principle)

 

因为:

 

提供尽可能小的单独接口,而不要提供大的总接口。暴露行为让后面的实现类知道的越少越好。譬如类ProgramMonkey通过接口CodeInterface依赖类CodeC,类ProgramMaster通过接口CodeInterface依赖类CodeAndroid,如果接口CodeInterface对于类ProgramMonkey和类CodeC来说不是最小接口,则类CodeC和类CodeAndroid必须去实现他们不需要的方法。将臃肿的接口CodeInterface拆分为独立的几个接口,类ProgramMonkey和类ProgramMaster分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

 

所以:

 

建立单一接口,不要建立庞大的接口,尽量细化接口,接口中的方法尽量少。也就是要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的约定,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。

 

从大局来说Java的接口可以实现多继承就是接口隔离原则的基础保障。

 

迪米特法则(Law Of Demeter)

 

因为:

 

类与类之间的关系越密切,耦合度也就越来越大,只有尽量降低类与类之间的耦合才符合设计模式;对于被依赖的类来说,无论逻辑多复杂都要尽量封装在类的内部;每个对象都会与其他对象有耦合关系,我们称出现成员变量、方法参数、方法返回值中的类为直接的耦合依赖,而出现在局部变量中的类则不是直接耦合依赖,也就是说,不是直接耦合依赖的类最好不要作为局部变量的形式出现在类的内部。

 

所以:

 

一个对象对另一个对象知道的越少越好,即一个软件实体应当尽可能少的与其他实体发生相互作用,在一个类里能少用多少其他类就少用多少,尤其是局部变量的依赖类,能省略尽量省略。同时如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一方法的话,可以通过第三者转发这个调用。

 

从大局来说Android App开发中的多Fragment与依赖的Activity间交互通信遵守了这一法则。

 

开闭原则(Open Close Principle)

 

因为:

 

开放封闭原则主要体现在对扩展开放、对修改封闭,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。软件需求总是变化的,世界上没有一个软件的是不变的,因此对软件设计人员来说,必须在不需要对原有系统进行修改的情况下,实现灵活的系统扩展。

 

所以:

 

可以通过Template Method模式和Strategy模式进行重构,实现对修改封闭,对扩展开放的设计思路。 

封装变化,是实现开放封闭原则的重要手段,对于经常发生变化的状态,一般将其封装为一个抽象,拒绝滥用抽象,只将经常变化的部分进行抽象。

 

组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)

 

因为:

 

其实整个设计模式就是在讲如何类与类之间的组合/聚合。在一个新的对象里面通过关联关系(包括组合关系和聚合关系)使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用其已有功能的目的。也就是,要尽量使用类的合成复用,尽量不要使用继承。

 

如果为了复用,便使用继承的方式将两个不相干的类联系在一起,违反里氏代换原则,哪是生搬硬套,忽略了继承了缺点。继承复用破坏数据封装性,将基类的实现细节全部暴露给了派生类,基类的内部细节常常对派生类是透明的,白箱复用;虽然简单,但不安全,不能在程序的运行过程中随便改变;基类的实现发生了改变,派生类的实现也不得不改变;从基类继承而来的派生类是静态的,不可能在运行时间内发生改变,因此没有足够的灵活性。

 

所以:

 

组合/聚合复用原则可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。

 

总结:七大设计原则需要结合代码理解;

分享到:
评论

相关推荐

    软件设计原则-面向对象设计七大原则.zip

    软件设计原则-面向对象设计七大原则.zip 面向对象和C语言完全不是一种思考问题的方式,面向对象是种哲学思想,只有明白了其核心思想,才能以不变应万变 只有吃透面向对象的七大设计原则,比如:依赖倒置原则,迪米特法则等...

    面向对象七大原则

    面向对象编程的七大原则是指在面向对象设计中所遵循的七个基本原则,它们是:开闭原则、依赖倒转原则、单一职责原则、接口隔离原则、迪米特法则、里氏替换原则和组合优于继承原则。 1. 开闭原则(Open-Closed ...

    程序员必备的七大面向对象设计原则

    下面是七大面向对象设计原则的总结: 一、开闭原则 开闭原则是面向对象设计中最重要的原则之一。它定义为:一个软件实体应当对扩展开放,对修改关闭。也就是说,在设计一个模块的时候,应当使这个模块可以在不被...

    C++设计模式课件2_面向对象设计原则.pdf

    #### 面向对象设计七大原则 1. **依赖倒置原则(Dependency Inversion Principle, DIP)** - **原则阐述**:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。 -...

    设计模式01-面向对象七大原则

    设计模式面向对象七大原则

    Java面向对象设计原则

    在学习 Java 面向对象设计七大原则之前,我们需要对基本的封装、继承、多态思想有足够的了解,并对抽象类和接口也有足够的编码能力。只有这样,我们才能更好地理解和应用这些原则,编写出更加灵活、可维护的代码。

    面向对象七大基本设计原则.pdf

    面向对象七大基本设计原则通常是指SOLID原则,它是一组面向对象设计的指导原则,旨在使软件更加可维护和可扩展。SOLID由以下五个原则组成: 1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该...

    设计模式基础培训材料-面向对象设计原则与模式

    #### 二、面向对象设计七大原则详解 1. **开闭原则(Open-Closed Principle, OCP)** - **定义**:开闭原则强调系统应当对扩展开放,对修改关闭。这意味着当需要增加新功能时,应尽可能不修改现有代码。 - **...

    面向对象设计原则.pdf

    以下是七个核心的面向对象设计原则及其详细解释: #### 1. **单一责任原则 (SRP, Single Responsibility Principle)** - **定义**: 一个类或对象应该只有一个引起变化的原因。换句话说,一个类只负责执行一种类型...

    面向对象设计原则

    本文将详细介绍面向对象设计的七大原则,并结合具体案例进行解析。 ### 面向对象设计原则概述 面向对象设计原则是在软件设计阶段必须遵守的一套规则,它们能够帮助开发者构建出更易于理解、修改和扩展的系统。这些...

    Java设计模式-面向对象七大设计原则

    例如:随着计算机的不断发展,程序学习这门技术也越来越重要,很多人都开启了...面向对象设计原则一共有七个:开闭原则、里氏替换原则、依赖倒转原则、单一职责原则、接口隔离原则、组合/聚合复用原则、迪米特法则。

    程序设计里面向对象的七条原则

    以下就是面向对象设计的七条核心原则: 1. 单一职责原则(Single Responsibility Principle, SRP) 这个原则指出,一个类或对象应该只有一个明确的责任,即它只负责处理一种特定的业务逻辑或功能。这样做的好处是...

    面向对象七大原则——肖文斌.pdf

    面向对象的七大原则,也被称为面向对象设计原则,是指为了创建更加可维护和可扩展的软件系统,应当遵循的一些编程和设计的基本规则。肖文斌在其文件“面向对象七大原则”中详细地探讨了这些原则。 1. 开闭原则(OCP...

    面向对象的设计的原则 电子版

    在面向对象设计中,有七个基本原则,即单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、合成复用原则和迪米特法则。 1. 单一职责原则(SRP):一个类只负责一个功能领域中的相应职责。单一职责...

    C++ 面向对象程序设计(第七版) 周靖 译

    学习这本书,不仅需要掌握C++语法,还要理解面向对象设计原则,如SOLID原则,以及如何运用设计模式来解决实际问题。通过阅读源码,可以进一步了解优秀代码的编写规范和实践,对于提升编程水平大有裨益。教师手册和...

    61条面向对象设计的经验原则

    ### 61条面向对象设计的经验原则 #### 面向对象设计基本原则 **原则一:** 面向对象设计应该关注于清晰地定义类及其责任。这意味着每个类都应该有明确的目的,并且只负责执行那些与之直接相关的任务。 **原则二:...

    C#面向对象设计的七大原则

    本文将详细介绍C#面向对象设计的七大原则,这些原则是指导我们编写可维护、可扩展的高质量代码的关键。 1. **开闭原则**:开闭原则主张软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这意味着在不...

    面向对象与分析习题及答案

    通过解答这些习题,学习者可以深化对面向对象设计原则的理解,如单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖倒置原则(DIP)。同时,还能提高他们分析问题、建模和...

    面向对象设计与分析和UML教程

    4. **面向对象设计原则**:包括单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)和迪米特法则(LoD)。这些原则指导设计师创建可维护、可扩展和易于理解的...

Global site tag (gtag.js) - Google Analytics