回到首页

输入关键词,多个关键词用空格分隔。

← 软件架构与设计 · 系列目录

软件架构与设计 第 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

对于连接器来说

  • 严格控制组件的依赖
  • 保证组件的合理交互

对于架构来说

  • 避免单点失败
  • 关键的功能和数据要有备份机制
  • 支持系统监控
  • 支持动态适应

相关文章