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

面向对象程序设计(OOP)的六大原则

阅读更多

面向对象程序设计(OOP)的六大原则
要把软件做得非常灵活又要便于维护是一个很困难的事情。灵活的软件他的结构就复杂,维护起来就困难。有得必有失,关键就在于如何处理这两者,使得大于失。软件的设计开

发应遵循以下六大原则:

1.       OCP

全称:“Open-Closed Principle” 开放-封闭原则

说明:对扩展开放,对修改关闭。

优点:按照OCP原则设计出来的系统,降低了程序各部分之间的耦合性,其适应性、灵活性、稳定性都比较好。当已有软件系统需要增加新的功能时,不需要对作为系统基础的抽象

层进行修改,只需要在原有基础上附加新的模块就能实现所需要添加的功能。增加的新模块对原有的模块完全没有影响或影响很小,这样就无须为原有模块进行重新测试。

如何实现“开-闭”原则

在面向对象设计中,不允许更改的是系统的抽象层,而允许扩展的是系统的实现层。换言之,定义一个一劳永逸的抽象设计层,允许尽可能多的行为在实现层被实现。

解决问题关键在于抽象化,抽象化是面向对象设计的第一个核心本质。

对一个事物抽象化,实质上是在概括归纳总结它的本质。抽象让我们抓住最最重要的东西,从更高一层去思考。这降低了思考的复杂度,我们不用同时考虑那么多的东西。换言之

,我们封装了事物的本质,看不到任何细节。

在面向对象编程中,通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需更改,从而满足“对修改关闭”;而从抽象类导出的具体类可以改变系统的行为,从而

满足“对扩展开放”。

对实体进行扩展时,不必改动软件的源代码或者二进制代码。关键在于抽象。

2.       LSP

全称:“Liskov Substitution Principle” 里氏代换原则

说明:子类型必须能够替换它们的基类型。一个软件实体如果使用的是一个基类,那么当把这个基类替换成继承该基类的子类,程序的行为不会发生任何变化。软件实体察觉不出

基类对象和子类对象的区别。

优点:可以很容易的实现同一父类下各个子类的互换,而客户端可以毫不察觉。


3.       DIP

全称:“Dependence Inversion Principle”依赖倒置原则

说明:要依赖于抽象,不要依赖于具体。客户端依赖于抽象耦合。

抽象不应当依赖于细节;细节应当依赖于抽象;

要针对接口编程,不针对实现编程。

优点:使用传统过程化程序设计所创建的依赖关系,策略依赖于细节,这是糟糕的,因为策略受到细节改变的影响。依赖倒置原则使细节和策略都依赖于抽象,抽象的稳定性决定

了系统的稳定性。

怎样做到依赖倒置?

以抽象方式耦合是依赖倒转原则的关键。抽象耦合关系总要涉及具体类从抽象类继承,并且需要保证在任何引用到基类的地方都可以改换成其子类,因此,里氏代换原则是依赖倒

转原则的基础。

在抽象层次上的耦合虽然有灵活性,但也带来了额外的复杂性,如果一个具体类发生变化的可能性非常小,那么抽象耦合能发挥的好处便十分有限,这时可以用具体耦合反而会更

好。

层次化:所有结构良好的面向对象构架都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口向外提供一组内聚的服务。

依赖于抽象:建议不依赖于具体类,即程序中所有的依赖关系都应该终止于抽象类或者接口。尽量做到:

1、任何变量都不应该持有一个指向具体类的指针或者引用。

2、任何类都不应该从具体类派生。

3、任何方法都不应该覆写它的任何基类中的已经实现的方法。

4.       ISP

全称:“Interface Segregation Principle” 接口隔离原则

说明:使用多个专一功能的接口比使用一个的总接口总要好。从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小接口上的。过于臃肿的接口是对接口的污

染,不应该强迫客户依赖于它们不用的方法。

优点:会使一个软件系统功能扩展时,修改的压力不会传到别的对象那里。

如何实现接口隔离原则

不应该强迫用户依赖于他们不用的方法。

1、利用委托分离接口。

2、利用多继承分离接口。


5.       CARP or CRP

全称:“Composite/Aggregate Reuse Principle” 合成/聚合复用原则 or “Composite Reuse Principle” 合成复用原则

说明:如果新对象的某些功能在别的已经创建好的对象里面已经实现,那么尽量使用别的对象提供的功能,使之成为新对象的一部分,而不要自己再重新创建。新对象通过向这些

对象的委派达到复用已有功能的。

简而言之,要尽量使用合成/聚合,尽量不要使用继承。

优点:

1) 新对象存取成分对象的唯一方法是通过成分对象的接口。

2) 这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不见的。

3) 这种复用支持包装。

4) 这种复用所需的依赖较少。

5) 每一个新的类可以将焦点集中在一个任务上。

6) 这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象。

7) 作为复用手段可以应用到几乎任何环境中去。

缺点:

就是系统中会有较多的对象需要管理。


6.       LOD or LKP

全称:“Law of Demeter” 迪米特原则 or “Least Knowledge Principle” 最少知识原则

说明:对象与对象之间应该使用尽可能少的方法来关联,避免千丝万缕的关系。

如何实现迪米特法则

迪米特法则的主要用意是控制信息的过载,在将其运用到系统设计中应注意以下几点:

1) 在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。

2) 在类的结构设计上,每一个类都应当尽量降低成员的访问权限。一个类不应当public自己的属性,而应当提供取值和赋值的方法让外界间接访问自己的属性。

3) 在类的设计上,只要有可能,一个类应当设计成不变类。

4) 在对其它对象的引用上,一个类对其它对象的引用应该降到最低。


还有个单一职责原则:


SRP简介(SRP--Single-Responsibility Principle):就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因。所谓职责,我们可以理解他为功能,就是设计的这个

类功能应该只有一个,而不是两个或更多。也可以理解为引用变化的原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑撤分这个类了。因为职责是变化的一个轴

线,当需求变化时,该变化会反映类的职责的变化。 使用SRP注意点:1、一个合理的类,应该仅有一个引起它变化的原因,即单一职责;
2、在没有变化征兆的情况下应用SRP或其他原则是不明智的;
3、在需求实际发生变化时就应该应用SRP等原则来重构代码;
4、使用测试驱动开发会迫使我们在设计出现臭味之前分离不合理代码;
5、如果测试不能迫使职责分离,僵化性和脆弱性的臭味会变得很强烈,那就应该用Facade或Proxy模式对代码重构;SRP优点:消除耦合,减小因需求变化引起代码僵化性臭

分享到:
评论

相关推荐

    C++面向对象程序设计PDF电子书与参考答案

    以下是对"**C++面向对象程序设计PDF电子书与参考答案**"中的关键知识点的详细阐述: 1. **封装**:封装是面向对象编程的基础,它将数据(属性)和操作这些数据的方法(函数)捆绑在一起,形成一个独立的实体——...

    c++面向对象程序设计语言重点难点复习题及答案-整理.pdf

    面向对象程序设计语言C++重点难点复习题及答案总结 面向对象程序设计语言C++是一种功能强大且广泛应用的程序设计语言,作为一名程序员,掌握C++语言的重点难点是非常重要的。本文将对C++面向对象程序设计语言的重点...

    东北大学软件学院面向对象程序实验设计实验代码(全)

    在东北大学软件学院的面向对象程序设计实验中,学生们将深入学习和实践这些概念。 实验一通常会介绍基本的面向对象概念,如类(Class)和对象(Object)。类是创建对象的模板,定义了对象的属性(Attributes)和...

    面向对象程序设计C++听课笔记

    面向对象程序设计(Object-Oriented Programming,简称OOP)是现代计算机编程中的一种核心概念,C++语言是实现这一概念的重要工具。本篇笔记基于中山大学博士的视频讲授和浙江大学副教授的课堂记录,旨在深入浅出地...

    面向对象程序设计B课程考核

    面向对象程序设计(Object-Oriented Programming, OOP)是一种编程范式,其核心思想是将现实世界中的事物抽象为“对象”,并通过这些对象来设计软件系统。面向对象的四大特性包括封装性、继承性、多态性和抽象性。 ...

    C++面向对象程序设计习题解析与上机指导

    《C++面向对象程序设计习题解析与上机指导》是一本专为学习C++面向对象编程的学生设计的辅助教材。这本书旨在帮助读者深入理解C++的面向对象特性,包括类、对象、封装、继承、多态等核心概念,并通过一系列习题和...

    大学C++《面向对象程序设计I》所有实验报告

    在大学的《面向对象程序设计I》课程中,C++是一种重要的编程语言,因为它支持面向对象编程(OOP)的概念,这些概念包括封装、继承和多态性。本实验报告集合旨在帮助学生深入理解并实践这些核心原则。下面将详细讨论...

    面向对象的程序设计

    面向对象程序设计的概念最早可以追溯到20世纪50年代初,但直到1980年,Grady Booch才正式提出了面向对象设计的概念。在此之前,程序设计主要依赖于面向过程的方法,这种方法虽然有效,但在处理复杂问题时存在局限性...

    java基础教程_第2部分面向对象程序设计

    面向对象程序设计(Object-Oriented Programming, OOP)是一种编程范式,它通过模拟现实世界中的对象来构建软件系统。OOP的核心概念包括**类**、**对象**、**封装**、**继承**和**多态**。 1. **对象**:对象是面向...

    VC++面向对象与可视化程序设计(第三版)黄维通 第六章

    第六章的内容在“VC++面向对象与可视化程序设计(第三版)黄维通”中主要聚焦于面向对象编程(OOP)的概念以及如何利用Microsoft Visual C++(VC++)进行可视化程序设计。黄维通老师的这本书是许多学习者深入理解C++...

    面向对象程序设计大作业报告.doc

    【面向对象程序设计大作业报告】 本报告将深入探讨面向对象程序设计(Object-Oriented Programming,OOP)的关键概念和应用,通过一系列实例来阐述其核心思想。面向对象编程是一种编程范式,它基于“对象”的概念,...

    JAVA面向对象程序设计(期末考试试题及答案).pdf

    JAVA面向对象程序设计知识点总结 JAVA面向对象程序设计是计算机科学和软件工程中的一种编程范式,旨在设计和实现更加灵活、可维护、可扩展的软件系统。本文将根据《JAVA面向对象程序设计(期末考试试题及答案).pdf》...

    【面向对象程序设计】Java大作业 租车系统V4.0

    【面向对象程序设计】Java大作业 - 租车系统V4.0是一个综合性的项目,旨在教授和应用Java编程语言的面向对象特性,同时结合数据库管理技术,构建一个汽车租赁管理平台。在这个项目中,学生将面临设计和实现一套完整...

    2022年面向对象程序设计大作业.doc

    面向对象程序设计大作业知识点 一、面向对象程序设计概述 面向对象程序设计(Object-Oriented Programming, OOP)是一种程序设计方法,强调模块化、抽象、继承、多态和封装等特性。它是现代软件开发的主要编程方法...

    面向对象编程基础_python面向对象_python教程_

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作这些数据的方法封装在一起。在Python中,面向对象编程是其核心特性之一,使得Python成为了一种非常适合...

    Java面向对象程序设计-电子教案.rar

    Java面向对象程序设计是计算机科学中的一个重要概念,它在软件开发中扮演着核心角色。本电子教案涵盖了这一主题的关键知识点,旨在帮助学习者理解和掌握Java编程中的面向对象思想和技术。 一、面向对象编程基础 ...

    面向对象程序设计基础(C++)

    面向对象程序设计基础是计算机科学中的重要概念,尤其在C++这种强大且广泛使用的编程语言中,它是理解和编写复杂软件的基础。本教程由中山大学提供,专为C++初学者设计,通过十二个章节深入浅出地介绍了面向对象编程...

Global site tag (gtag.js) - Google Analytics