首页 > 其他分享 >关于软件架构设计的小笔记

关于软件架构设计的小笔记

时间:2023-09-09 17:46:05浏览次数:39  
标签:Interactor 笔记 修改 Controller 依赖 软件架构 组件 设计

设计良好的计算机软件应该是易于扩展,同时抗拒修改。

这就是著名的开闭原则(OCP)。

换句话说,一个设计良好的计算机系统应该在不需要修改的前提下就可以轻易被扩展。

其实这也是我们研究软件架构的根本目的。如果对原始需求的小小延伸就需要对原有的软件系统进行大幅修改,

那么这个系统的架构设计显然是失败的。

  一个好的软件架构师设计师会努力将旧代码的修改量降至最小,甚至为0。那么该如何实现这一点呢?

我们可以先将满足不同需求的代码分组(即SRP:单一职责原则),然后再来调整这些分组之间的依赖关系(即DIP:依赖反转原则)。

如下:利用SRP处理数据流的示例。

这里的核心就是将应用生成报表的过程拆成两个不同的操作。

即先计算出报表数据,再生成具体的展示报表(分别以网页及纸质的形式展示)。
接下来,我们就该修改其源代码之间的依赖关系了。

这样做的目的是保证其中一个操作被修改之后不会影响到另外一个操作。

同时,我们所构建的新的组织形式应该保证该程序后续在行为上的扩展都无须修改现有代码。

具体实现的结构如下图2:

 在这个图中,左上角的组件是Controller,右上角是Interactor,右下角是Database,左下角则有四个组件分别用于代表不同的Presenter和View。

用<I>标记的类代表接口,用<DS>标记的则代表数据结构;开放箭头指代的是使用关系,闭合箭头则指代了实现与继承关系。

  首先我们在图2中看到的所有依赖关系都是其源代码中存在的依赖关系。

这里,从类A指向类B的箭头意味着A的源代码中涉及了B,但是B的源代码中并不涉及A。

因此在图2中,FinancialDataMapper在实现接口时需要知道FinancialDataGateway的实现,而FinancialDataGateway则完全不必知道FinancialDataMapper的实现。

  其次,这里很重要的一点是这些双线框的边界都是单向跨越的。

也就是说,上图中所有组件之间的关系都是单向依赖的,如图3所示,图中的箭头都指向那些我们不想经常更改的组件。

也就是说,如果A组件不想被B组件上发生的修改所影响,那么就应该让B组件依赖于A组件。

图3如下:

 从以上内容我们可以看出,Interactor组件是整个系统中最符合OCP的。发生在Database、Controller、Presenter甚至View上的修改都不会影响到Interactor。

为什么Interactor会被放在这么重要的位置上呢?

因为它是该程序的业务逻辑所在之处,Interactor中包含了其最高层次的应用策略。

其他组件都只是负责处理周边的辅助逻辑,只有Interactor才是核心组件。

虽然Controller组件只是Interactor的附属品,但它却是Presenter和View所服务的核心。

同样的,虽然Presenter组件是Controller的附属品,但它却是View所服务的核心。
  另外需要注意的是,这里利用“层级”这个概念创造了一系列不同的保护层级。

譬如,Interactor是最高层的抽象,所以它被保护得最严密,而Presenter比View的层级高,但比Controller和Interactor的层级低。

   以上就是我们在软件架构层次上对OCP这一设计原则的应用。

软件架构师可以根据相关函数被修改的原因、修改的方式及修改的时间来对其进行分组隔离,

并将这些互相隔离的函数分组整理成组件结构,使得高阶组件不会因低阶组件被修改而受到影响。

 

依赖方向的控制
刚刚在图2中所看到的复杂度是我们想要对组件之间的依赖方向进行控制而产生的。
例如,FinancialReportGenerator和FinancialDataMapper之间的FinancialDataGateway接口是为了反转Interactor与Database之间的依赖关系而产生的。

同样的,FinancialReportPresenter接口与两个View接口之间也类似于这种情况。

 

信息隐藏
当然,在图2中,FinancialReportRequester接口的作用则完全不同,它的作用是保护FinancialReportController不过度依赖于Interactor的内部细节。

如果没有这个接口,则Controller将会传递性地依赖于FinancialEntities。
这种传递性依赖违反了“软件系统不应该依赖其不直接使用的组件”这一基本原则。
所以,虽然我们的首要目的是为了让Interactor屏蔽掉发生在Controller上的修改,

但也需要通过隐藏Interactor内部细节的方法来让其屏蔽掉来自Controller的依赖

 

 总结

通过以上架构设计,我们可以看出在我们日常新建或重构的项目中,也大都遵循开闭原则。

我们会尽量让系统易于扩展,同时限制其每次被修改所影响的范围。

实现方式可能包括在重构时,需要考虑了现有系统模块间的紧密程度,调用频率等各种因素进行分析系统如何划分,

以及对系统划分为一系列组件,并将这些组件间的依赖关系按层次结构进行组织,

同时使得我们的高阶组件不会因低阶组件被修改而受到影响。

 而我们最高阶的组件无疑就是业务逻辑层,它也是抽象程度最高的一层,我们会希望它尽量稳定。

 

标签:Interactor,笔记,修改,Controller,依赖,软件架构,组件,设计
From: https://www.cnblogs.com/Vincent-yuan/p/17689883.html

相关文章

  • 《信息安全系统设计与实现》第一周学习笔记
    《信息安全系统设计与实现》第一周学习笔记一、知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图第一章关于本书涵盖Unix/Linux的所有基本组件,包括进程管理、并发编程、定时器和时钟服务、文件系统、网络编程和MySQL数据......
  • qemu中的glib库api试用--Apple的学习笔记
    一,前言qemu中有些glib库的api,我想学习试用下。二,编译及调试1.     使用glib库后编译报错,缺少头文件root@ubuntu:/work/study#gcct1.c-ot1t1.c:2:18:fatalerror:glib.h:Nosuchfileordirectory#include<glib.h>^compilationterminated.2.......
  • 虚化及信息安全学习历程--Apple的学习笔记
    一,前言先做了一个基本方向的定义,然后我就开始玩qemu,基于qemu做二次开发。在学习qemu的过程中主要学习hypervisor,然后再学习信息安全相关内容。二,过程记录tbd三,新路历程2023/09/01:开学咯,之前的blog我写了5年,由于不好用,所以我换了blog同时也换了新的学习大方向,正好再来一个5年。 ......
  • 2、protected: 这种权限是为继承而设计的,protected所修饰的成员,对所有子类是可访问的,但
    2、protected:这种权限是为继承而设计的,protected所修饰的成员,对所有子类是可访问的,但只对同包的类是可访问的,对外包的非子类是不可以访问; protected权限的访问范围是:当前包所有的类+当前包以外的子类。 ......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第一周学习笔记
    202113252023-2024-1《信息安全系统设计与实现(上)》第一周学习笔记一、任务要求任务详情自学教材第1,2章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)......
  • 制造业数字化转型顶层设计业务架构和应用架构规划方法
     引言   当前制造业产业转型升级已成为国家战略,智能制造的理念也在行业中快速推行和应用。在当下制造业数字化转型的浪潮中,数字化顶层规划以企业架构方法论为依托,围绕数字化转型规划战略,帮助企业识别企业在转型过程中应该具备的核心业务能力,构建企业数字化运营能力总体蓝图,......
  • 从cnblogs转到知乎写笔记,从评论中向大家学习
    Friday,June24,2022,11:29:29AM从cnblogs转到知乎写笔记,从评论中向大家学习本来是想把知乎账号的一句话介绍改成上面这句话的,但是在手机或者电脑上不同日期、时间尝试改了几次,都提示系统维护中。这简单的改个自我介绍都如此麻烦,让我不由得怀疑这可能不是技术问题,而是某种......
  • PCL学习笔记 | PCL的安装
    可选择自己需要的版本下载https://github.com/PointCloudLibrary/pcl/tags。我选择的是PCL1.12下载标黄的两个文件。"PCL-1.12.0-AllInOne-msvc2019-win64.exe"是PointCloudLibrary(PCL)的一个全包版本,特定为MicrosoftVisualStudio2019(MSVC2019)和64位Windows系统构建的。......
  • 【刷题笔记】45. Jump Game II
    题目Givenanarrayofnon-negativeintegers nums,youareinitiallypositionedatthefirstindexofthearray.Eachelementinthearrayrepresentsyourmaximumjumplengthatthatposition.Yourgoalistoreachthelastindexintheminimumnumberofju......
  • Boost.Asio网络库 学习笔记
    Asio网络库学习笔记Boost官网:https://www.boost.org/Boost库许可证://CopyrightJoeCoder2004-2006.//DistributedundertheBoostSoftwareLicense,Version1.0.//(SeeaccompanyingfileLICENSE_1_0.txtorcopyat//https://www.boos......