面向对象系统设计——包的设计原则

简介: 面向对象系统设计——包的设计原则

1.共同封闭(CCP:The Common Closure Principle):

 包中的所有类对于同一类性质的变化应该是共同封闭的。


 一个包中所有的类应该对同一种类型的变化关闭。一个变化影响一个包,便影响了包中所有的类。


 一个更简短的说法是:Classes that change together, belong together.一起修改的类,应该组合在一起(同一个包里)。


 如果必须修改应用程序里的代码,我们希望所有的修改都发生在一个包里(修改关闭),而不是遍布在很多包里。


 CCP原则就是把因为某个同样的原因而需要修改的所有类组合进一个包里。如果2个类从物理上或者从概念上联系得非常紧密,它们通常一起发生改变,那么它们应该属于同一个包。

CCP与开闭原则(OCP: Open Closed Principle)

 两者有着很深的渊源关系,CCP的“关闭”(closure)就是OCP所提倡的:类应该对修改关闭,对扩展开放。但我们知道,100%的“关闭”是不现实的,我们在设计系统时,只能尽量地保持对大多数可预见的修改关闭。


 CCP延伸了OCP的“关闭”概念,当因为某个原因需要修改时,把需要修改的范围限制在一个最小范围内的包里。


 CCP原则帮助我们决定哪些类应该被放到同一个包里。

2.共同重用(CCP):

  一组接口中应该是共同重用的。如果重用了组中的一个类,那么就要重用包中的所有的类。相互之间没有紧密联系的类不应该在同一组中。

  这个原则强调了分类,就具有相同关系或者关联比较紧密的类应该分到一组中,方便修改和客户端的调用。

3.无依赖原则(ADP:Acyclic Dependencies Principle):

 发布的多组接口中它们之间的依赖关系不能存在闭环。


 包之间的依赖结构必须是一个直接的无环图形,也就是说,在依赖结构中不允许出现环(循环依赖)。如果包的依赖形成了环状结构,怎么样打破这种循环依赖呢?有2种方法可以打破这种循环依赖关系:


第一种方法是创建新的包,如果A、B、C形成环路依赖,那么把这些共同类抽出来放在一个新的包D里。这样就把C依赖A变成了C依赖D以及A依赖D,从而打破了循环依赖关系。

第二种方法是使用DIP(依赖倒置原则)和ISP(接口分隔原则)设计原则。

 无环依赖原则(ADP)为我们解决包之间的关系耦合问题。在设计模块时,不能有循环依赖。

4. 稳定依赖原则(SDP:The Stable Dependencies Principle)

 是为了解决包设计的依存问题的。


 包之间的依赖关系都应该是稳定方向依赖的,包要依赖的包要比自己更具有稳定性。


 包的依赖定义 :包A中的类利用包B中的类的场合,就称包A依赖于包B。

 稳定依赖原则 :稳定就是没有变化。


稳定包 :


1.自己没有依赖其他包,也就是自己一个完全独立的。


2.其他有很多包依赖于自己。依赖的包越多,自己的责任越大。



不稳定包 :


1.自己依赖其他多个包,也就是自己不是独立的。


2.没有依赖于自己的其他包。也就是自己对其他包没有责任。


不稳定度的计算公式:I=Ce/(Ce+Ca)。

5.稳定抽象等价原则(SAP:The Stable Abstractions Principle )

 最稳定的包应该是最抽象的包。不稳定的包应该是具体的包。包的抽象程度跟它的稳定性成正比。


 换成另一个说法是:稳定的包应该是抽象的包。


 包的稳定抽象等价原则:


 上面说到包的稳定性:不容易改变的包应该具有更好的稳定性。一个包的抽象程度越高,它的稳定性就越高。反之,它的稳定性就越低。一个稳定的包必须是抽象的,反之,不稳定的包必须是具体的。


 稳定的包的构成:


 抽象类或接口通过子类继承扩展行为,这表示抽象类或接口比它们的子类更具有稳定性。总之,为了构成稳定的包,应该提高包内的抽象类或接口的比率;它们的子类可以放在另一个不稳定的包内,该包依赖上述稳定的包,从而遵循了稳定依赖原则(SDP)。


 理想的体系结构应该是:


不稳定的(容易改变的)包处于上层:它们是具体的包实现

稳定的(不容易改变的)包处于下层:不容易改变,但容易扩展;接口比实现(具体的运行代码)在内在特性上更具有稳定性

 稳定抽象等价原则(SAP)为我们解决包之间的关系耦合问题。在设计包结构时,稳定的包应该是抽象的(由抽象类或接口构成),不稳定的包应该是具体的(由具体的实现类构成)。


相关文章
|
7月前
|
数据可视化 测试技术
面向对象系统分析与设计
【1月更文挑战第10天】面向对象系统分析与设计。
82 0
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
3月前
|
设计模式 存储 算法
《设计模式:可复用面向对象软件的基础(典藏版)》
本书是埃里克·伽玛著作,涵盖180个笔记,主要介绍面向对象设计模式,包括MVC、设计模式编目、组织编目、实现描述、复用机制、运行时与编译时结构关联、设计支持变化等方面。书中详细解释了23种设计模式,如Abstract Factory、Adapter、Bridge、Builder等,按创建型、结构型、行为型分类,旨在提高软件可复用性和灵活性。
240 0
《设计模式:可复用面向对象软件的基础(典藏版)》
|
6月前
|
关系型数据库 数据库连接 开发者
面向对象设计原则与实践
面向对象设计原则与实践
面向对象七大设计原则,看了必会(代码详细版)(中)
面向对象七大设计原则,看了必会(代码详细版)(中)
|
7月前
|
设计模式 存储 前端开发
【软件设计师备考 专题 】面向对象设计方法:体系结构、类的设计和用户接口设计
【软件设计师备考 专题 】面向对象设计方法:体系结构、类的设计和用户接口设计
123 0
|
存储 缓存 搜索推荐
复杂系统设计原则与案例
## 一、复杂是软件的本质属性 ### 1.1 复杂是软件的本质属性 正如Brooks所言,软件复杂性是软件固有的属性,这种固有的复杂性主要由4个方面的原因造成的: - 问题域的复杂性 - 管理开发过程的复杂性 - 随处可变的灵活性 - 描绘离散系统行为的问题 上面每一个方面都有极大的挑战,以「问题域的复杂性」为例,现在我们的大型系统中,动不动就几十个应用,组合在一起就是一个复杂的系统,而每个
1471 4
复杂系统设计原则与案例
|
关系型数据库
面向对象七大设计原则,看了必会(代码详细版)(上)
面向对象七大设计原则,看了必会(代码详细版)(上)
面向对象七大设计原则,看了必会(代码详细版)(下)
面向对象七大设计原则,看了必会(代码详细版)(下)
|
设计模式 数据库
面向对象的七大设计原则
面向对象的七大设计原则
297 0