第七章 高级结构设计
1.软件设计引论
2.结构化设计
3.面向对象
4.对目前流行的设计方法的评论
5.往返设计,小结
软件设计引论
大型和小型项目设计
大型:软件结构设计、高层次模块设计、实现细节设计
小型:设计(用程序语言编程)
设计的层次
划分成子系统、划分成模块、划分成子程序、子程序内部的设计
- 划分成子系统:子系统(数据库接口、用户接口、命令解释程序、报告格式程序等),将系统划分为几个主要要素,并定义这些要素间的接口(主要针对耗时在几天以上的大项目)
- 划分成模块:识别系统中所有的模块,子系统可能仍较复杂,难以直接翻译成代码,那么我们还需要将子系统划分为几个模块如:数据存储、数据恢复、问题解释等,如分解出来的模块还是太复杂,再进行划分即可
- 划分成子程序:把每个模块划分成各种功能,一旦一个子程序被识别出来,那么就同时规定它的功能(这一步并不一定需要被正式的进行,但起码是要在心中进行)
- 子程序内部的设计:在子程序的层次上设计,包括设计单个子程序中的详细功能。这步包括编写PDL,在参考书中寻找算法,在子程序中组织代码段落,编写程序语言代码等活动(这一步在任何项目中都要进行,如果缺少了这一层次的工作,任何程序都不可能产生)
创建中的设计工作
内部子程序设计、划分成子程序、划分成模块、划分成子系统
结构化设计
1. 系统组织
2. 开发设计的策略
3. 评估设计准则
4. 关于问题的明确说明
5. 表达设计的图形和语言工具
选择需进行模块化的要素
自顶向下分解
把程序分解为子程序的一种流行方法,也称为逐步求精,从关于程序功能的粗略说明出发,逐步推到程序要做的每一项特定的工作。
此方法设计原则:1.设计高层次2.避免特定语言细节3.暂时不指出下一层次的设计细节(与信息隐含类似)4.正规化每个层次5.检验每个层次6.转移到下一层次,进行信的求精工作。
自底向上合成
在每设计一个程序时,可以问自己“这个系统需要做什么?”,从而可以识别出系统需要具备的较低层次的功能,就像修房一样,从低到高,设计出某些低层次的功能,再从事较高层次设计可能会有把握一些了
此方法设计原则:1.问自己关于系统需要做什么2.利用这些问题设计出低层次功能3.识别出这些低层次功能,将其组合到一起4.向上一个层次进行同样的工作
自顶向下是从一般到特殊,自底向上是从一般到特殊
面向对象
关键思想
面向对象是建立在一下主张上的:一个程序模型越是真实地反映了实际问题, 那么,由此产生出的程序质量越好,在多数情况下,关于项目的数据定义要比功能稳定得多, 因此应象面向对象设计一样,根据数据来进行设计,这可以使设计更稳定。
抽象
抽象所带来的主要好处是可以忽略掉无关紧要的细枝末节问题,而专注于重要的特性。
用房屋来举例:房屋是木材、钉子、玻璃、砖和水泥等的抽象,是把它们组织起来的一种方法。
封装
封装是对抽象不存在地方的补充。
继续用房屋比拟来说明问题:封装是一个使你可以看到房屋的外表但不能走进去的办法。
模块化
面向对象设计中的模块与结构化设计中模块的含义是一致的。相联系的数据和功能被放 入模块,在理想情况下,模块是高度内聚而又松散耦合的
层次结构和继承性
在设计软件系统时,你经常可以发现两个之间非常相似,其差别非常小的对象。定义这种对象间的共同和不同点称为“继承性”继承策略的好处是它与抽象的概念是一致的,抽象在不同层次的细节上与对象打交道。在面向对象编程中,继承性简化了编程,因为你只要写一个通用子程序来处理对象间的共 同特性,再编写几个专用子程序去处理它们间的不同特性就可以了。
对象与类
在面向对象设计中,最后一个关键概念是对象与类。对象是程序在运行时其中的任何一个 实体,而类则是当你看程序清单时存在的一个静态实体。对象是在程序运行时具有特定值和属 性的动态实体。
面向对象设计的步骤
- 识别对象及其属性,它往往是数据
- 确定对每个对象可以做些什么
- 确定每一个对象可以对其它对象做些什么
- 确定每个对象对其它对象来说是可见的部分——哪一部分是开放的,哪一部分是专用 的
- 确定每个对象的公共接口
对目前流行设计方法的评论
结构化设计和面向对象设计——你会发现每 种方法都包括两个主要部分:
把一个系统分解成子系统的准则 解释分解的图形式语言符号
有些方法还包括第三个要素 防止你使用其它方法的规定
一个好的系统分解的确是很有价值的,但并不是说一旦确立了好的结构,设计就可以停止 了。在确认出子程序的模块之后,还有许多设计工作要做。
何时使用结构化设计\信息隐蔽\面向对象设计
结构化设计主要是一种把程序分解成子程序的方法。它强调功能但不强调数据。
结构化设计并没有把子程序组成一个协同工作子程序组的概念,也没有子程序内部设计的 概念,除非这个子程序的内部会影响到整个系统。因此,结构化设计非常适用于具有许多互不 作用的独立功能的系统。同时,它也适于那些只有几百行代码的小型程序,因为这些程序过于 简单,没有建立类、对象和属性的必要。
无论什么问题领域,都应该尽量采用信息隐蔽。使用它没有任何危险。不论是设计子程序、模块,还是对象程序,它都是很有 效的,因此你尽可以放心使用它。
面向对象设计与结构化设计的主要区别是:面向对象设计在较高抽象层次上要比结构化设计有效。面向对象设计主要是设计模块数据和对数据操作的集合。它非常适于从最顶层分解系统。面向对象设计适合于任何客观世界中的对象。这类系统的例子包括高度交互化的窗口、对 话框、按钮等程序;面向对象的数据库;需要对随机事件做出反应的事件驱动系统等等。
往返设计,小结
你可能会有这样的体验:当你编写程序快结束时,你非常希望能有机会再重新编写一次, 因为在编写过程中你对问题又有了更深的理解。这对设计也是同样适用的,只不过在设计中这 个循环的周期更短,带来的好处也更大,因此,你完全可以在设计过程中进行几次往返。
在用不同的设计方法对各种设计方案进行尝试的进程中,将从高层次的总体上和低层次的 细节上对问题进行观察。在从事高层次问题时获得的总体印象将会对你在低层次细节中的工作 有很大帮助;同时,在从事低层次问题时所获得的细节将为你对高层次的总体理解和作出总体 设计决定奠定下良好的基础。这种在高层次和低层次之间往返思维过程是非常有益的,由此而 产生的结构,将比单纯自顶向下或自底向上产生的结构要稳定得多。
设计是一个非常复杂的过程,也是一个启发的过程
设计是一个启发的过程。 固执地坚持某一种方法只会抑制创造力,从而产生低质量的 程序。坚持设计方法上有一些不屈不挠的精神是有益的,因为这可以迫使你对这种方法 进行充分理解。但是,一定要确信你是在不屈不挠而不是顽固不化。