`
emowuyi
  • 浏览: 1535525 次
文章分类
社区版块
存档分类
最新评论

面向对象的原则

 
阅读更多
1.SRP单一职责原则[适用于类功能]
(就一个类而言,应该仅有一个引起它变化的原因.)
详细说明:
如果一个类承担的职责过多,就等于把这些职责耦合在一起.
一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力.
这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏.
结论:
它是所有类设计原则最简单的,也是最难正确使用的.
我们会自然的把职责结合在一起,软件设计真正要做的内容就是发现职责并把那些职责相互分离.


2.OCP开放-封闭原则[适用于类抽象]
(软件实体(类,模块,函数...)应该是可以扩展的,但是不可以修改.)
详细说明:
OCP=对于扩展是开放的,对于修改是封闭的.
如果程序中的一处改动就会产生连锁反应,导致一系列相关模块的改动,那么设计就有臭味.
OCP建议我们如果要对系统进行重构,就只需要添加新的代码,而不必改动已经正常运行的代码.
结论:
在许多方面,OCP都是面向对象设计的核心.
尊循它可以带来巨大的好处(程序的灵活性,可重用性,可维护性).
在代码中肆意使用OCP也不是一个好主意.
正确的做法是:开发人员仅仅对程序中呈现频繁变化的部分做出抽象!拒绝不成熟的抽象和抽象本身一样重要!

3.LSP Liskov替换原则[适用于类层次]
(子类型必须能够替换掉它们的基类型.)
详细说明:
Barbara Liskov在1988年说道:
Liskov替换性质:若对每个类型S的对象O1,都存在一个类型T的对象O2,
在所有针对类型T编写的程序P中,用O1代换O2后,程序P行为功能不变,则类型S是类型T的子对象.
结论:
LSP是使用OCP开放-封闭原则成为可能的主要原则之一,
正是子类型的可替换性才能用基类类型(基类引用或者指针)的模块在无需修改的情况下就可以扩展.
这种可替换性是开发人员可以隐式依赖的东西.
因此,如果没有显示的强制基类类型的契约,那么代码就必须良好并明显的表达出这一点.
术语"IS-A"不能作为子类型的定义,
子类型的正确定义是"可替换性","可替换性"可以通过显式或者隐式的(动态绑定必须用基类类型)契约.

4.DIP依赖倒置原则[适用于类层次]
(抽象不应该依赖细节.细节应该依赖抽象.)
详细说明:
a.高层模块不应该依赖于低层模块,二者都应该依赖抽象(使用接口或者虚类来连接).
b.抽象不应该依赖于细节,细节应该依赖于抽象.
结论:
使用传统的过程化程序设计方法所创建出来的依赖关系结构和策略是依赖于细节.
DIP使得细节和策略都依赖于抽象,并且常常为客户定制服务接口.
事实上,这种依赖关系的倒置是好的面向对象的程序设计的标记.
DIP正确应用对于可重用框架是必须的,对于构建在变化面前富有弹性的代码也是非常重要的.
由于抽象和细节被DIP彼此隔离,所以代码也非常容易维护.




5.ISP接口隔离原则[适用于类的接口]
不应该强迫客户程序依赖于它们不用的方法.
接口属于客户,不属于它所在的类层次结构.
详细说明:
分离客户就是分离接口.分离接口有2种方法:委托和多重继承
接口隔离原则是用来处理胖接口所具有的缺点.
如果类接口不是内聚的,就表示该类的接口是胖的,需要减肥.
减肥的原则是接口分成多组方法,每一组方法都服务于一组不同的客户程序!
客户程序面对的就是多个具有内聚接口的抽象基类.


结论:
胖类会导致它们的客户程序之间产生不正常的有害的耦合关系.
当客户程序要求胖类进行一个改动时,会影响到所有其它户程序.
因此,程序应该仅仅依赖于它们实际调用的方法.
通过把胖类的接口分解为多个特定的客户程序的接口,可以实现这个目标.
每个特定于客户程序的接口仅仅声明它自己调用的函数.
解除了类的客户程序之间依赖关系,使它们互不依赖.


6.REP重用发布等价原则[适用于包]
(重用的粒度就是发布的粒度)
详细说明:
当你重用别人一个类库时,你的期望是什么?
当然是好的文档,可以工作的代码,规格清晰的接口!
你希望作者会一直维护类库代码,当作者都把类库的接口和功能进行任何改变时,你希望得到通知.
代码的作者把它们的软件组织到一个包中(dll,jar,...),所以我们重用的粒度就是包的发布粒度.
结论:
一个包的重用粒度和和发布粒度一样大,由于重用性是基于包的,所以可重用的包必须包含可重用的类.



7.CCP共同封闭原则[适用于包]
(包中的所有类对于同一类性质的变化应该是共同封闭的.
一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其它包不造成任何影响.)
详细说明:
这是SRP单一职责原则对包的重新规定.这规定了一个包不应该包含多个引用包变化的原因.
在大多数应用中,可维护性超过可重用性.
代码更改:如果代码要更改,原意更改都集中在一个包中,而不是分布于多个包中.
代码发布:我们也只发布更改中的包!
结论:
CCP鼓励我们把可以由于同样的原因而更改的所有类共同聚集在同一个包中.


8.CRP共同重用原则[适用于包]
(一个包中的所有类应该是共同重用的.
如果重用了包中的一个类,那么就要重用包中的所有类.)
详细说明:
一个包中的所有类应该是共同重用的.
结论:
如果重用了包中的一个类,那么就要重用包中的所有类.
这个原则可以帮助我们决定哪些类应该放进同一个包中.


9.ADP无环依赖原则[适用于包]
(在包的依赖关系图中不允许存在环.)
详细说明:
如果开发环境中有许多开发人员都在更改相同的源代码文件集合的情况,
因为有人比你走的晚,且改了你所依赖一些东西(类或者方法),第二天来上班,
你昨天完成的功能,今天不能正常工作,那么就会发生"晨后综合症"!
针对此问题有两个解决方案:"每周构建"和"消除依赖环"
每周构建:应用于中等规模的项目中,它的工作方式为:每周1-4,开发人员各自工作在私人的代码空间,周5-6联合调试!
消除依赖环:通过把开发环境划分成可发布的包,可以解决依赖环.
结论:
解决包之间的依赖环有两个主要方法:
1.使用依赖倒置原则,在类和依赖类之前添加一个依赖的接口或者抽象类,解除依赖环.
2.添加新类,把类和依赖类之间的依赖移到一个新的类,解除依赖环.




10.SDP稳定依赖原则[适用于包]
(朝着稳定的方向进行依赖.)
详细说明:
设计不是完全固定的,要使设计可维护,某种程序的易变性是必要的.
使用这个原则,我们可以创建对某些变化类型敏感的包.


其它的包不要依赖这个要变的包.
软件包就可以分为稳定包和可变包!
如何识别稳定包和可变包?如果许多其它的包都依赖此包,那么它就是稳定包,否则就是可变包!
把包放在不同的位置,它的稳定性是不同的.
如何计算一个包的不稳定性?(输入耦合度Ca,输出耦合度Ce)
不稳定值=Ce/(Ca+ce),此值越低越稳定!
结论:
把可变包不稳定值降低的方法是:为它加上一个抽象外衣(interface/抽象类),其它包调用抽象外衣!
可变包为抽象外衣的实现!




11.SAP稳定抽象原则[适用于包]
(包的抽象程序应该和其它稳定程序一致.)
详细说明:
此原则把包的稳定性和抽象性联系到一起.
一个稳定的包应该是抽象的,这样它的稳定性就不会使其无法扩展;
一个不稳定的包应该具体的, 这样它的不稳定性使代码易于修改.


结论:
它指出一个包有时候应该达到部分是可抽象的,部分是不稳定的原则

分享到:
评论

相关推荐

    java开发面向对象原则

    Java 开发面向对象原则 面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,旨在提高软件的可维护性、灵活性和可重用性。面向对象原则是编写高质量代码的基础,以下是五大基本原则: 一、面向接口...

    设计模式中的面向对象原则及其子模式

    ### 设计模式中的面向对象原则及其子模式 #### 一、引言 随着软件系统规模的不断扩大和技术的迅速发展,如何提高软件的可复用性和灵活性成为了一个亟待解决的问题。面向对象技术作为一种有效的手段,已经在软件...

    面向对象原则.zip

    1面向对象6大原则--单一职责原则 2面向对象6大原则--里氏代换原则 3面向对象6大原则--开闭原则 4面向对象6大原则--依赖倒转原则 5面向对象6大原则--合成复用原则 6面向对象6大原则--接口隔离原则

    面向对象设计原则

    面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则

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

    首先,让我们了解面向对象设计的基本原则,它们包括单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)。这些原则指导我们如何编写高质量的、易于维护的代码。 1. 单一...

    面向对象七大原则

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

    UML面向对象设计基础

    ### UML面向对象设计基础 #### 基本概念与符号表示 ...该书不仅帮助开发者理解面向对象设计的细节,而且鼓励他们有意识地在编程之前进行良好的设计,最终设计出更符合面向对象原则的高质量软件系统。

    C++设计模式全解析-面向对象原则与常见设计模式深入讲解

    接着详述六大面向对象设计原则(单一职责原则、开闭原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特法则)、合成复用原则等,并通过代码例子解释其应用和意义。此外,还讨论了三大类别的设计模式,包括创建...

    面向对象设计原则.ppt

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

    pku面向对象高级教程

    此外,"面向对象设计-人机交互设计.ppt"可能会讲解如何利用面向对象原则来设计用户界面,确保良好的用户体验。 "面向对象分析-交互图.ppt"可能涵盖序列图和协作图,这些图描述了对象之间的动态交互,帮助我们理解...

    面向对象分析与设计课程设计(餐厅点菜系统).pdf

    代码实现需要程序员根据设计图来编写符合面向对象原则的代码。测试则是确保系统按照预期工作的关键步骤。在维护阶段,随着用户需求的变化,系统可能需要相应的更新和调整。 总结来说,面向对象分析与设计是一种系统...

    2019-2020山东大学软件学院面向对象设计与分析

    - 编写代码实现上述场景的具体细节,如创建特定的类、接口、方法,并确保符合面向对象原则,如封装、继承和多态。 通过以上的讨论,我们可以看到面向对象设计与分析在实际问题解决中的重要性,以及如何利用这些...

    面向对象分析与设计试题与答案

    本题集主要考察面向对象编程的基础知识,包括语言特性、面向对象原则、类与对象、继承、多态、封装以及UML(统一建模语言)的应用。 1. UML(统一建模语言)的出现和发展,使得面向对象分析与设计成为主流的软件...

    《C#面向对象设计模式纵横谈》.pdf

    在C#中实现这些模式,不仅可以提高代码的可复用性、可维护性和可扩展性,还可以帮助开发者编写出更加清晰、高效、符合面向对象原则的代码。掌握这些模式,对于任何希望在软件开发领域取得成功的开发者来说,都是至关...

    面向对象实验unit1

    通过实践,你可以更好地理解和应用面向对象原则,如封装、继承和多态性。 此外,理解UML类图不仅有助于设计阶段,还有助于团队间的沟通。当你用UML类图向他人展示你的设计时,他们能快速理解你的思路,从而减少误解...

    华农面向对象分析与设计试卷

    在华农的试卷中,可能会遇到关于这些概念的理论题目,也可能需要分析实际案例,比如设计一个简单的类结构图或UML图,或者解释某个设计决策如何体现了面向对象原则。 **答案部分**: 描述中提到试卷有基本的答案,这...

    北京大学面向对象上机考试

    在北京大学的面向对象上机考试中,学生不仅需要掌握这些理论知识,还需要能够运用到实际编程中,解决具体问题,编写出符合面向对象原则的代码。这将考验学生的逻辑思维、问题解决能力和代码组织能力。通过这样的考试...

    面向对象分析与设计(第3版)

    8. **敏捷开发**:随着敏捷方法的普及,书中的内容可能也会讨论如何在敏捷环境中应用面向对象原则,如迭代开发、用户故事等。 9. **重构**:重构是改善现有代码结构的过程,保持代码可读性和维护性,而不会改变其...

    深入浅出面向对象分析与设计源码(完整)

    源码文件列表中的"OOA"可能代表面向对象分析,这可能包含一系列示例代码,演示如何应用面向对象原则进行系统分析,如何定义类和对象,如何使用继承和多态,以及如何实施设计模式。通过这些源码,学习者可以更直观地...

    面向对象的分析、设计和实现-第二版-英文版 pdf

    这种综合方法有助于读者更好地理解面向对象原则在实际开发过程中的应用。 本书是Undergraduate Topics in Computer Science系列的一部分,这个系列专注于为计算机科学和信息科学领域的本科生提供高质量的教学内容。...

Global site tag (gtag.js) - Google Analytics