Software Architecture软件架构(方法、模式与框架)纵横谈
Software Architecture软件架构是啥
随着软件行业的发展,软件的规模越来越大,“Software Architecture软件架构”这个名词开始频繁出现。“软件架构”究竟指的是什么?
广义的“软件架构”针对整个软件系统,当然包括“软件系统”的全部内容,同时包括网络、计算机,外部设备等物理节点,以及开发者,维护者和客户等人员。
狭义的“软件架构”指的是软件开发过程中,软件顶层架构的设计。
本文讨论的是狭义的软件架构,主要包括三方面的内容:
- 架构模式:顶层模型的设计方法
- 设计模式:框架类结构的设计方法
- 架构设计目标:非功能性的约束

Software Architecture软件架构凭啥
领域驱动设计(Domain Driven Design)
Eric Evans在《领域驱动设计-软件核心复杂性应对之道》这本书中提出了传统的DDD四层架构模式。

六边形架构(Haxagonal Architecture)
六边形架构是Alistair Cockburn在2005年提出的,解决了传统的分层架构所带来的问题。Vaughn Vernon 在《实现领域驱动设计》一书中,作者将六边形架构应用到领域驱动设计的实现。将传统的分层架构变成了内部和外部,内部实现领域模型,外部实现适配器。
洋葱架构(Onion Architecture)
Jeffrey Palermo在2008年提出了洋葱架构。它是从六边形架构发展而来,将六边形改为圆环,层层依赖。
干净架构(Clean Architecture)
Robert C. Martin在2012年提出了干净架构(Clean Architecture),这是六边形架构的一个变体。

DCI架构
DCI代表Data, Context, Interaction。ames O. Coplien和Trygve Reenskaug在2009年发表了一篇论文《DCI架构:面向对象编程的新构想》
重点是关注数据的不同场景的交互行为, 核心思想是将面向对象系统的数据模型和动态的行为模型区分开来,用不同的对象复用同一段交互行为。

Software Architecture软件架构有啥
架构模式很难被具体化、框架化,因为它们太过抽象,只是若干设计原则,这样的框架即使被设计出来,也难以流行起来。
相对于抽象的架构模式,框架类设计模式还是很流行的。最流行的当然是MVC框架模式。
MVC框架模式
MVC即模型(model)、视图(view)、控制器(controller)设计模式可谓是无人不知不人不晓。它的缺点是比较重,各部分没有解耦。
MVP框架模式
Model-View-Presenter设计模式是在MVC基础上发展而来,将模型与视图完全分离,可以修改视图而不影响模型。
MVVM框架模式
Model-View-ViewModel设计模式是MVP的进一步改进,使用双向绑定将View与ViewModel的数据传输自动化。
VIPER框架模式
VIPER模式最初是在2013年由Jeff Gilbert 和 Conrad Stoll 提出,随后在《Architecting iOS Apps with VIPER》文中做了详细的介绍。
由View+Interactor+Presenter+Entity+Routing组成,是Clean Architecture的一种实现模式。

Software Architecture软件架构干啥
软件架构设计最大的困难与问题在于,架构模式过于抽象,很难有具体的框架支撑,很难重用代码;设计模式可以有具体的框架类支持,不进行架构设计,直接使用框架是可以的,但是很难支撑复杂系统的高层架构。
所以,对于软件架构设计最有意义的事情,就是把抽象和具体连接起来,既是抽象的模式,同时又是具体的可重用框架。
结合具体的项目过程,我设计了一个模式,同时也实现了一个框架。
Bricks Architecture(砖块架构)
这个模式,命名为Bricks Architecture(砖块架构)。
这个框架,命名为Bricks(离别钩),出自《七种武器》:“你用离别钩,只不过为了要相聚”。
Bricks是一个完全模块化的模式,主要有六种模块:Builder+Router+Interactor+Context+bricK+Scenario。

与干净架构(Clean Architecture)的关系
Bricks Architecture既是Clean Architecture的一种变体,同时也是Clean Architecture的一种实现模式。
Brick对应于Entities
Context对应于UseCases
Adapter对应于Adapters
与DCI架构的关系
Bricks Architecture既是DCI的一种变体,同时也是DCI的一种实现模式。
Brick对应于Data
Context对应于Context
Adapter+Interactor对应于Interaction
与MV*架构的关系
Builder可以实现为Generator,生成MVP架构的代码,如果使用双向绑定如VUE,那么将生成MVVM架构的代码
Builder也可以实现为Controler,加载手写代码,可以视为MVC架构的代码。
与VIPER架构的关系
Model是由Builder根据Brick(Entity)生成
View是由Builder根据Context + Scenario生成
Presenter是由Builder据Context + Scenario+ Brick生成
那么Bricks模式,在生成后变成VIPER,在代码生成后,实际代码是基于VIPER模式的。
(Builder+Context+Scenario)+ Interactor + bricK + Router
VIEW + Interactor + Presenter + Entity + Router
架构模式的动态选择
代码生成,在成熟平台如Web,可以完全应用,Bricks框架可以构建LowCode低代码平台。生成的代码可以应用MVC,MVP,MVVM模式。
在代码生成不成熟的平台,如手机平台,可以部分应用或不使用,Bricks框架可以应用VIPER,Clean Architecture等复杂的模式。
动态选择架构模式可以避免过度设计。
与软件架构设计目标的符合度
由于Bricks是完全模块化的模式,在可定制化等方面有着天然的优势。
- 可定制化(CuSTomizable)
- 可伸缩性(SCAlable)
- 可维护性(MAIntainable)
- 可扩展性(Extensible)
在安全性、可靠性方面,虽然整体强度是降价的,但是模块本身能够被复用,被测试,模块的质量是上升的,所以整体还是可靠的。
- 安全性(Secure)
- 可靠性(Reliable)
由于在复用性(DCI模式的应用)、可扩展性(模块化)的优势,界面的一致性很高,开发快速,性能虽然有可能受影响,但体验还是优秀的。
- 市场时机(Time to Market)
- 客户体验(Customer Experience)
(全文完)
Software Architecture软件架构(方法、模式与框架)纵横谈的更多相关文章
- Atitit 软件架构方法的进化与演进cs bs soa roa msa attilax总结
Atitit 软件架构方法的进化与演进cs bs soa roa msa attilax总结 1.1. 软件体系架构是沿着单机到 CS 架构,再到 BS 的三层架构甚至多层架构逐步发展过来的,关于 ...
- NET设计模式 第二部分 行为型模式(15):模版方法模式(Template Method)
摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Te ...
- 设计模式之第1章-工厂方法模式(Java实现)
设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...
- 工厂方法模式与IoC/DI
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 1:如何理解IoC/DI 要想理解上面两个概念,就必须搞清 ...
- iOS设计模式之工厂方法模式
工厂方法模式 基本理解 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 简单工厂的最大优点就是工厂类中包含了必要的逻辑判断,根据客户端的选择 ...
- 工厂方法模式与IoC/DI控制反转和依赖注入
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁 ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...
- 从IT的角度思考BIM(二):模式与框架
我们满怀着美好期许,鼓起勇气敲响了 BIM 世界的大门.忽然人群中有人高呼:BIM 已死,大家都散了吧! 这时人群开始骚动起来.“我早就说这玩意是忽悠人的吧,你们不信还偏要来”,“我花了好多钱准备这次 ...
- 24种设计模式--模版方法模式【Template Method Pattern】
周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的 ...
随机推荐
- Docker Swarm(五)Config 配置管理
前言 在动态的.大规模的分布式集群上,管理和分发配置文件也是很重要的工作.传统的配置文件分发方式(如配置文件放入镜像中,设置环境变量,volume 动态挂载等)都降低了镜像的通用性. Docker 1 ...
- Zabbix 监控过程详解
Zabbix 监控过程详解 一.修改密码及中文语言 修改密码 修改中文语言 如果复选框中没有 Chinese(zh_CN) 选项,需要安装中文包 [root@Zabbix-server ~]# yum ...
- ValueError: not enough values to unpack (expected 2, got 1)
在python中使用字符串分片时遇到这个问题 [ValueError: not enough values to unpack (expected 2, got 1)] --------------& ...
- Spark SQL 之 RDD、DataFrame 和 Dataset 如何选择
引言 Apache Spark 2.2 以及以上版本提供的三种 API - RDD.DataFrame 和 Dataset,它们都可以实现很多相同的数据处理,它们之间的性能差异如何,在什么情况下该选用 ...
- 统信UOS - 扩展系统盘
一.开root权限,开终端 二.执行lsblk指令,查看磁盘情况 可以发现 / 路径 对应的是loop0,查阅可知loop设备就是一个文件,挂载为一个路径操作的,这就尴尬了,好好的分区不用,你干嘛这么 ...
- [翻译] 预览 C# 10 的新东西
原文: [Introducing C# 10] 作者: Ken Bonny 本周早些时候(译注:原文发表于5月1日),我关注了 Mads Torgersen 在 DotNet SouthWest ...
- 【补档_STM32单片机】脉搏波采集显示硬件设计
一.脉搏波简介 脉搏一般情况下指的都是动脉脉搏.每分钟的脉搏次数称为脉率,正常情况下与心率是一致的.心脏的一次收缩和舒张成为一个心动周期.在每个心动周期内,心室的收缩和舒张会引起脉内压力的周期性波 ...
- GO学习-(33) Go实现日志收集系统2
Go实现日志收集系统2 一篇文章主要是关于整体架构以及用到的软件的一些介绍,这一篇文章是对各个软件的使用介绍,当然这里主要是关于架构中我们agent的实现用到的内容 关于zookeeper+kaf ...
- Go语言基础包之net/http
Go语言基础包之net/http Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的 ...
- Go语言协程并发---timer秒表与定时器
秒表 package main import ( "fmt" "time" ) /*每秒大喊我要去浪,共9次,然后退出计时*/ func main() { va ...