《代码大全》读书笔记上篇

来源:互联网 发布:沈阳盘古网络招聘 编辑:程序博客网 时间:2024/04/30 18:06

Subsections 
软件创建过程 
软件隐喻
前期准备
软件构建中的设计
高质量的子程序
模块化设计
高级结构设计
生成数据

一、软件创建的过程

                   1、问题定义

                   2、需求分析

                   3、实现计划

                   4、总体设计

                   5、概要设计

                   6、系统集成

                   7、单元测试

                   8、系统测试

                   9、校验性维护

                   10、功能强化

二、软件隐喻

隐喻是启示而不是算法。

隐喻把软件开发过程与其他熟悉的活动联系在一起,帮助你更好地理解。

软件隐喻是一束搜索灯光而不是一张地图,它不会告诉你到那里去找答案,只给你启发叫你如何寻找答案,而不想数学公式一样硬性规定去到那里找到答案。启发和公式区别是微妙的:公式给予直接指令;而启发则告诉你该怎样找到这些指令、或者告诉你到那里去找。

参考书籍: 《科学变革的结构》

                     《编程范型》

三、前期准备
迭代是开发和按需了式开发,迭代式开发能减少前期不足造成的负面影响,但不能完全消除。序列式开发仅仅依赖测试来发现缺陷,绝大部分缺陷延迟到项目快结束的时候进行,使的成本很高。只要进行前期准备,无论是迭代还是序列式开发都能减少成本,通常迭代式开发是更好的选择。

问题定义的先决条件:对系统要解决什么问题做出清楚的陈叙。
需求的先决条件:需求详细描述软件系统应该做什么。明确需求避免争论,把系统的范围确定下来。如果程序员对“程序应该做什么”意见不一致,可以查看书面需求,以解决分歧。
架构的先决条件:用于支撑更细节的设计框架。
        主要类:架构定义详细定义所用的主要类
        数据设计:主要文件和数据表的设计
业务规则:架构依赖特定的业务规则,那么应该详细描述这些规则。并描述这些规则对系统设计的影响。
用户界面管理:
资源管理:数据库,内存。
性能:速度,内存,成本之间的优先顺序。
安全:cookies,加密,解密,错误消息。
可收缩性:系统增长以满足未来需求的能力。架构应该描述应对用户数量,服务器数量,网络节点数量,数据库记录数,长度,交易量增长
互用性:与其它软件共享数据和资源。
国际化/本地化:
输入/输出
错误处理
容错性:架构应该详细定义所期望的容错种类,容错是增强系统可靠性的一组技术,包括检测错误,如果可能从错误中恢复,如果不可能从错误中恢复,则包容其不利影响

四、软件构建中的设计
理想的设计特征
最小复杂度:设计的目标就是要让复杂度最小。
易于维护:在设计的时候,需要为做维护的程序员着想。
松耦合:在设计时,程序的各个组成部分关联最小。
可扩展:能增强系统的功能,而无须破坏底层。
可重用:设计系统的组成部分在其他系统中可以重复使用。
高扇入:让大量的类使用某个给定的类,设计系统很好的利用底层上的工具类。
低扇出:一个类里少量使用其他的类。
可移植:
层次性:保持各个分解层的层次性。
精简性:设计的系统没有多余的部分。

五、高质量的子程序
什么是子程序:
     子程序是具有单一功能的可调用的函数或过程。

设计子程序,定义这个子程序将要解决的问题。这些问题有:
     这个子程序将要隐含的信息。
     这个子程序的输入。
     这个子程序的输出,包括受到影响的全局变量。
     这个子程序将如何处理错误.

高质量子程序的特点:
a、子程序名称恰当
     一个恰当的子程序名称应该清晰地描述出子程序所作的每一件事。
     对于过程的名字,可以用一个较强的动词带目标的形式。PrintReport(),Checkotderlnfo() 。
     对于函数名字,可以使用返回值的描述。一个函数返回到一个值,函数应该用它所返回的 值命名,例如 Cos(),PrinterReady(),CurrentPenColor()
     避免无意义或者模棱两可的动词。有些动词很灵活,可以有任何意义,比如 HandleCalculation(),ProcessInput()。
     名字的长度要符合需要。研究表明,变量名称的最佳长度是 9 到15个字母,函数的名字长度15 到 20 个字母。

b、强内聚性 
内聚性指的是在一个子程序中,各种操作之间互相联系的紧密程度。
可取的内聚性 :
     功能内聚性。功能内聚性是最强也是最好的一种内聚,当程序执行一项并且仅仅是一项工作时。
     顺序内聚性。顺序内聚性是指在子程序内包含需要按特定顺序进行的、逐步分享数据而又不形成一个完整功能的操作。一个子程序包括五个操作:打开文件、读文件、进行两个计算、输出结果、关闭文件。
     通讯内聚性。通讯内聚性是在一个子程序中,两个操作只是使用相同数据,而不存在其它任何联系时产生的。比如,在 GetNameAndChangePhoneNumber()这个子程序中,如果 Name 和PhoneNumber 是放在同一个用户记录中的,那么这个子程序就是通讯内聚性。这个子程序从事的是两项而不是一项工作,因此,它不具备功能内聚性。Name 和 PhoneNamber 都存储在用户记录中,不必按照某一特定顺序来读取它们,所以,它也不具备顺序内聚性。 

不可取的内聚性:
     过程内聚性。当子程序中的操作是按某一特定顺序进行的,就是过程内聚性。与顺序内聚性不同,过程内聚性中的顺序操作使用的并不是相同数据。比如,如果用户想按一定的顺序打印报告,而所拥有的子程序是用于打印销售收入、开支、雇员电话表的。那给这个子程序命名是非常困难的,
     逻辑内聚性。当一个子程序中同时含有几个操作,而其中一个操作又被传进来的控制标志 所选择时,就产生了逻辑内聚性。这类子程序的主要问题是一定要通过传入一个控制标志来决定子程序处理的内容。解决的办法是编写三个不同的子程序,每个子程序只进行其中一个操作。如果这三个子程序中含有公共代码段,那么还应把这段代码放入一个较低层次的子程序中,以供三个子程序调用。并且,把这三个子程序放入一个模块中。

内聚性举例: 
     功能内聚性例子。比如计算雇员年龄并给出生日的子程序就是功能内聚性的,因为它只完成一项工作,而且完成得很好。
     顺序内聚性的例子。假设有一个按给出的生日计算雇员年龄、退休时间的子程序,如果它是利用所计算的年龄来确定雇员将要退休的时间,那么它就具有顺序内聚性。而如果它是分别计算年龄和退休时间的,但使用相同生日数据,那它就只具有通讯内聚性。 
     逻辑内聚性的例子。一个子程序将打印季度开支报告、月份开支报告和日开支报告.具体 打印哪一个,将由传入的控制标志决定,这个子程序具有逻辑内聚性,因为它的内部逻辑是由输进去的外部控制标志决定的。显然,这个子程序不是按只完成一项工作并把它作好的原则。 怎样使这个子程序变为功能内聚性呢?建立三个子程序:一个打印季度报告,一个打印月报告、一个打印日报告,改进原来的子程序,让它根据传送去控制标志来调用这三个子程序之一。调用子程序将只有调用代码而没有自己的计算代码,因而具有功能内聚性。而三个被调用的子程序也显然是功能内聚性的。非常巧合,这个只负责调用其它子程序的子程序也是一个事务处理中心。最好用如 DispatchReportPrinting()之类带有“调度”或“控制”等字眼的词来给事务处理中心命名,以表示它只负责命令的调度,而本身并不做任何工作。 

c、松散耦合性 
所谓耦合性指的是两个子程序之间联系的紧密程度。
     简单数据耦合。如果两个子程序之间传递的数据是非结构化的,并且全部都是通过参数表进行的,这通常称作
     数据结构耦合。如果在两个程序之间传递的数据是结构化的,并且是通过参数表实现传递的,它们之间就是数据结构耦合的。它与简单耦合的主要区
别是它所采用的数据是结构化的。
     不合理耦合(pathological) 。如果一个子程序使用了另外一个子程序中代码,或者它改变了其中的局部变量。

d、子程序长度
最近研究发现,当子程序长度是 100 到 150 行时,错误率最低

e、防错性编程 
在防错性编程中,其中心思想是,即使一个子程序被传入了坏数据,它也不会被伤害,哪怕这个数据是由其它子程序错误而产生的。
断言是一个在假设不正确时会大声抗议的函数或宏指令。可以使用断言来验证在程序中作并排除意外情况。
一个好的程序从来不会输出乱七八糟像垃圾似的东西,不管它被输入的是什么。一个好程序的特点是“输入垃圾,什么也不产生”,或“输入垃圾,输出错误信息”,也可以是“不允许垃圾进入”。从现在的观点来看“输入垃圾,输出垃圾”,往往是劣质程序。 
异常情况处理 

f、子程序参数 
     确保实际参数与形式参数匹配。
     如果几个子程序使用了相似的参数,应按照不变的顺序排列这些参数。
     使用所有的参数。如果向某个子话,就把它从子程序接口中去掉。
     把状态和“错误”变量放在最后。根据约定,状态变量和表示程序中有错误的变量应该放于子程序来说是不很重要的。
     不要把子程序中的参数当作工作变量。
     说明参数的接口假设。如果假定被传入子程序的数据具有某种特性,那么需要对这个假设作出说明。比如数值参数的单位(米还是千米)。
     应该把一个子程序中的参数个数限制在7个左右。

 
原创粉丝点击