软件架构设计的正宗
我看的英文版,断断续续看了半年。本书主要由三部分,概念、方法以及应用。主要围绕面向对象的思路展开。我主要关注在架构设计这个层面,为啥要用面向对象的架构设计以及怎样应用面向对象的架构设计
为什么使用面向对象的架构设计
理论来源于实际,面向对象的架构设计思想也是来源于人们对社会、世界的认知。通过观察个人电脑的结构、动植物的结构、物质的结构以及社会组织结构的结构,我们发现复杂系统的属性。
复杂系统的五个属性
1. 层次结构(Hierarchic Structure)
a. 复杂系统以层次的形式存在。它由一系列相关联的子系统构成,而这些子系统会由更小的子系统构成,直到最低级别的初级元素位置。
b. 只有系统有层次,我们才能理解
c. 所有的系统都有子系统,所有系统都是更大系统的组成部分。系统增加的价值在于这些子系统的相互合作的关系而不是这些子系统本身。
2. 相对原子性(Relative Primitives(multiple levels of abstraction))
系统的哪个部分是原子的取决于观察者的自由
3. 关注分离(Separation of Concerns)
a. 模块内部的联系要强于模块间的联系。把高频率动态的模块内部和低频率的模块间的分开来看
b. 模块内部和模块间的差异,使得可以将系统的某一部分隔离来看成为可能。
4. 可复用性(Common Patterns)
层次结构的系统往往由少数几个子系统以不同的组合或者安置构成。
5. 中间稳定状态(Stable Intermediate Forms)
a. 复杂系统往往从简单的可工作的系统进化而来。
b. 如果有中间稳定状态,复杂系统进化的会更加快速。而且进化完成的系统又会变成原子系统,以便更复杂系统的构建。
软件行业额外的复杂性
软件行业除了上述的复杂系统的五个属性,它还有如下复杂性。
1. 问题空间的复杂性
a. 需求上面经常有互相矛盾和冲突的需求,尤其当需求的提出方来自多个部门的时候。
b. 系统开发人员与系统使用人员的沟通误差。
c. 需求会经常变化。
2. 管理开发进度的困难性
a. 没有一个人可以理解所有代码
b. 更多的人意味着更多的沟通复杂度以及更困难的协调
c. 当管理一个团队时,关键的管理挑战在于如何维护设计的完整性和一致性
3. 软件的灵活性
a. 软件有极致的灵活性,开发人员可以开发任何一个组件也可以使用已有组件
4. 描述离散系统的困难性
a. 系统往往有很多离散系统构成,系统的整体行为很难用连续函数去模拟。
人类处理复杂的局限性
客观世界、社会以及软件是如此复杂,而人类在处理复杂系统的时候有如下局限性:
1. 一个人最多可以同时理解7块左右的信息
2. 一个人一般需要5秒钟去理解一块新的信息
人类怎么处理复杂性
那人类应该怎么处理复杂性?人类采取了如下方法
1. 分解(Decomposition)
在系统的任一层级,我们只需要理解这一层级的几块信息,不需要理解所有信息(金字塔结构)。有如下两种分解方式
a. 算法分解(Algorithmic Decomposition)
强调事件发生的顺序
b. 面向对象(Object-Oriented Decomposition)
2. 抽象(Abstraction)
人类发展出来的非常强大的处理复杂性的技术。我们不能掌握复杂系统的所有细节,我们选择忽略非本质的细节,而选择通用的理想化的模型。
3. 层次(Hierarchy)
设计复杂软件系统
1. 科学与艺术的结合
2. 设计的含义
设计的目标是构建一个系统,它满足如下要求
a. 满足功能需求
b. 符合限制
c. 符合显式或者隐式的性能以及资源要求
d. 符合设计的限制:比如事件、花费等
3. 建模的重要性
建模在工业学科有广泛的接受性,因为它符合分解、抽象以及分层的原则。每个模型描述系统的一个方面。
4. 软件设计的方法
软件设计是一个渐进性的迭代的过程,它包含如下元素
a. 符号(Notation): 表达模型的语言
b. 流程(Process): 有序构建软件模型的活动
c. 工具(Tools)
面向对象管理软件复杂性
面向对象方式的可以解决客观世界、社会的复杂性,人类解决复杂问题就是通过面向对象的方式。比如一个公司的组织结构,从外面看是一个公司,进去看,这个公司会由:销售部、技术部、财务部、客服部等各个部门组成,各个部门通过合作的方式共同完成一项工作任务。然后技术部门内部又分为:测试部、前端研发部、后段研发部等,技术部门内部合作来完成一项软件研发任务。这些符合人类解决复杂问题的方式:分解、抽象以及层次。
对象模型的基础
1. 有助于解决多种不同系统的复杂性
2. 面向对象设计
是一种包含面向对象分解过程的设计方法,是描述所设计系统的逻辑、物理以及静态和动态模型的符号
3. 面向对象分析
一种从问题域词汇表中的类和对象的角度检查需求的分析方法。
对象模型的元素
1. 抽象
代表本质的区别与其他所有对象,提供了清晰的边界划分。关注在外部行为,将内部实现和外部行为分离
2. 封装
和抽象相对,关注在内部行为
3. 模块化
系统的属性,它可以分解为一系列高内聚低耦合的模块,它将相关联的抽象聚集在一起
4. 层次
抽象的层次或者等级。最重要的是类的“is"结构以及对象的“part of"结构
5. 类型
代表对对象的类的强调
6. 并发性
7. 持久化
对象的超越了时间和空间的属性
类和对象
1. 对象
对象是一种有状态、行为以及唯一