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

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

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)为我们解决包之间的关系耦合问题。在设计包结构时,稳定的包应该是抽象的(由抽象类或接口构成),不稳定的包应该是具体的(由具体的实现类构成)。


相关文章
Dataset之Boston:Boston波士顿房价数据集的简介、下载、使用方法之详细攻略
Dataset之Boston:Boston波士顿房价数据集的简介、下载、使用方法之详细攻略
|
6月前
|
Web App开发 网络协议 应用服务中间件
HTTP2.0 从原理到实践,保证把你治得服服帖帖!
HTTP/2 是 HTTP/1.1 的重要升级,通过多路复用、头部压缩、服务器推送等特性显著提升性能与效率。本文详细解析了 HTTP/2 的优势、配置方法及实际应用,涵盖 Nginx/Apache/IIS 配置、curl 测试工具使用,并对比 HTTP/1.1 指出其优化点。同时提醒需注意 HTTPS 支持、客户端兼容性等问题,助你高效掌握并运用 HTTP/2 技术。
754 5
HTTP2.0 从原理到实践,保证把你治得服服帖帖!
|
10月前
|
Python
Numpy中的矩阵运算
通过本文的详细讲解,您已经掌握了NumPy中的矩阵运算,包括基础数组创建、基本运算、矩阵乘法、逆、行列式以及广播机制等。NumPy是进行科学计算的重要工具,灵活运用它将大大提升您的工作效率。
282 13
|
机器学习/深度学习 数据处理 计算机视觉
LabelStudio环境搭建以及使用且解除上传文件限制
LabelStudio是开源的数据标注工具,支持多种类型如文本、图像、音频、视频的标注任务。它具有多种标注类型、可扩展性、团队协作和版本控制等功能,并可在本地、云端或Docker中部署。通过设置环境变量`DATA_UPLOAD_MAX_NUMBER_FILES`,可以解除上传文件数量限制。使用Docker安装时,可运行包含该变量的命令以启动容器,并通过http://localhost:8080访问。遇到文件数限制问题,可增大此变量值以解决。
4181 3
|
存储 NoSQL 数据库
知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
|
机器学习/深度学习 数据采集 算法
Python基于KMeans算法进行文本聚类项目实战
Python基于KMeans算法进行文本聚类项目实战
|
人工智能 Oracle Java
蚂蚁 CodeFuse 代码大模型技术解析:基于全仓库上下文的代码补全
CodeFuse 代码补全插件是 CodeFuse 系列产品中用户数量最多、留存率最大,调用AI能力最多的产品~欢迎大家体验试用https://github.com/codefuse-ai/RepoFuse
2286 7
蚂蚁 CodeFuse 代码大模型技术解析:基于全仓库上下文的代码补全
|
自然语言处理 资源调度 机器人
10G显存,使用Unsloth微调Qwen2并使用Ollama推理
本文主要使用Unsloth基于Qwen2基础模型微调对话机器人以及在Ollama上运行。
|
设计模式 数据采集 机器学习/深度学习
软件体系结构 - 架构风格(2)管道/过滤器架构风格
【4月更文挑战第21天】软件体系结构 - 架构风格(2)管道/过滤器架构风格
1771 0
|
SQL 关系型数据库 MySQL
qt登录界面简单制作,是真的保姆级别了!!!
qt登录界面简单制作,是真的保姆级别了!!!