7 软件体系结构的一般描述
- 体系结构设计过程的主要输出为体系结构的描述。
- 体系结构的设计模型的形式化程度越低,则体系结构的评价就越难。
- 语言的形式化使不同的人能够以一种精确的方式理解一个模型。
- 体系结构表示的目的:系统的一种表示。
- 对任意所需级别的粒度,规定组件和连接器的体系结构约束。
- 把美学与工程分开。
- 以一种合适的视图或方式表达体系结构的不同方面。
- 进行相关性和一致性的分析。
- 支持系统生成或实例化。
通用的一般体系结构的描述方法
主程序与子程序
- 结构化思想和概念的提出后,主程序和子程序成为主要的程序设计思想。
- 系统结构被映射为主程序和一系列具有调用关系的子过程的集合。
- 这是软件设计最直接、最基本的结构关系。
- 更复杂的设计包含了库、包、模块、程序覆盖等概念。
- 主程序与子程序之优点
- 是一切软件结构的最本质、最基础的形式
- 代码的效率可以得到最大限度的发挥和提高。
- 主程序与子程序之缺点
- 部件的连接关系不明显。简单的调用的背后实际上可能较为复杂。
- 代码维护性差。简单的调用关系为维护带来了困难。
- 代码的复用性差。单纯的过程不能反映复杂的结构,难以成为复用的单元和基础。
- 该方法存在的问题导致了各种软件设计方法的研究和提出,导致了对软件体系结构的研究和发展,OO方法是最主要的突破和发展。
数据抽象和面向对象
- 数据抽象和面向对象设计是在主程序和子过程设计基础上建立和发展起来的重要的软件描述方法。
- 数据抽象是面向对象设计的理论基础
- 类和对象是该描述方法的基础粒度,而非模块或者包。本质上没有逃出主子程序的思想
- 面向对象已经成为大多数软件系统设计的基础和出发点。
基本要点和特征
- 类是数据抽象的载体,类由数据成员和操作方法构成(封装,ADT) 。
- 对象是类的实例,是软件系统的可运行实体。
- 类的继承性是一种复用机制。如果基类的行为已经是可证明的,那么证明导出类的正确性就变得简单多了。
- 多态性是
- 同一个行为名,作用在不同的对象上,操作细节不同的性质;
- 同名方法对不同参数的处理过程不一样。
- 对象天然的并发性,作为独立可运行的实体,对象与对象之间是相互独立、同时存在、各具生存状态的。
- 动态连接:关联性在运行时刻解决的机制。
- 软件系统概念的统一性、单一性,软件系统中的一切都是对象。
对象的实现类型
- 普通数据对象
- 持久对象
- 界面对象
- 组件:实现软件系统运行模块组装和连接的技术。
- 二进制对象
- 对象库:MFC、JFC etc.
在以下情况下可以考虑使用面向对象的设计方法
- 设计问题允许被分解成经过封装而独立运行,而又相互关联的对象集合。
- 相同的部件在系统中运行可能出现多次。
- 相同的部件可能在不同的系统中获得应用。
- 系统开发工作需要团队完成时候,把系统分割为对象的集合特别有利于工作的划分和实施,有利于保证开发的质量。
- 系统元素之间的关联错综复杂以至于妨碍了系统的清晰结构和划分。这时候尝试以对象的观点对系统进行重新分解以期获得突破。系统切割的一种方法。
对象的运行机制
- 对象的生存表现在它所占用的存储空间和状态的变化,对象的运行机制表现在:
- 在发生方法调用和获得处理器控制权之前,对象是处在生存的冻结状态。
- 激发对象处于活跃状态的唯一方法就是调用其操作方法(消息机制)。
- 在复杂系统中,对象不仅起到信息保存和传递的作用,更是构成系统存在和生命力表现的部件和连接关系的基础形式。
- 系统的各种部件都是对象,他们在系统中起到的作用不同、发挥的效用的时刻不同、受到的控制不同,但在计算机系统中运行都会受到操作系统的调用、外来事件的激发、其他部件的服务请求。
面向对象的优缺点
- 优点
- 信息隐藏保证了对象行为的可靠性,Called By Methods。
- 受封装的独立运行对象把数据和操作捆绑在一起,提高了对象作为一种模块的内聚力,使系统更容易分解成相互作用又相互独立的对象集合。
- 将操作请求和实现细节的分离使得可能在不影响调用者情况下改变操作的实现,为系统的维护和升级提供了良好的条件。
- 继承性和封装性提高了复用的可能性和方便性。
- 缺点
- 对象之间方法的调用必须知道被调用者的标识,造成系统维护上的困难。
- 如果系统分析初期就使用面向对象的方法则可能大大加剧系统分析的复杂性。
层次结构
- Layering is one of the most common techniques that software designers use to break apart a complicated software system.
- 层次化设计来源于2个原因
- 事物总是从最简单的、带基础的层次开始发生的
- 来自众多复杂软件设计的实践,几乎所有的系统都是从层次化结构建立起来的
优点
- 层次的复用性
- 对标准化的支持,允许在不同层使用来自不同商家的产品
- 依赖本地化,层次间的标准接口通常把代码变化的影响限制在其所在的层次之内,这样做便于支持系统的可移植性和可测试性
- 可替换性,独立层次的实现能够被功能相同的模块替换。享用互操作性好处的代价是增加了程序开销。
缺点
- 改变行为的连锁效应。
- 低效率。分层结构通常比单一层次的结构效率更低。
- 包含多于不必要的工作。如果低层次执行某些高层次并不需要的设置重复的工作,对于软件的整体性能就有消极的影响。高层请求通常会导致多次对低层次的同样的请求,层次数太多还会在层次间产送变量和返回值时带来额外的开销。
适应的设计问题
- 一个系统的设计是由一系列高层和低层处理构成的,高层操作依赖于低层。
- 系统需求描述了高层的任务,高层任务不能直接映射在平台上,因为他们太复杂不能在平台上直接运行。
- 为了完成系统设计需要考虑的因素
- 源代码的修改会影响整个系统,应该被限定在一个部件内部而不造成其他影响
- 接口应当稳定,甚至可以标准化
- 系统的构成应该灵活、可更换
- 将来有必要用当前的低层设计来支持其他系统的设计
- 穿越部件边界的操作会降低系统性能
- 系统的开发需要划分成多个部分,比如由团队人员开发时。
层次结构的特性
- 调用请求总是将高层请求映射成低层的更基础的操作(调用直到能完成任务为止)。自顶向下的信息和控制通常被描述成“请求”。
- 从层1开始的自底向上的操作链过程,通过这种方式数据穿过各层一直到达最高层。自底向上的方式被描述成“通知”。
层次结构的实现
- 定义为合适的分层而采取的抽象标准,这种标准通常反映了与平台概念的差距。
- 抽象标准决定模型层次的数目,层次的过少或者过多都导致问题的发生。
- 给各个层次命名和分配任务。
- 规范服务,层次之间要严格分开,确保没有部件会跨越两层以上。高层应该扩展以覆盖更大的可用性,低层应该设法保持瘦小(倒金字塔式的复用)
- 为每个层次定义接口(黑盒法、白盒法、灰盒法)
- 构建独立的层次,工作重点尽可能放在层次之间的接口上。
层次结构的变种
松弛的层次系统
- 是分层模型的一种变种
- 每层可以使用其下面所有层的服务而不仅仅是相邻层的服
- 有些服务提供给相邻的上一层,而其余的服务则提供给高于它的所有层
- 灵活性和性能的提高以牺牲可维护性为代价。蝴蝶效应
- 经常用于系统软件,而不常用于应用软件的设计
- 系统软件比起应用软件来很少修改
- 系统软件对性能的要求高于可维护性的要求
通过继承的层次结构
- 常见于面向对象的程序设计中
- 低层作为基类
- 较高层次通过继承使用基类提供的服务
- 高层可根据需要改写低层提供的服务
- 如果基类改变了,则继承该基类的子类都要重新编译
- 这种由继承引入的依赖性称作脆弱的基类问题
理论的形式化方法
体系结构的描述
- 形式化方法:用于开发计算机系统的形式化方法是描述系统性质的基于数学的技术。
- 规约方法的目标:无二义性、一致性和完整性。
- 精确的语义描述
- 支持分析推理
- 体系结构的形式化方法:建模、分析、验证
体系结构的描述语言
- ADL,建立在形式化的理论基础之上
- 语义严格、精确
- 求精、验证、演化、分析
- ADL应当具备的特点
- 严谨的语法、语义
- 描述能力强
- 有工具支持
- 简单易懂
- 不同的抽象级别
- 静态分析、动态分析
- 功能:能够描述体系结构的组成要素,并能对系统体系结构、体系结构风格进行建模和分析验证的描述语言
- 分类:
- 描述软件体系结构配置的ADL:CHAM
- 描述软件体系结构实例的ADL:Rapide
- 描述软件体系结构风格的ADL:Wright
类属理论
- 提供了概念划分的统一性
- 类属是由一个对象集合和一个关联两个对象的箭头集合构成的。
- 对象是以某种逻辑表达的形式规范,箭头定义了这些规范之间的关系。
- 软件研究者把他看成是表达抽象和依赖关系的工具
- 在体系结构的部件和连接器描述中都被广泛采用
- 类属理论可以用于从小的、可重用的部件开始合成系统的形式规范。
- 当用于规范构造时,通常要求箭头(或形态)保持定理的推理关系。
- 如果定义了两个规范之间的形态,那么源规范的公理是目标规范的定理。
- 可以把体系结构定义为一个规范的图,并且在一个相对抽象的层面上证明该体系结构的性质。
- 可以应用类属理论的细化操作对体系结构的规范进行细化,直到实现。
- 该方法的一个优点在于结构特性的自动维持。
Z Notation
- Z Notation使用标准的逻辑操作符和集合操作符以及他们标准的常规语义。
- 集合及其构造形式
- 集合操作符号
- 逻辑操作符号
- 使用Z Notation可以描述数学对象的模型。这些对象模型与程序计算对象的相似之处是选择Z作为体系结构和软件工程描述语言的原因。
- 在研究文献和报告中,大量的采用Z Notation作为体系结构的形式化描述。
CSP
- 被广泛应用于分布式设计的建模和分析中
- CSP提供丰富的描述进程行为的语义集。主要包括语义、实施、行为、组合、并发、通信等。
化学抽象机制
- 一个CHAM是从定义分子(molecules ) m、m1……和分子溶液( solutions)s、s1……开始的。
- 分子构成了CHAM的基本元素,溶液是分子的聚合并被解释为CHAM的状态。
- 一个CHAM还包含转换规则T、T1……,他们定义了一个转换关系s->s1 ,指示了溶液可以发展(也就是状态变化)的方式。
- 借助于称为膜的封装结构,任何溶液可以被看成是相对于其他溶液的分子,转换可以被约束和局限在一个膜内。
- 被称为闭锁的可逆操作用来从溶液中选择提取分子,并把溶液的剩余部分放入一个膜内。膜是半渗透的,只允许特定的分子进入或离开膜。
软件体系结构集成环境
目标
- 能够描述各种风格的软件系统结构
- 支持自顶向下(自下而上)的分层细化体系结构元素
- 确保接口一致
- 提供一个体系结构知识库存放与体系结构设计相关的设计模式、设计要素、设计需求
- 具有一个提供数据和控制模型代码的模板生成器
- 提供体系结构的图形化描述工具,从不同的视角反映体系结构
元素
- 体系结构配置文档编辑器
- 体系结构配置图形编辑器
- 体系结构视图
- 文本视图
- 交互视图
- 层次视图
- 体系结构语法分析器
- 代码模板生成器
UniCon系统
- 基于部件和连接器。体系结构的描述模型是由基于可识别的称为部件和连接器的个体元素构成的。
- 部件和连接器元素都具有类型、规范和实现。
- UniCon的体系结构描述语言的结构
- 系统支持的部件类型:模块、计算、共享数据、顺序文件、过滤器、调度的进程、通用
- 系统支持的连接器类型:文件输入/输出、过程调用/数据访问、RPC、实时调度
- 体系结构的表达:支持体系结构的图形和文字的表达方式,两者之间可以互相转换。
Wright系统
- Wright体系结构描述语言用于描述软件系统的体系结构
- 可以描述体系结构的风格、系统族、体系结构实例和单个系统
- 提供对计算构件和连接件的描述
- 交互关系
- 构件间的交互关系是指模块之间的通讯
- Wright体系结构描述语言基于交互
- Wright语言的描述
- 根据构件、连接件和配置等基本体系结构元素的抽象而构造系统
- 构件作为计算部件,连接件形式化为交互模式
Darwin系统
- 标识符、关键字和函数
- 与IDL(Interface Description Language)的语法约定相同
- 标识符:在Darwin系统中,用标识符定义和命名构件的类型、接口类型、参数、常量、端口、实例等。
- 函数:Darwin扩展了IDL以支持函数的调用
- 构件说明
- 构件说明定义了可以创建一个或多个实例的构件类型。
- 局部构件(Partial Component Declaration):构件的类型可以从其他构件类型完全或者局部导出。
- 通用构件
- Darwin系统设计验证:“What-If”的测试机制。
- Darwin系统程序设计
- 支持增量式开发
- 工程文件.dw
- .cc为程序文件
- Darwin系统程序结构构造
- 支持自底向上
- 支持自顶向下
- 支持合并构件
- 支持分组构件
ACME系统
- 将系统描述成通过连接器实现交互关系的部件的图
- 采用图形化编辑方式直接描述构件和连接件
- ACME的核心概念
- 部件
- 是系统描述的基本组块,代表了系统计算的核心
- 可以用来表达硬件或者软件
- 连接器
- 体系结构模型的一个重要特征是把交互看成是建模的概念。这与OO不同。
- 通过显式的连接器的概念,为明确地表达系统的通信关系提供了机制。
- 部件
软件工程设计方法与体系结构描述
对于体系结构的描述可以分成两类
- 把现有的图形化方法应用到体系结构设计中
- 开发体系结构描述语言:每种体系结构描述语言都以独立的形式存在,描述语法不同而且互不兼容,这给体系结构描述语言的推广带来了一定的困难。