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

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

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


相关文章
|
8月前
|
Kubernetes Java 调度
Java 开发者的 Kubernetes 通关指南:从部署原理到运维实战,底层逻辑一次讲透
本文系统讲解Java应用在Kubernetes中的落地实践,涵盖核心架构适配、容器化要点(JVM与Cgroup协同)、Deployment/Service/Ingress等关键资源详解、调度原理与优化(反亲和性、拓扑分布等)、滚动/蓝绿/金丝雀发布策略、HPA弹性伸缩、监控告警及10大高频坑点规避,助力Java开发者真正掌握云原生运维能力。
645 3
|
5月前
|
存储 人工智能 机器人
从工具到伙伴:深度解析智能体(AI Agent)的架构演进与未来范式
本文深度解析AI智能体(Agent)从工具到伙伴的范式跃迁,系统阐述其“感知-规划-行动-反思”四大核心架构、主流框架(LangGraph/AutoGen/CrewAI等)、关键技术挑战及多模态、具身智能等未来方向,为技术决策者提供全景式实践指南。
|
11月前
|
XML 算法 安全
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
RAG通过检索与生成结合,提升大模型在企业场景中的准确性与可控性。分块策略是其核心,直接影响检索效率与回答质量。本文系统解析固定大小、语义、递归、基于结构和LLM的五种分块方法,对比优缺点及适用场景,并探讨RAG在知识关联、多模态理解等方面的前沿挑战与优化路径。
656 0
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
|
人工智能 安全 算法
山东电力调度的AI“向新力”:电力调度,从“人工经验”到“数智赋能”的跃迁之路
国网山东电力携手阿里云及南瑞集团,打造“电网调度智慧大脑”,通过AI技术实现电力调度从自动化向智能化的跨越。该系统基于国产算力和大模型,融合气象、电网运行等多源数据,提升负荷预测、故障处置等能力,为新型电力系统建设提供“山东方案”。
1679 0
|
存储 JSON 自然语言处理
数据标注工具 doccano | 命名实体识别(Named Entity Recognition,简称NER)
标注数据保存在同一个文本文件中,每条样例占一行且存储为json格式,其包含以下字段 • id: 样本在数据集中的唯一标识ID。 • text: 原始文本数据。 • entities: 数据中包含的Span标签,每个Span标签包含四个字段: • id: Span在数据集中的唯一标识ID。 • start_offset: Span的起始token在文本中的下标。 • end_offset: Span的结束token在文本中下标的下一个位置。 • label: Span类型。 • relations: 数据中包含的Relation标签,每个Relation标签包含四个字段: • id: (Span
1303 0
|
存储 人工智能 分布式计算
Parquet 文件格式详解与实战 | AI应用开发
Parquet 是一种列式存储文件格式,专为大规模数据处理设计,广泛应用于 Hadoop 生态系统及其他大数据平台。本文介绍 Parquet 的特点和作用,并演示如何在 Python 中使用 Pandas 库生成和读取 Parquet 文件,包括环境准备、生成和读取文件的具体步骤。【10月更文挑战第13天】
4077 60
|
测试技术
po+selenium+unittest自动化测试项目实战
po+selenium+unittest自动化测试项目实战
4220 0
 po+selenium+unittest自动化测试项目实战
|
人工智能 搜索推荐 语音技术
传音X阿里云,乘AI出海!
传音X阿里云,乘AI出海!
884 1
|
机器学习/深度学习 数据采集 人工智能
动手实践:从零开始训练AI模型的全面指南
【7月更文第14天】随着人工智能技术的飞速发展,训练AI模型已成为科研、工程乃至创业领域的热门技能。本文旨在为初学者提供一个清晰、实用的指南,带领大家从零开始,了解并实践如何训练一个人工智能模型。我们将以一个简单的线性回归任务为例,逐步深入,探讨数据预处理、模型构建、训练过程及评估方法,最后展示如何使用Python和深度学习库PyTorch实现这一过程。
7960 0
|
负载均衡 大数据 测试技术
docker容器技术有哪些应用场景?
docker容器技术有哪些应用场景?
1082 5

热门文章

最新文章