软件架构与设计 第 16 课 Non-Functional Property
约 3 分钟· 本文阅读 次
本页目录
虽然非功能属性不会直接体现在具体的实现上,但仍然会对如何实现各种功能产生巨大的影响,这节课我们就来具体了解一下。
非功能属性指的是那些比较『虚』的,但是对整个系统又有举足轻重影响的概念,比如:
- Efficiency
- Complexity
- Scalability
- Heterogeneity
- Adaptability
- Dependability
产品设计之初,都是根据其功能属性来决定的,但是确定合适的功能并不简单,市场需求、竞争对手等各种条件的限制。可是系统的最终成败,还是由非功能属性决定的,比方说反应速度、稳定性等等
效率 Efficiency。
效率,简单来说,就是用最小的代价做最多的事情,我们要强调的是,对效率的追求,是从设计架构时开始的!
对于组件来说
- 做『小』的组件
- 保持组件的接口简单和紧凑
- 为同一个功能提供多个接口
- 隔离数据组件和运算组件
- 隔离数据和元数据
对于连接器来说
- 仔细选择连接器
- 小心运用广播机制的
- 可能的话多利用异步机制来交互
- Use location/distribution transparency judiciously(翻译不能)
对于架构来说
- 经常交互的组件应该更紧密
- 仔细选择连接器
- 考虑不同架构对效率的影响
复杂度 Complexity
复杂度,简单来说,就是整个系统在完成指定功能的前提下,有多简洁多清晰。
对于组件来说
- 不同的特性放到不同的组件中
- 组件只负责功能本身
- 负责处理的组件应该不受数据格式变化的影响
- 组件应该能够轻松结合起来
对于连接器来说
- 显式处理连接器
- 连接器只负责交互
- 不同的特性放到不同的连接器中
对于架构来说
- 去掉不必要的依赖
- 显式管理所有的依赖
- 运用层级继承结构
伸缩性 Scalability
伸缩性,简单来说,就是在不同平台,用不同数量的机器运行时,需不需要改动很多。
对于组件来说
- 每个组件有单一且清晰定义的目的
- 每个组件有单一且容易理解的接口
- 组件不应该负责交互
- 避免不必要的多样性
- 需要的时候复制数据
对于连接器来说
- 使用显式连接器
- 每个连接器有清晰定义的责任
- 选择满足要求的最简单的连接器
- 注意直接/间接依赖
- 避免在连接器中放功能相关的代码
对于架构来说
- 避免系统瓶颈
- 利用并行处理能力
- 数据源靠近数据消费者
- 使用合适的架构风格
- Try to make distribution transparent
适应性 Adaptablity
适应性,简单来说,就是在面对环境和需求变更时,是否需要改动很多。
对于组件来说
- 每个组件有单一且清晰定义的目的
- 最小化组件间的相互依赖
- 组件不应该负责交互
- 处理和数据隔离
- 数据和元数据隔离
对连接器来说
- 每个连接器有清晰定义的责任
- 让连接器足够灵活
- 支持连接器组合
对于架构来说
- 使用显示连接器
- 使用合适的架构风格
- Try to make distribution transparent
可靠性 Dependability
可靠性,简单来说,就是下面这几个词:Reliability, Availability, Robustness, Fault-tolerant, Survivability, Safety
对于组件来说
- 仔细控制外部组件的依赖
- 令组件支持 reflection
- 组件包含异常处理机制
- Specify the components' key state invariants
对于连接器来说
- 严格控制组件的依赖
- 保证组件的合理交互
对于架构来说
- 避免单点失败
- 关键的功能和数据要有备份机制
- 支持系统监控
- 支持动态适应
相关文章
- 软件架构与设计 习题课 6 设计模式进阶练习2016-03-30
- 软件架构与设计 习题课 5 设计模式练习2016-03-20
- 软件架构与设计 第 20 课 设计模式2016-03-17
- 软件架构与设计 第 19 课 People, Role, Teams2016-02-27
已恢复到上次阅读位置