第一部分从软件工程的角度介绍了软件的开发过程,强调了需求分析、构建的重要性。可以说是技术的管理手段。从第二部分开始,涉及构建的重要部分——编码,将目光聚焦到更细节的地方,也开始看到一些代码!
《创建高质量的代码》还是一个很笼统的标题,内容也是点到即止。但非常全面,阐述了软件构建和写代码时的各种注意事项,涉及到的内容非常丰富!和一般技术类书不一样的是,作者更注重构建一个易于理解和管理的代码,而非纯粹高效、有用的代码。
首先还是从构建的设计开始,软件设计不是算法设计那么精确,它是方向性的东西,它主要解决的是一个“管理复杂度”的问题,其中理性的设计特征是:最小的复杂度、易于维护、松散耦合、可扩展性、可重用性、高扇入,低扇出、可移植性、精简性、层次性、标准技术。
设计的层次是一种自上而下的设计方式,从软件系统设计->分解为子系统或包->分解为包中的类->分解为类中的数据和子程序->子程序内部。其中重点介绍了分解为子系统或包这部分,但分解原则是类似的,如分解时保证各个子部分之间的关系简明,功能独立(高内聚,松耦合)。启发式方法的构造方法,有点类似于面向对象的设计方法。“先别问系统做什么,问问它模仿什么”,想想如何抽象(拔高)它,以此来封装实现细节和隐藏信息,就象冰山一角一样的设计类。作者谨慎的告诫“当继承能简化设计时就继承”,他更推荐包含而不是继承。将容易改变的区域作为一类,这样就可以更方便的修改这些部分。最后还是介绍了软件设计模型(设计实践)如迭代、分而治之、自上而下、自下而上、原型、合作。
然后更进一步,从类设计开始讨论。类的设计从ADT(Abstract Data Types)抽象数据类型开始,当然在没有类支持的C中也可以使用ADT。好的抽象要有一个好的类接口,这个接口是统一的,也就是类抽象的层次,混乱的层次主要是在高层类处理或者提供低层操作。良好的封装同样要考虑抽象层次的问题,不要提供与本类不在同层上的数据,如在人事类上暴露文件句柄。尽量不要暴露成员数据,通过方法来访问设置。“is a”和“has a”是个老话题了,似乎继承并不是最好的选择。
高质量的子程序是程序设计分解的最后一层。不要过多的从效率和布局(代码太长、太短)上去划分子程序,从构造和设计上去考虑,让代码更加易于理解。文章对子程序的命名、参数布局也进行了探讨,明显“动词+宾语”的名字是不错的选择,“传入-修改-传出”的参数布局是比较理想的,而不是字母的先后(可能在函数体内变量定义,这是个可取的方法)如果可能,应该对参数的使用进行设置,如c中的const,c#中的out,都可以规范对参数的使用。在工作区内复制参数进行使用是不错的选择,别以为这样会浪费内存。
防御式编程是编程的重要方面,“只有10%的代码是让程序去做该做的事,90%的代码是让程序不去做不该做的事”文章介绍了几种常用的防止错误、和异常处理的技术——断言、一般技术、异常。断言可以判断程序是否按照我们预想的方式在运行,一般技术包括在遇到错误时的处理方法,可以内部处理,也可以返回错误码让上层处理。不过异常就像“继承”一样不受作者推荐。在构造和析构函数中是不推荐使用try-catch,不过我认为finially可以处理一些善后的事情。对抛出异常不做处理也预示着一种错误的设计方式。隔离程序,使得各个模块直接添加一些判断,使得错误不会在整个程序中扩散。也就是不要假设其他模块传来的数据肯定是完整的。使用一些技术可以发布程序的debug版和relase版,为用户提供更高的性能,为开发时期提供更多的错误提示。
最后有了上面的大体设计、类设计、子程序设计、就到了子程序的编写了。伪代码往往可以为写代码之前提供更好的思路。从子程序的描述、然后伪代码开始来写代码。
以上只是,对第二部分的浏览,任何一部分都可以专门做一个专题去研究!