【架构基础】正交设计四原则

news2024/10/6 0:35:28

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

软件中的正交设计之正交四原则,最终目的是为了实现软件的高内聚低耦合架构。它是一种与范式,语言无关的设计原则。为了解决软件系统向未来演进的过程中,如何让软件在尽量长的时期范围内更容易应对变化,降低项目后期的人力投入成本。

正交四原则:

1 消除重复

2 分离关注点

3 缩小依赖范围

4 向着更稳定的方向依赖

消除重复

重复是万恶之源(Duplication is root of all evil)。

什么是重复代码?重复是不同的代码元素对同一知识进行了多次描述,无论描述方式是否一致。

消除重复的过程,本身就是一个提高系统可重用性的过程,而后者又会进一步降低未来产生重复的可能性。

消除重复原则对应SOLID原则中的单一职责原则(SRP)。

分离关注点

所谓关注点,小到一个函数,大到一个类,再或者是一个包,甚至更大的一个软件分层,都可以看作是一个关注点。从行为的角度看,是一个个功能职责,即在某个层面上,可以清晰描述它完成一件什么样的具体事情。

分离关注点,也即分离不同方向变化,是整个模块化思想的延伸,也就是单一职责和组合复用的表现。

缩小依赖范围

软件系统需要通过组件或模块之间的相互协作来实现各种功能。两个组件间的读写交互就会产生依赖关系。

依赖不可消除;否则,软件系统将毫无价值。

但是,为了实现一个功能,作为软件设计人员应尽可能地缩小依赖范围,避免不必要的依赖。

如何缩小依赖范围?如尽可能减少依赖点的数量,依赖点应该包含尽可能少的知识,依赖点应该高内聚,不应该强迫依赖方依赖它不需要的东西。

缩小依赖范围体现了高内聚,是迪米特法则的表现。

向着更稳定的方向依赖

依赖点越稳定,依赖方受依赖点变化的影响就越小。

站在需求的角度,而不是实现方式的角度定义依赖点(如API),会让依赖点更稳定。

需求是不断变化的,必须对需求进行抽象和建模,找出其中本质的东西,可以能使API的实现更稳定。

向着更稳定的方向依赖,是接口分离原则(ISP)的另一种说法。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/633432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot0+java+vuie个人家庭财务理财系统

。本文介绍了个人理财系统的开发全过程。通过分析个人理财系统管理的不足,创建了一个计算机管理个人理财系统的方案。文章介绍了个人理财系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。 本个人理财系…

【数据湖架构】在 Azure Data Lake Storage (ADLS)二代上构建数据湖

介绍 一开始,规划数据湖似乎是一项艰巨的任务——决定如何最好地构建数据湖、选择哪种文件格式、是拥有多个数据湖还是只有一个数据湖、如何保护和管理数据湖。并非所有这些都需要在第一天回答,有些可能通过反复试验来确定。构建数据湖没有明确的指南&am…

【C++】一文带你吃透C++多态

🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 C/C专栏 🌙那些看似波澜不惊的日复一日,…

【链表part02】| 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、02.07.链表相交、142.环形链表

目录 ✿LeetCode24.两两交换链表中的节点❀ ✿LeetCode19.删除链表的倒数第N个节点❀ ✿LeetCode面试题 02.07. 链表相交❀ ✿LeetCode142.环形链表||❀ ✿LeetCode24.两两交换链表中的节点❀ 链接:24.两两交换链表中的节点 给你一个链表,两两交换其…

轻骑逐单于,大雪满弓刀:华为分布式存储的一骑绝尘

唐代诗人卢纶,有一首脍炙人口的《和张仆射塞下曲》,“月黑雁飞高,单于夜遁逃。欲将轻骑逐,大雪满弓刀。”诗中的慷慨激昂,热血炙烈,千年来让无数国人心魂激荡。 时代变迁,岁月迁移,今…

LeetCode面向运气之Javascript—第20题-有效的括号-95.97%

LeetCode第20题-有效的括号 题目要求 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号…

卑微小测试的一天----自动生成正交法测试用例

前言 工作过程中,我们接触到需求后第一要务是 熟悉需求并且输出测试用例,针对接口测试的入参测试,需要校验大量入参的组合场景,这时我们通常采用正交法来设计测试用例,在减少测试用例的数量时,同时保障测试…

Java 命名规范

包命名规范 包(Package) 的作用是将功能相似或相关的类或者接口进行分组管理,便于类的定位和查找,同时也可以使用包来避免类名的冲突和访问控制,使代码更容易维护。通常,包名使用小写英文字母进行命名,并使用 “.” 进…

LeetCode——半有序排列

一、题目 2717. 半有序排列 - 力扣(Leetcode) 给你一个下标从 0 开始、长度为 n 的整数排列 nums 。 如果排列的第一个数字等于 1 且最后一个数字等于 n ,则称其为 半有序排列 。你可以执行多次下述操作,直到将 nums 变成一个 …

LeetCode_前缀树_困难_212.单词搜索 II

目录 1.题目2.思路3.代码实现(Java) 1.题目 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。单词必须按照字母顺序,通过相邻的单元格内的字母构成&#xf…

网络安全学术顶会——SP 2023 议题清单、摘要与总结(中)

注:本文由ChatGPT与Claude联合生成 51、Effective ReDoS Detection by Principled Vulnerability Modeling and Exploit Generation 正则表达式拒绝服务攻击(ReDoS)是一种算法复杂度攻击。对于易受攻击的正则表达式,攻击者可以精心…

kotlin学习(一)基本概念、数据对象类型、控制流程、空值检验、类与接口

文章目录 认识Kotlin跨平台特性语言类型java的语言类型kotlin的运行原理 hello world 基本概念程序入口数据与对象类型 和 显式数字转换浮点类型位运算AnyUnitNothing 声明变量只读变量 val与可变变量var查看Kotlin字节码 fun(方法 / 函数)函数参数默认值…

MindMapper 思维导图 21.x

MindMapper 可视化绘图软件是任何想要快速组织思想和想法的人的必备工具。MindMapper 具有易于使用的界面,可以轻松创建可用于头脑风暴、决策制定和项目管理的综合思维导图。MindMapper 还是一个非常强大的生产力工具,因为它允许用户跟踪他们在项目和任务…

Linux GCC,GDB,Shell脚本的简单使用

这里写目录标题 GCC命令GDB命令Shell脚本 GCC命令 GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器 编译一个简单的.c程序: 四步分开写: gcc -E -o hello.i hello.c // 预处理 gcc -S -o he…

49、基于51单片机无刷电机调速系统设计(程序+原理图+PCB图+英文文献+参考论文+开题报告+元器件清单等)

摘 要 由于电机的发展,电动机由之前的带有刷子变换为无刷子直流电动机,其内部结构是电子换向器,而不是传统的机械式换向器,电动机的组成为永磁材料制造的转子和带有线圈绕组的定子组成。 所以本论文思路在全面分析无刷直流电机…

Tuleap ,一个用于软件项目管理的平台

Eclipse 基金会使用 Tuleap 取代了 Bugzilla,Tuleap 是一个独特的开源项目管理工具,目前发展势头很好,现在,每个月它会出一个大版本。它还被列在2015 年五大开源项目管理工具和 2016 年十一个名列前茅项目管理工具中。 Manuel Vacelet 是开发…

【MySQL】一文带你了解MySQL的基础知识

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指…

【Docker】docker部署springboot+vue+mysql+nginx前后端分离项目【实战篇】

文章目录 1、docker 安装jdk2、docker 安装mysql通过Docker命令进入Mysql容器内部初始化数据sqlDbx连接查看 3、docker build构建后端镜像修改配置数据库JDBC链接IP为虚拟机服务器IPmaven clean package打包后端jar并上传到服务器编写Dockfilebuild 构建查看构建的后端镜像app …

51单片机读取DS18B20温度传感器

1.首先我们知道DS18B20是单总线协议,只有一根数据线。所以Data数据线即使发送端又是接收端,同时DS18B20内部接了弱上拉电阻(如图一所示),数据线默认为高电平。有了这些概念,我们就能进行下一步。 图一&…

1738_创建自己的simulink模块库

全部学习汇总: GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral …