在固有的软件开发中会涉及几个阶段,主要来说分三个步骤:设计,实施,测试与调试。
简言之,我们会谈一谈 Python 中好的实行法,当然包括了编码风格、命名规则、正式文档化,和单元测试。
对于面向对象的编程思想来说,设计步骤是开发期间最重要的一个阶段。因为在设计环节时,我们要考虑如何把一个程序分解成许多类,这些类该如何进行互动,每个类里应该存储什么样的数据,分别应该有那些动作。(例如,在网页模式书写这段内容时,由于登录超时,导致已经写过的内容全部丢失,需要重新再写。思路已经被打断,所以原始的内容已经无法再现了。但我会尽力去使用短暂记忆系统来回忆写过的内容!)
不管是新人还是老手,在这个步骤中都会面临不同的挑战。对于新人来说常常会面对的是为程序定义一些什么样的类。通常情况下也是难题部分,有一些好的规则能够帮助你来设计类:
第一责任:把一项工作分解成多个不同的角色,每个脚色具有不一样的责任。描述责任时要使用动词性语言,不要使用名字。这就足以说明程序中的许多类要干什么。
第二独立:为每个类定义要干什的时候,要尽可能与其它类保持独立关系,也就是不存在交集情况。类与类之间的责任要进行细分,这样每个类就能够进行自我管理,避免依赖关系。提供给类的数据要能够具备分辨使用数据时的动作能力,换句话说,假设你是一个类中的数据,那么当有人想要使用你的时候,你要能够分辨他们要干什么。
第三行为:定义每个类中的行为时需要谨慎和精确,这样一个类执行一个动作的后果会被其它正在与其交互的类理解。行为的定义就是在类里面定义方法,一个类中的许多行为也就是这个类的接口,这样做的意义在于能够让一段代码可以与类中的众多对象进行互动。
定义类常常伴随着许多实例变量和实例方法,这些都是面向对象编程设计时的关键点。熟练的程序员在执行这些工作任务时会自然地使用一个程序所需的模式,而这些模式都是他们曾经用过的。
在一个项目的初期,高层设计阶段常会使用一种名叫 CRC 卡牌模式。(CRC 是Class-Responsibility-Collaborator 类责任合作首字母缩写)这套工具的意义在于每张卡牌代表了一个组件,最终会变成一个程序中的一个类。玩法就是最上一行会有类的名字,起到索引的作用;下面部分会分为两列,左边会写下组件的责任,右边会列出与自己互动的其它合作项,有时候会是其它组件,因为需要与其它组件互动才能执行自己的动作。
设计过程不是直线上升的,而是在一个角色扮演环节进行迭代,其中我们首先要识别的就是动作(就是代表了责任),然后才确定角色(代表了一个组件),找到适合执行该项动作的角色。所以由于这样的一种工作原理,很少可能一下子就找到合适的匹配项,所以就不是直线上升,需要循环几次才能获得想要的结果。当匹配完成也就是设计完成了!使用 CRC 卡牌模式来做设计工作的好处我就不赘述了,你们自己体验一段时间自会找到答案。
作为设计的正式内容还有一项,那就是标准的解释,以及文档化工作。这里使用的就是 UML 绘图法(UML 是 Unified Modeling Language 首字母缩写形式),这种绘图语言是用来表达一个程序的组织情况,UML 是一项面向对象编程设计的标准可视化注释法。