首页 > 代码库 > 结构化程序设计 ?

结构化程序设计 ?

面向对象程序设计的雏形早在1960年的Simula语言中就出现过。当时程序设计领域正面临一种危机:面对越来越复杂的软 硬件系统,传统的以C语言为代表的面向过程程序设计思想已越来越无法满足现实的需要——面向过程的设计无法很好地描述整个系统,同时设计结果也让人难以理 解,因而给软件的实现以及后期的维护带来了巨大的挑战,项目越大越难以实现,越到项目后期越难以实现,人们正陷入一场前所未有的软件危机中。为了化解这场 软件危机,人们开始寻找能够消灭“软件危机”这头怪兽的“银弹(silver bullet)”。面向对象程序设计思想正是在这种背景下应运而生,它通过强调设计与实现的可扩展性和可重复性,成功地化解了这场“软件危机”。至此以 后,面向对象的程序设计思想开始在业界大行其道,逐渐成为主流。而从C语言向C++的进化刚好就发生在这个时期,自然而然地,C++也就选择了支持面向对 象程序设计思想。


《人月神话》与银弹


《人月神话》是软件领域里一本具有深远影响的著作。它诞生于软件危机的背景之下,而正是这本书提出了“银弹”的概念。

在西方的神话传说中,只有被银弹击中心脏,才可以杀死怪兽。而在这本书中,作者把那些规模越来越大的、管理与维护越来越困难的软件开发项目比作传说中无法控制的怪兽,并希望有一项技术能够像银弹杀死怪兽那样,彻底地解决这场软件危机。


其实,面向对象程序设计思想并不是完全意义上的银弹,它不可能解决所有大型软件项目所遇到的问题,但是它提出了一种描述软件的更加自然的方式,在一定程度上解决了这场软件危机。


6.1.1 “自顶向下,逐步求精”的面向过程程序设计

要想了解新的面对对象思想有什么优点,最简单直接的方式就是先看看旧的面向过程思想有什么缺点。回顾前面章节中曾经学过的例子,我们在解决问题时总是按照这样的流程:先提出问题;然后分析问题的处理流程;接着根据流程需要把一个大问题划分为几个小问题;如果细分后的小问题仍然比较复杂,则进一步细分,直到小问题可以简单解决为止;实现每个子模块,解决每个小问题;最后通过主函数按照业务流程次序调用这些子模块,最终解决整个大问题,如图6-1所示。像这样从问题出发,自顶向下、逐步求精的开发思想我们称为“面向过程程序设计思想”,它描述的主要是解决问题的“过程”。

图6-1 面向过程程序设计的流程

面向过程程序设计思想诞生于20世纪60年代,鼎盛于20世纪80年代,是当时最为流行的程序设计思想。它的流行有其内在原因,跟当时其他程序设计思想相比,它有着明显的优势。

1. 程序仅由三种基本结构组成

正如第4章中所介绍的程序流程控制结构一样,面向过程程序设计思想限定程序只有顺序、选择和循环这三种基本控制结构。任何程序逻辑,无论是简单的还是复杂的,都可以用这三种基本的控制结构经过不同的组合或嵌套来实现。这就使得程序的结构相对比较简单,易于实现和维护。

2. 分而治之,各个击破

人们在解决复杂问题时,总是采用“分而治之”的策略,把大问题分解为多个小问题后,再“各个击破”并最终让大问题得到解决。面向过程程序设计思想也采取这种“分而治之”的策略,把较大的程序按照业务逻辑划分为多个子模块,然后分工逐个完成这些子模块,最后再按照业务流程把它们组织起来,最终使得整个问题得到解决。按照一定的原则,把大问题细分为小问题“各个击破”,符合人们思考问题的一般规律,其设计结果更易于理解,同时这种方法也更易于人们掌握。通过分解问题,降低了问题的复杂度,使得程序易于实现和维护。另外,部分分解后的小问题(子模块)可以重复使用,从而避免了重复开发。而多个子模块也可由多人分工协作完成,提高了开发效率。

3. 自顶向下,逐步求精

面向过程程序设计思想倡导的方法是“自顶向下,逐步求精”。所谓“自顶向下,逐步求精”,就是先从宏观角度考虑,按照功能或者业务逻辑划分程序的子模块,定义程序的整体结构,然后再对各个子模块逐步细化,最终分解到程序语句为止。这种方法使得程序员能够全面考虑问题,使程序的逻辑关系清晰明了。它让整个开发过程从原来的考虑“怎么做”变成考虑“先做什么,再做什么”,流程也更加清晰。

随着时代的发展,软件开发项目也越来越复杂。虽然面向过程程序设计思想有诸多优点,但在利用它解决复杂问题的时候,其缺点也逐渐暴露出来:在面向过程程序设计中,数据和操作是相互分离的,这就导致如果数据的结构发生变化,相应的操作函数就不得不重新改写;如果遇到需求变化或者新的需求,还可能涉及模块的重新划分,这就要修改大量原先写好的功能模块。面向过程程序设计中数据和操作相互分离的特点,使得一些模块跟具体的应用环境结合紧密,旧有的程序模块很难在新的程序中得到复用。这些面向过程程序设计思想的固有缺点使得它越来越无法适应大型的软件项目的开发,这真是“成也面向过程,败也面向过程”。于是,人们开始寻找一种新的程序设计思想。正是在这种情况下,一些新的程序设计思想开始不断涌现并逐渐取代面向过程程序设计思想,而面向对象程序设计思想就是其中的“带头大哥”。

结构化程序设计的概念最早由E。W。Dijikstra在1965年提出的。它的主要观点是采用自顶向下、逐步求精的程序设计方法来对程序进行构造。结构化程序设计的概念、方法和支持这些方法的一整套软件工具,构成了结构化革命。这是存储程序计算机问世以来.对计算机界影响最大的一个软件概念,被称为软件发展中的第三个里程碑,其影响比前两个里程碑(子程序、高级语言)更为深远。

结构化程序是由若干个基本结构组合而成,每一个结构可以包含若干条语句和其他基本结构。结构化程序设计中包含三种基本的结构:顺序结构、选择结构和循环结构由这三种基本控制结构进行构造。

1 顺序结构

世界上的所有事情都是有顺序的,那么顺序结构当然也就表示程序中的各操作是按照它们出现的先后顺序执行的,其流程如图7-16所示。事实上,不论程序中包含了什么样的结构,而程序的总流程都是顺序结构的。

技术分享

2 选择结构

选择结构顾名思义,当程序到了一定的处理过程时,遇到了很多分支,无法按直线走下去,它需要根据某一特定选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行,选择结构有单选择、双选择和多选弹三种形式。双选择结构如图7-17所示。当语句1和语句3中的任意一个处理为空时,说明结构中只有一个可供选择的分支。也就是说,当条件不满足时,什么也没执行,所以称为单选择结构。

技术分享

3.循环结构

不断的重复,被称作循环,所以这里的循环结构通常就是用来表示反复执行一个程序或某些操作的过程,直到某条件为假(或为真)时才可终止循环。在循环结构中最主要的是:什么时候可以执行循环?出现哪些操作需要循环执行?循环结构的基本形式有两种。当型循环和直到型循环,其流程如图7-18所示。虽然什么是结构化程序设计,至今还没有被普遍接受的定义。但是在软件程序设计中,不同编程员的编程效率不同,差异可达-个数量级。主程序员组是指以一个非常能干的程序员为中心,即主程序员,小组中剩余成员为主程序员提供其他能力和服务。主程序员组结构可以提高编程效率并尽量减少开发系统中不必要的人与人之间的通信连线。作为这种组织形式中的一个程序员,应具备程序设计的基本知识,对项目所在的领域有较深入的了解,熟悉开发的技术环境。能承担一定的程序编写,更为重要的是必须有高度的组织纪律性和团队精神,使自己的工作融人整个系统,与组内其他成员协调一致地工作。

结构化程序设计 ?