软件创建的先决条件
在软件开始开发前,先要准备一些条件,当这些条件准备充分时,这样软件开发效率高,质量有保障。先决条件有
- 需求分析:明确正式需求,避免发生争议。不轻易更改代码
- 结构设计:
- 设计扩展性好的系统,增加可维护性;一个模块指的是完成高级功能的子程序的组合。每个模块都遵循单一原则或迪米特原则
- 变动策略:增加系统灵活,以容纳这些变动;如功能增加;同时应付这些变动有:增加版本号、保留一部分区域未将来使用、动态设计添加内容的文件、使用表驱动技术
- 使用现成软件:提高开发效率
- 设计数据结构:遵循数据守恒原则
- 关键算法
- 主要对象:面向对象中规定类的职责、相互之间的作用
- 通用功能
- 用户界面设计
- 字符串存储:提示、状态、帮助信息
- 错误处理:纠正还是测试、主动还是被动、怎样对付错误、错误信息约定、错误属于那个层次
- 坚固性:裕度设计、断言、容错性
- 性能
- 选择编程语言:使用高级语言编程,其效率与质量比使用低级语言编程高很多
- 编程约定
- 应花在先决条件上时间
- 改变先决条件已适应时间
总结
- 如果想开发一个高质量的软件,必须自始至终重视质量问题。在开始阶段强调质量往 往比在最后强调质量更为有效。
- 程序员的份内工作之一便是向老板和同事宣传软件的开发过程,包括在编程开始前从事先决条件准备工作的重要性。
- 如果问题定义工作做得不好,那么在创建阶段,所解决的问题可能并不是用户真正要 解决的问题。
- 如果需求分析工作做得不好,很可能因此而漏掉要解决问题中的重要细节。在创建工作后更改需求,要比在需求分析段进行更改的成本高 20 到 100 倍。所以,在开始编程前一定要确认需求定义工作一切正常。
- 在编程前规定好约定,在创建工作结束后再改变代码来满足约定几乎是不可能的。
在创建活动开始之前如果无法完成准备工作,可以尝试在不太稳固的基础上进行创建活动。
高质量程序特点
强内聚(分层-单一)
内聚性 是指一个子程序的内部各部分之间的联系程度
可取内聚功能内聚:当程序执行一项并且仅仅是一项工 作时,就是这种内聚性(单一)
- 顺序内聚:指在子程序内包含需要按特定顺序进行的、逐步分享数据而又 不形成一个完整功能的操作。(顺序内容)
- 通讯内聚:通讯内聚性是在一个子程序中,两个操作只是使用相同数据,而不存在其它任何联系时产生的。(操作相同数据)
- 临时内聚:因为同时执行的原因才被放入同一个子程序里,这时产生临时内聚性。(表达同一个功能/生命周期)
不可取内聚
- 过程内聚:当子程序中的操作是按某一特定顺序进行的,就是过程内聚性。与顺序内聚性不同,过程内聚性中的顺序操作使用的并不是相同数据。
- 逻辑内聚:当一个子程序中同时含有几个操作,而其中一个操作又被传进来的控制标志 选择时,就产生了逻辑内聚性。之所以称之为逻辑内聚性,是因为这些操作仅仅是因为控制 流,或者说“逻辑”的原因才联系到一起的,它们都被包括在一个很大的 if 或者 case 语句中, 它们之间并没有任何其它逻辑上的联系。但是,如果一个逻辑内聚性的子程序代码都是一系列 if 和 case 语句,并且调用其它子程序, 那么这是允许的。
- 偶然内聚性:同一个子程序中的操作之间无任何联系时,为偶然内聚性。也叫作“无内 聚性”。
松散耦合性
耦合指的是子程序之间的联系程度,> 在建立一个子程序时,应尽量避免它对其它子程序有依赖性.
耦合标准
- 耦合规模:指两个子程序之间联系的数量多少。
- 密切性:密切性指的是两个子程序之间联系的直接程度。联系越直接越好,两个子程序之 间联系最密切的是参数表中的参数。
- 可见性:可见性是指两个子程序之间联系的显著程度。参数表中传递数据是明显的,因而也是好的
- 灵活性:灵活性是指改变两个子程序之间联系的容易程度。
耦合层次
- 简单数据:通过参数
- 结构化数据:参数是对象
- 控制:如果一个子程序通过传入另一个子程序的数据通知它该作什么,那么这两个子程序就是控制耦合的。
- 全局数据:如果两个子程序使用同一个全局数据,那它就是全局数据耦合的。
不合理:如果一个子程序使用了另外一个子程序中代码,或者它改变了 其中的局部变量,那么它们就是不合理耦合的。这种耦合也称之为“内容耦合”。
子程序长度
最佳长度一到两页即可,66到132行。或者100到150行最佳
防错性编程
核心思想:一个子程序传入错误数据,将不受影响。
输入垃圾,不一定要输出垃圾;输入垃圾,什么也不产生、输入垃圾,输出错误信息、不允许垃圾进入
- 异常情况处理
- 预计改动
- 计划去掉调试帮助
- 使用“防火墙”包容错误带来的危害
- 检查函数返回值
在软件中保留多少防错性编程
确保实际参数与形式参数匹配
- 不要把子程序中的参教当作工作变量
- 应该把一个子程序中的参数个数限制在 7 个左右
- 不要和参数打交道