【软件架构】【设计原则】详解正交设计原则

举报
huahua.Dr 发表于 2022/10/15 12:15:34 2022/10/15
【摘要】 一、什么是正交设计原则正交出现在数学中,是相互垂直的两个向量,简单来讲就是平面上的两个垂直线段,其中一个线段变长或减短或者转圈圈,另外一根是不变的也不影响它们的垂直度的。表现为空间的独立性,在软件中我们可以理解为两个只有交叉点而互不影响的模块,是一种相互正交的模块化思想,模块内有更高的内聚,与模块外有更低的耦合,只有一个不变的交叉点,这个交叉点就是我们所说的接口。而我们所说的正交设计原则,就...

一、什么是正交设计原则

正交出现在数学中,是相互垂直的两个向量,简单来讲就是平面上的两个垂直线段,其中一个线段变长或减短或者转圈圈,另外一根是不变的也不影响它们的垂直度的。表现为空间的独立性,在软件中我们可以理解为两个只有交叉点而互不影响的模块,是一种相互正交的模块化思想,模块内有更高的内聚,与模块外有更低的耦合,只有一个不变的交叉点,这个交叉点就是我们所说的接口。而我们所说的正交设计原则,就是要保持模块内高内聚模块外低耦合的正交性稳定不变。

二、如何满足并保持正交设计原则

满足正交设计原则的系统,会具有更好的可重用性;主要保持接口不变,那么模块之间的关系通过接口依赖,则各个模块可以做到独立演进,符合架构持续演进重构的特征。那么如何保持这个正交原则呢,最终目的就是为了高内聚和低耦合;需要满足以下四个基本要点:

  • 消除重复(被动)。体现了低耦合
  • 分离关注点(主动)。也叫分离不同方向变化,是整个模块化思想的延伸,也就是单一职责和组合复用的表现
  • 缩小依赖范围(主动)。体现高内聚,迪米特法则的表现
  • 依赖于稳定(主动)。耦合点的体现,依赖稳定的接口;是接口分离原则换了一个说法

三、如何实现正交设计原则

我们结合上面的四个基本要点来说明

1)消除重复

导致存在重复的原因常有:

  • 低成本(拷贝粘贴)
  • 对于变化的恐惧(另起炉灶)
  • 不易识别(代码混乱)
  • 价值导向(不重视内部质量)
  • 认知差异(不具备敏锐的洞察力)

消除重复有几大分类,处理的策略也不同:

  • 类或方法完全重复直接删掉重复即可,保留一份复用即可
  • 参数型重复:两个函数的算法相同,只是处理的数据不同,将差异的数据参数化传递即可。
  • 调用型重复:如果两个函数的调用部分完全相同,可以将相同的部分提取为函数F,然后原函数各自对F进行调用。
  • 回调型重复:如果两个函数的回调部分完全相同,可以将相同的部分提取为函数F,将差异的部分形成原型相同的两个函数s1s2,然后通过F分别对s1s2进行调用

2)分离关注点

什么是关注点?

关注点,就是上面所说的耦合点,正交点,那么在软件上我们怎么理解这个关注点呢,就是从一个行为角度去看具备什么功能,我们了解软件上可以做很多分层,就是从这个关注点切入,划分不同层次的功能面,比如有:

  • 应用层:关注点是展示的多样性、交互的体验性
  • 业务层:关注点是业务流程的编排
  • 领域层:关注点是核心业务模型,如何更好的支撑业务
  • 资源层:关注点是数据的存取

这不就是单一职责么,每个层面只关注自己范围内的职责。

如何分离这些关注点?

小到一个函数,大到一个类,再或者是一个包,甚至更大的是一个层,都可以看作是一个关注点,关注点常见划分的手段有两种:

  • 功能(职责):平时说的边界也是在分离各自己的关注点,划分边界也是体现了单一职责。
  • 业务语义:在领域建模中经常使用到,根据业务语义进行拆分,不同的对象放在不同的域内,如有订单域、商品域、交易域、结算域等等,它们的业务含义是不一样的。

具体如何做:

  1. 拆分:如何拆分也可以按照功能和业务语义进行拆分
  2. 归类:在拆分的基础上做合并和抽象,哪些要放在一起,哪些是具有层次依赖的,这些最终是要形成一个整体

实现例子:

  • 面向接口编程:接口关注的是能做什么;接口的实现关注的是如何做的问题。
  • 配置文件:把具体的实现写在配置文件里,像数据库的驱动、连接都可以写在配置文件里。只关注有数据库的服务,不关注具体的数据库是什么。
  • 工厂模式:工厂类帮我们管理了对象
  • 默认约定:默认约定大于配置是现在流行的做法,它本质来讲和配置文件没有什么太大的区别。
  • 关注点开放:找出共性的东西作为核心能力,将业务会变的部分开放出去,给业务方自己去做,我们只做核心的功能。可以把变的部分抽象出一个接口出来,具体的实现由业务方去实现,我们要提供的核心能力就是解析出业务方写的代码。在典型的具有模板结构中可以应用此法。

3)缩小依赖范围

  • 尽可能减少依赖点的数量;
  • 依赖点应包含尽可能少的知识;
  • 依赖点也应该高内聚,而不应该强迫依赖方依赖它不需要的东西;

4)依赖于稳定

依赖点越稳定,依赖方受依赖点变化影响的概率越低。

如何让依赖更趋于稳定:

  • 站在需求的角度,而不是实现的角度定义依赖点(API),会让API更加稳定。
  • 需求是不断变化的,必须对需求进行抽象和建模,找出其中共性本质的东西,才能使API更加稳定。

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。