`
isiqi
  • 浏览: 16497464 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

面向对象的设计原则-类设计原则

阅读更多

作者:中国系统分析员顾问团高级顾问 张华 来自:CSAI.cn http://www.csai.cn2004年06月24日

 

在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。

1. 开闭原则(the Open Closed Principle OCP)

  一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。
我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
图1是一个应用OCP生成的收音机类图的例子:



图1 OCP应用(收音机)

2. 替换原则 (the Liskov Substitution Principle LSP)

  子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。

  我们以学生为例,夜校生为学生的子类,因此在任何学生可以出现的地方,夜校生均可出现。这个例子有些牵强,一个能够反映这个原则的例子时圆和椭圆,圆是椭圆的一个特殊子类。因此任何出现椭圆的地方,圆均可以出现。但反过来就可能行不通。

  Liskov的相关图示见图2:



图2 Liskov 原则

  运用替换原则时,我们尽量把类B设计为抽象类或者接口,让C类继承类B(接口B)并实现操作A和操作B,运行时,类C实例替换B,这样我们即可进行新类的扩展(继承类B或接口B),同时无须对类A进行修改。

3. 依赖原则 (the Dependency Inversion Principle DIP)

  在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。

  在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个"硬伤"。

  面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口(见图-3)。

  为此,我们在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类(子类)来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。



图3依赖原则图示

4. 接口分离原则(the Interface Segregation Principle ISP)

  采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。

  ISP原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP,组件、类的可用性和移植性将大打折扣。

  这个原则的本质相当简单。如果你拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。

  图4展示了一个拥有多个客户的类。它通过一个巨大的接口来服务所有的客户。只要针对客户A的方法发生改变,客户B和客户C就会受到影响。因此可能需要进行重新编译和发布。这是一种不幸的做法。



图4 带有集成接口的服务类

  我们再看图-5中所展示的技术。每个特定客户所需的方法被置于特定的接口中,这些接口被Service类所继承并实现。


图5 使用接口分离的服务类设计

  如果针对客户A的方法发生改变,客户B和客户C并不会受到任何影响,也不需要进行再次编译和重新发布。

  以上四个原则是面向对象中常常用到的原则。此外,除上述四原则外,还有一些常用的经验诸如类结构层次以三到四层为宜、类的职责明确化(一个类对应一个具体职责)等可供我们在进行面向对象设计参考。但就上面的几个原则看来,我们看到这些类在几何分布上呈现树型拓扑的关系,这是一种良好、开放式的线性关系、具有较低的设计复杂度。一般说来,在软件设计中我们应当尽量避免出现带有闭包、循环的设计关系,它们反映的是较大的耦合度和设计复杂化。

分享到:
评论

相关推荐

    Ruby 面向对象设计实践--2013年

    《Ruby面向对象设计实践》不仅讲解了面向对象编程的基本概念和技术,还深入探讨了如何应用设计原则和设计模式来编写更高质量的代码。 ##### 1. SOLID原则 - **单一职责原则**(Single Responsibility Principle, ...

    面向对象设计原则.ppt

    面向对象设计原则是软件开发中至关重要的一环,它关乎到代码的可维护性、扩展性和复用性。本文将深入探讨这些原则,并结合实例来解释它们的重要性。 首先,我们需要理解面向对象不仅仅是编程语言中的概念,如封装、...

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

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

    面向对象的设计原则--ooprinciples

    开放关闭原则(Open/Closed Principle, OCP)作为面向对象设计原则的核心之一,强调了如何通过设计使得软件系统既具有开放性又具备封闭性,从而提高系统的稳定性和可扩展性。 #### 二、开放关闭原则概述 **开放关闭...

    23种 设计模式---面向对象的基本原则

    在面向对象编程中,设计模式基于一些基本原则,这些原则构成了良好设计的基础。本篇将深入探讨23种设计模式以及面向对象的基本原则。 面向对象的基本原则主要包括: 1. 单一职责原则(Single Responsibility ...

    java面向对象---宠物领养系统

    在Java编程语言中,面向对象(Object-Oriented Programming,OOP)是一种核心特性,它使得代码更加结构化、可维护且易于复用。...在这个过程中,理解并掌握面向对象编程的原则对于成为一名优秀的Java开发者至关重要。

    面向对象设计原则.pdf

    ### 面向对象设计原则详解 面向对象设计原则是一系列指导软件开发人员构建高质量、易于维护和扩展的软件系统的准则。这些原则旨在帮助开发者创建更健壮、更灵活的系统,减少代码间的耦合度,并提高代码的重用性和...

    面向对象设计原则

    面向对象设计原则是Java开发中不可或缺的基础,它们指导着开发者创建可维护、可扩展和可复用的软件系统。本文将深入探讨其中的两个核心原则:“开-闭”原则(Open-Closed Principle, OCP)和里氏代换原则(Liskov ...

    C#设计模式-面向对象设计原则

    C#设计模式-面向对象设计原则,C#设计模式-面向对象设计原则

    C++面向对象程序设计-电子教案

    《C++面向对象程序设计-电子教案》是一个深入学习C++编程的重要资源,它涵盖了C++语言的核心概念、面向对象编程的基本原则以及实际应用。在本文中,我们将详细探讨C++面向对象编程的关键知识点,包括类与对象、封装...

    对面向对象设计原则的总结

    对面向对象设计原则的总结,设计模式:“开-闭”原则,里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则

    02 第2章 面向对象设计原则

    02 第2章 面向对象设计原则02 第2章 面向对象设计原则02 第2章 面向对象设计原则

    面向对象设计原则英文文章

    面向对象设计原则是软件开发中的核心概念,尤其在Java、C++等面向对象编程语言中至关重要。这些原则为创建可维护、可扩展和可重用的代码提供了指导框架。这篇文章将深入探讨面向对象设计原则,并结合设计模式进行...

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

    ### C++设计模式课件2_面向对象设计原则 #### 面向对象设计原则概述 面向对象设计原则是软件工程领域中为了提高代码质量、增强软件系统的可维护性和可扩展性而制定的一系列指导原则。这些原则有助于开发人员更好地...

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

    面向对象设计原则总结 面向对象设计原则是软件设计中最重要的原则之一,它们是软件设计的基础和核心。面向对象设计原则的应用可以提高软件的开发效率、质量和可维护性。下面是七大面向对象设计原则的总结: 一、开...

    Java_面向对象设计原则总结

    Java_面向对象设计原则总结 一 类的设计原则 1 依赖倒置原则-Dependency Inversion Principle (DIP) 2 里氏替换原则-Liskov Substitution Principle (LSP) 3 接口分隔原则-Interface Segregation Principle...

    面向对象设计原则解析

    面向对象设计原则是软件开发中的一种核心思想,它为创建可维护、可扩展且易于理解的代码提供了指导方针。在本文中,我们将深入探讨这些原则,帮助你更好地理解和应用它们。 1. **单一职责原则(Single ...

    面向对象设计原则和设计模式的概念

    面向对象设计原则与设计模式是软件工程领域的重要组成部分,它们为构建高质量、可维护和可扩展的软件系统提供了指导方针。下面将详细阐述面向对象设计原则及其如何促进软件的复用,以及设计模式的概念。 ### 面向...

Global site tag (gtag.js) - Google Analytics