第9章 · 播客 第5集

软件架构设计 · 架构风格总纲与数据流风格

🎙️ 本集播客第5集:架构风格的定义与四要素,Garlan 和 Shaw 五大类分类表全套子风格名单;细讲数据流风格——批处理序列与管道-过滤器的优缺点六条对三条,以及两风格的对比句,练习题第四题原产地。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
🎙️ 第9章播客 第5集
⬇ 下载本集 点击播放
阿明
师姐,进入风格板块了。架构风格到底是什么?
小雅
软件架构设计的一个核心问题是能否使用重复的软件架构模式,即能否达到架构级别的软件重用。软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式,原文括号里给了英文 idiomatic paradigm。架构风格定义了一个系统家族,即一个架构定义一个词汇表和一组约束:词汇表中包含一些构件和连接件类型,这组约束指出系统是如何将这些构件和连接件组合起来的。
小雅
架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。对架构风格的研究和实践促进了对设计的重用,一些经过实践证实的解决方案也可以可靠地用于解决新的问题。架构风格不变的部分使不同的系统可以共享同一个实现代码。只要系统是使用常用的、规范的方法来组织,就可使别的设计者很容易地理解系统的架构——例如,如果某人把系统描述为客户/服务器模式,不必给出设计细节,我们立刻就会明白系统是如何组织和工作的。
阿明
「词汇表加一组约束」,这个定义是填空级的。
小雅
讨论架构风格时要回答八个问题:设计词汇表是什么、构件和连接件的类型是什么、可容许的结构模式是什么、基本的计算模型是什么、风格的基本不变性是什么、其使用的常见例子是什么、使用此风格的优缺点是什么、其常见的特例是什么。这些回答包括架构风格最关键的四要素内容:提供一个词汇表、定义一套配置规则、定义一套语义解释原则、定义对基于这种风格的系统所进行的分析。四要素这个说法也能出多选。
小雅
然后是本章最重要的分类表,Garlan 和 Shaw 根据此框架给出的通用架构风格分类,五大类十个子风格,你跟着我抄:数据流风格:批处理序列、管道/过滤器。调用/返回风格:主程序/子程序、面向对象风格、层次结构。独立构件风格:进程通信、事件系统。虚拟机风格:解释器、基于规则的系统。仓库风格:数据库系统、超文本系统、黑板系统。
阿明
练习题第四题问管道-过滤器风格属于哪类,答案是数据流风格。干扰项给的调用/返回、独立构件、虚拟机,都是这张表里的其他大类。
小雅
对,这张表是风格题的母表,考法全是「某子风格属于哪一大类」或者反向。容易混的几处我先点破:层次结构属于调用/返回风格,不属于数据流;解释器属于虚拟机风格;黑板系统属于仓库风格;事件系统属于独立构件风格。这四个错位是选项设计者的最爱。
小雅
现在细讲第一大类,数据流风格。原文说数据流风格的软件架构是一种最常见、结构最为简单的软件架构:所有的数据按照流的形式在执行过程中前进,不存在结构的反复和重构,就像工厂中的汽车流水线一样,数据像汽车零部件一样在流水线的各个节点上被加工,最终输出所需要的结果。数据流风格包括两种具体的架构风格:批处理序列和管道-过滤器。
小雅
先批处理序列。批处理风格的每一步处理都是独立的,并且每一步是顺序执行的,只有当前一步处理完,后一步处理才能开始,数据传送在步与步之间作为一个整体。括号里的规范表述:组件为一系列固定顺序的计算单元,组件间只通过数据传递交互,每个处理步骤是一个独立的程序,每一步必须在前一步结束后才能开始,数据必须是完整的、以整体的方式传递。典型应用三个:经典数据处理、程序开发、Windows 下的 BAT 程序就是这种应用的典型实例。
阿明
BAT 批处理文件这个例子好记——一整段跑完再下一段。
小雅
再管道和过滤器。每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。这个过程通常通过对输入流的变换及增量计算来完成,所以在输入被完全消费之前,输出便产生了。这里的构件被称为过滤器,连接件就像是数据流传输的管道,将一个过滤器的输出传到另一过滤器的输入。此风格特别重要的一点:过滤器必须是独立的实体,它不能与其他的过滤器共享数据,而且一个过滤器不知道它上游和下游的标识。一个管道/过滤器网络输出的正确性并不依赖于过滤器进行增量计算过程的顺序。
小雅
典型例子两个:一个是以 UNIX shell 编写的程序,UNIX 既提供一种符号以连接各组成部分也就是 UNIX 的进程,又提供某种进程运行时机制以实现管道;另一个是传统的编译器,它一直被认为是一种管道系统,一个阶段包括词法分析、语法分析、语义分析和代码生成的输出是另一个阶段的输入。编译器四个阶段的顺序本身也是个考点。
小雅
管道/过滤器风格的优点六条:使得软构件具有良好的隐蔽性和高内聚、低耦合的特点;允许设计者将整个系统的输入/输出行为看成是多个过滤器的行为的简单合成;支持软件重用,只要提供适合在两个过滤器之间传送的数据,任何两个过滤器都可被连接起来;系统维护和增强系统性能简单,新的过滤器可以添加到现有系统中来,旧的可以被改进的过滤器替换掉;允许对一些如吞吐量、死锁等属性的分析;支持并行执行,每个过滤器是作为一个单独的任务完成,因此可与其他任务并行执行。
阿明
六条优点里「支持并行执行」和「允许吞吐量死锁分析」最容易被选项漏掉或错置。缺点呢?
小雅
缺点三条:通常导致进程成为批处理的结构,这是因为虽然过滤器可增量式地处理数据,但它们是独立的,所以设计者必须将每个过滤器看成一个完整的从输入到输出的转换;不适合处理交互的应用,当需要增量地显示改变时,这个问题尤为严重;因为在数据传输上没有通用的标准,每个过滤器都增加了解析和合成数据的工作,这样就导致了系统性能下降,并增加了编写过滤器的复杂性。
小雅
最后是两风格对比,原文给了成对的词。共同点:把任务分成一系列固定顺序的计算单元即组件,组件间只通过数据传递交互。区别:批处理是全部的、高潜伏性的,输入时可随机存取,无合作性、无交互性;而管道过滤器是递增的,数据结果延迟小,输入时处理局部化,有反馈、可交互。批处理强调数据传送在步与步之间作为一个整体,而管道过滤器无此要求。
阿明
批处理全部高潜伏无交互,管道过滤器递增延迟小可交互。本集必背:架构风格是特定应用领域系统组织方式的惯用模式,定义词汇表加一组约束;四要素是词汇表、配置规则、语义解释原则、系统分析;Garlan 和 Shaw 五大类——数据流含批处理序列和管道/过滤器、调用/返回含主程序/子程序、面向对象、层次结构、独立构件含进程通信和事件系统、虚拟机含解释器和基于规则的系统、仓库含数据库系统、超文本系统、黑板系统;管道-过滤器属数据流风格,例子是 UNIX shell 和传统编译器;优点六条含支持并行执行,缺点三条含不适合交互式应用。
小雅
收齐了。下一集讲调用/返回风格三兄弟——主程序/子程序、面向对象、层次结构,以及独立构件风格的进程通信和事件系统,隐式调用的优缺点和那个 Debugger 断点事件的例子都值得单拎。