《编程匠艺》之软件的架构与改良
第三部分: 代码的造成过程(软件的架构)
1. 崇尚设计(如何作良好的软件设计)
- 软件设计的层次
- 系统体系结构(总体系统和子系统,以及子系统之间的链接方式)
- 模块于组件
- 类和数据类型
- 函数
- 设计良好的特征
- 简洁和优雅
- 模块化(高内聚,低耦合)
- 良好的接口(为了建立良好的接口,能够遵循下面的步骤:)
- 肯定客户端, 了解它的需求
- 肯定供应端, 了解它的能力
- 推断所需的接口类型(函数, 类, 网络协议?)
- 肯定操做的性质(究竟须要提供什么样的功能?)
- 可扩展性(须要仔细评估如今的功能, 之后可能有的功能, 之后必定会有的功能)
- 避免重复
- 可移植性(尽可能减小对特定平台的依赖; 能够添加一个平台抽象层来屏蔽差别)
- 良好的文档(主要针对顶层的设计;在代码层面实现自说明)
- 如何作好的设计?
- 设计方法和过程
- 结构化设计(以分治做为主要特征,把问题不断分解为更小的问题)
- 面向对象的设计(面向对象的焦点在于系统中的数据,结构化设计焦点在于系统执行的操做; 能够花点时间看看设计模式)
- 设计工具
- 你如何衡量一段代码的设计质量?
- 设计是很难量化的, 只是对设计的审美评价.判断设计质量的惟一途径就是阅读代码.
2. 软件的体系结构(奠基软件设计的基础)
- 什么是软件体系结构?
- 软件蓝图
- 蓝图的做用:
- 肯定软件的模块,库,组件
- 肯定组件之间是如何通讯的
- 有助于鉴别和肯定系统中的接口特性,阐明子系统的角色和职责
- 视图
- 在体系结构的设计中,通常会有多个系统层来看待,就如同建筑有外观图, 布线图, 管道图等.主要包含:
- 概念视图,也称逻辑视图,显示了系统的主要部分和他们之间的关系.
- 实现视图,包含了实现模块的角度.
- 进程视图,使用任务,进程,通讯来显示动态的结构.
- 部署视图,显示任务在分布式系统不一样物理节点上的分布.
- 在什么时候何处进行体系结构设计
- 体系结构是需求达成一致后的第一个开发步骤.
- 体系结构设计是独立于模块设计阶段的,虽而后续的详细设计可能会反过来修正体系设计.
- 体系结构用来作什么?
- 验证(能够来整体验证是否可行, 是否知足需求, 是否有重复的工做)
- 沟通(体系结构将问题域映射到解决域, 并指明了如何扩展, 应该与软件保持一致)
- 判断优劣(来评判是否须要开发这个东西;并标识出重要的易错点)
- 体系结构最关注的是组件和链接.
- 组件能够是对象,进程,数据库或者第三方产品.每一个组件都是一个独立的功能单元.还会有描述外部可见性的东东.
- 链接. 链接能够是简单的函数调用,也能够是穿过管道的数据流.能够是事件处理程序,也能够是传递的消息机制.链接能够是同步的,也能够是异步的.
- 什么是良好的体系结构?
- 一个良好的体系结构是简洁的.是精心选择的模块和合理的通讯方式组成的.
- 体系结构设计须要平衡好组件的粒度.体系结构不规定各个模块内部的工做机制.须要是尽量的高内聚,低耦合.
- 体系结构会列出已作出的设计决策,并阐明为何比别的可选策略好.
- 体系结构风格
- 每种结构都有不一样的特征:
- 更改数据表示法,算法和所需功能的适应能力
- 模块分割和链接的方法
- 全面性
- 知足性能要求的能力
- 组件重用的考虑
- 常见的体系结构
- 分层的体系结构(如OSI参考模型)
- 管道和过滤器体系结构(数据流是串行的,每一个过滤器完整本身的功能,而后向下游传递,缺点是错误处理麻烦)
- c/s体系结构(他将功能分在客户机和服务器上两部分)
- 基于组件的体系结构(核心就是通讯的基础结构或者中间件)
- 框架()
- 常见的接口类型:
3. 改良与革命(代码是如何成长的)
- 要下面的警告信息,防止代码开始腐烂:
- 代码中遍及着大型的类和复杂的函数
- 函数的名称很隐晦
- 没有任何结构(不知道去哪里寻找某个功能)
- 内容重复(有许多相互独立的代码作着相同的事)
- 高耦合性
- 在数据流过系统时,它在各类表示法之间反复转换
- API变得模糊不清
- 代码中导出都是权宜之计:治标不治本的修改.系统的外围满是这种修改.
- 有些函数的参数太多了
- 添加新功能时,没有提供任何支持文档;现有的文档过期了.
- 代码在编译时产生了不少告警
- 你发现注释说:'不要动这些代码'
欢迎关注本站公众号,获取更多信息