• 沒有找到結果。

对目前流行设计方法的评论

在文檔中 Code Complete 代码大全 (頁 114-117)

第七章 高级结构设计

7.4 对目前流行设计方法的评论

int& Hours, DATE& Date, CLIENT_ID& Client, PROJECT ProjectCode,

EMPLOYEE_ID Employee );

protected:

… };

当你进行完这一步的工作,到达高层次的面向对象系统组织时,可以用两种方法进行迭代,

以便得到更好的对象——类组织。你也可以对定义的每一个对象进行迭代,把设计推向更详细 的层次。

7.3.3 典型面向对象设计的评论

一个面向对象系统通常有至少四类对象。如果你不知道这其中每类对象的一些情况,你很 可能会漏掉某类对象。

・ 问题域要素。这个要素直接指向问题域,在前述的记账系统中,问题域包括客观世界中 的对象,如:雇员、顾客,时间卡和账单等。

・ 用户接口要素。这个要素指的是系统中负责人机交互的部分。它包括数据入口类型、窗 口、对话框、按扭等等。正如 6.2 节中提到的那样,最好把系统的用户接口部分隐蔽起 来以适应修改。

・ 任务管理要素。这类要素指的是计算机本身的对象。包括实时任务管理程序、硬件接口、

通讯协议等。

・ 数据管理要素。这部分要素包括保持一致的数据。它包括数据库以及其相联系的所有存 储、维护和检索等功能。

7.4 对目前流行设计方法的评论

如果你仔细观察日前流行的设计方法——包括结构化设计和面向对象设计——你会发现每 种方法都包括两个主要部分:

・ 把一个系统分解成子系统的准则

・ 解释分解的图形式语言符号

・ 有些方法还包括第三个要素

・ 防止你使用其它方法的规定

把 “ 设 计 ” 的 意 义 限 制 在 前 两 个 要 素 上 说 明 设 计 的 核 心 是 把 系 统 分 解 成 亚 程 序 ( Subprogram ) ,同时也说明亚程序的设计并不具备足够的挑战性,不值得讨论。

一个好的系统分解的确是很有价值的,但并不是说一旦确立了好的结构,设计就可以停止 了。在确认出子程序的模块之后,还有许多设计工作要做。

伴随着某些设计方法的第三个要素,即强调应该只使用一种方法的思想,是非常有害的。

没有一种方法囊括了设计系统所需的全部创造力和洞察力。强调使用一种方法将破坏设计中的 思维过程。

但是,设计方法的选择往往会成为一种宗教似的问题——你去参加了一个宗教复兴会议,

听一些结构化设计的先知讲道,然后你回到自己的圣地在石碑上写下一些神圣的程序,从此以 后,你不再允许自己进入非基督教的领域。你应该知道,软件工程不是宗教,不应该引入宗教 的狂想性。

如果你是个建筑工人,你不会用同样的方法建造每一幢建筑物。在周一你在浇注水泥,而 到了周末你则在修建一幢木屋。你不会用水泥来修木屋,也不会在一幢新建好的摩天大楼门口 挂上“成人禁止入内”的牌子。你会根据不同的建筑物而采取不同的施工方法,从建造房子中,

你应该得到关于编程方法选择的启示,应该选择与问题相适应的方法,这种世俗方法的合理性 已经被许多例子和研究所证明。每种方法都有其优点,但同时也有其弱点,应分析使用(Peter 和 Tripp 1977,Mannino 1987,Kelly 1987,Loy 1990)。

但是,有些方法的障碍是由它们自己的复杂的术语产生的。比如,你想学习结构化设计,

你必须懂得如下词汇:输入流与模块、输出流与模块、正规、控制、公用、全局和内容耦合、

功能的、顺序的、通讯的、过程的、临时的、逻辑的和偶然性内聚,输入、输出、事务处理中 心、事物处理分析和事物处理模块,甚至 Benuzerfreundlichkeit(多可怕!)一词也出现了。字 典也无法给出这些词的解释。

结构化设计,以隐蔽信息为目标的设计和面向对象设计等方法提供了看问题的不同角度。

图 7-4 给出了使用它们的典型方法。

从事结构化设计的人与从事面向对象设计的人会发现他们进行交流非常困难,原因是他们 没有意识到是在不同层次上讨论设计的,因此主题也是不同的。从事结构化设计的 Tom 说:“我 想这个系统应该分解成 50 个子程序。”面向对象设计的 Joh 则说:“我认为系统应划分成 7 个对 象”。如果你仔细观察,可能会发现这 7 个对象中可能共含有 50 个子程序,而 Tom 的子程序或 许可以分成 7 组。

7.4.1 何时使用结构化设计

结构化设计主要是一种把程序分解成子程序的方法。它强调功能但不强调数据。一个面向 功能的问题域的例子是一个以批处理方式读入数据,按照可以预计的顺序对数据进行可以预计 的处理并且写数据。

结构化设计并没有把子程序组成一个协同工作子程序组的概念,也没有子程序内部设计的 概念,除非这个子程序的内部会影响到整个系统。因此,结构化设计非常适用于具有许多互不 作用的独立功能的系统。同时,它也适于那些只有几百行代码的小型程序,因为这些程序过于 简单,没有建立类、对象和属性的必要。

结构化设计的最先提出者 Larry Constantine,曾经发表过一篇“对象、函数和程序可扩展性”

的文章,论述了把结构化设计和面向对象设计组合到一起的设计方法。如果数据变动可能性很 大,那么采用面向对象设计比较合适,因为它将变动可能性较大的数据独立在对象(模块)中。

图 7-4 对于一个问题的不同设计(不同设计导致不同的解决方法,每一种都是正确的)

如果功能变动的可能性较大,采用面向对象设计就不太适合了,因为功能散布在许多对象(模 块)中。如果功能变化的可能性比数据要大,那最好采用分解功能的结构化设计。

7.4.2 何时采用信息隐蔽

无论什么问题领域,都应该尽量采用信息隐蔽。使用它没有任何危险。到目前为止,联邦 卫生委员会还没有发现它会发生危险,不论是设计子程序、模块,还是对象程序,它都是很有 效的,因此你尽可以放心使用它。

7.4.3 何时采用面向对象设计

面向对象设计与结构化设计的主要区别是:面向对象设计在较高抽象层次上要比结构化设

计有效。这是具有重大历史意义的。因为结构化最初开发起来时程序员们正在建立定义大而复 杂的系统,到现在已经远不及如今的大规模系统那样复杂了。

面向对象设计主要是设计模块数据和对数据操作的集合。它非常适于从最顶层分解系统。

而当你识别出对象的接口并开始编码时,你往往会转向结构化设计。如果你用面向对象的语言 编程,那么很难认为你没有在面向对象设计,因为你用面向对象方法、信息或其它进行结构设 计工作。如果你是在用比较传统的过程性语言进行设计,则很容易认为你是在用较旧的结构化 设计方法,在这时,使用这一方法是很合适的。

面向对象设计适合于任何客观世界中的对象。这类系统的例子包括高度交互化的窗口、对 话框、按钮等程序;面向对象的数据库;需要对随机事件做出反应的事件驱动系统等等。

关于面向对象设计技术的研究工作主要是针对代码在 105~1005 行以上的系统的。对于这 种规模的系统,结构化设计基本上是无能为力的,而面向对象设计则往往比较有效。然而,除 了这些超大型项目之外,稍显陈旧的结构化设计还是比较有效的,而面向对象设计对于较小型 项目的有效性,却还有等待证明。

在文檔中 Code Complete 代码大全 (頁 114-117)