1.2 程序设计方法
程序设计(Programming)是指设计、编制、调试程序的方法和过程。按照结构性质,有结构化程序设计与非结构化程序设计之分。前者是指具有结构性的程序设计方法与过程,它具有由基本结构构成复杂结构的层次性,后者反之。按照用户的要求,有过程式程序设计与非过程式程序设计之分。前者是指使用过程式程序设计语言的程序设计,后者是指非过程式程序设计语言的程序设计。下面简单介绍两种程序设计方法:结构化程序设计和面向对象程序设计。
1.2.1 结构化程序设计
在程序设计方法的历史上,最早提出的方法是结构化程序设计,其核心是将程序模块化。早在1968年,Dijskstra就提到了结构化程序设计,之后引起了业内关于goto语句的讨论。经过不断改进,结构化程序设计日臻完善。
提示:结构化程序设计方法主要使用顺序、选择、循环3种基本结构,形成具有复杂层次的结构化程序,此外,该方法要求严格控制goto语句的使用。
简单来说,结构化程序设计方法的注意事项如下。
● 采用“自顶而下,逐步求精”的设计思想。自顶而下是指从问题的总体目标开始,逐步求精是指层层分解和细化。
● “独立功能,单出、入口”的模块仅用3种(顺序、分支、循环)基本控制结构的编码原则。“独立功能,单出、入口”的模块结构减少了模块的相互联系,使模块可作为插件使用,降低了程序的复杂性,提高了程序可靠性。如图1-1所示为一个典型的采用结构化程序设计的程序结构图。
图1-1 结构化程序设计
结构化程序相对于非结构化程序有较好的可靠性、易验证性和可修改性;结构化设计方法的设计思想清晰,符合人们处理问题的习惯,易学易用,模块层次分明,便于分工开发和调试,且程序可读性强,其设计语言有Ada、Basic等语言。
1.2.2 面向对象程序设计
20世纪70年代中后期,由于结构化程序设计在进行大型项目设计时存在缺陷,于是面向对象程序设计方法(Object Oriented Programming,OOP)被提出,并逐步代替了传统的结构化程序方法,成为最重要的方法之一。
面向对象认为世界是由各种对象组成的,任何事物都是对象,复杂的对象可由较简单的对象以某种方式组成。由于面向对象的这种思想符合人们认识世界的观念,因此,面向对象程序设计一提出,就得到了广泛支持,至今已应用在各个领域。
面向对象程序设计方法是以“对象”为中心进行分析和设计的,使这些对象形成了解决目标问题的基本构件,即解决从“做什么”到“怎么做”的问题。其解决过程从总体上说是采用自低向上的方法,先将问题空间划分为一系列对象的集合,再将对象集合进行分类抽象,一些具有相同属性行为的对象被抽象为一个类,类还可抽象为子类、超类(超类是子类的抽象)。采用继承来建立这些类之间的联系,形成结构层次。
提示:采用面向对象程序设计方法来进行程序设计,其本质上就是不断设计新类和创建对象的过程。
如图1-2所示为一个类和对象的关系示意图。
图1-2 类和对象图
与传统的结构化程序设计方法相比,面向对象程序设计方法具有以下优点。
● 采用对象为中心的设计方式,再现了人类认识事物的思维方式和解决问题的工作方式。
● 以对象为唯一的语义模型,整个软件任务是通过各对象(类)之间相互传递消息的手段协同完成的。因此,能尽量逼真地模拟客观世界及其事物。
● 对象和类实现了模块化,类继承实现了抽象对象,任一对象的内部状态和功能实现的细节对外都是不可见的,因此很好地实现了信息隐藏。由此建立在类及其继承性基础上的重用能力可应付复杂的大型软件开发。
面向对象方法使得软件具有良好的体系结构、便于软件构件化、软件复用和良好的扩展性和维护性,抽象程度高,因而具有较高的生产效率。目前,面向对象程序设计语言主要有Java、C++等语言。
1.2.3 程序设计方法比较
通过1.2.1节和1.2.2节读者知道,目前流行的程序设计方法有很多,但真正具有广泛意义的是结构化程序设计和面向对象程序设计,以及20世纪90年代后逐渐发展起来的基于构件的程序设计方法。这些方法各有自己的特点,面向对象技术和构件技术是目前程序设计领域的热点,但是,结构化程序设计方法对面向对象程序设计中每个小模块(即成员函数)的设计也起到关键作用,两者各有特点。
● 结构化设计方法的设计思想清晰,易学易用,模块层次分明,便于分工开发和调试,编写出来的程序可读性强。
● 面向对象设计方法具有自下而上的特性,允许开发者从问题的局部开始,在开发过程中逐步加深对系统的理解。
由于面向对象程序设计是一种自下而上的程序设计方法,其不像过程式设计那样一开始就要用主函数概括出整个程序,面向对象设计往往从问题的一部分着手,一点一点地构建出整个程序。面向对象设计以数据为中心,以类作为表现数据的工具,类是划分程序的基本单位,而函数在面向对象设计中成为类的接口。
从理论上来说,对于设计阶段的输出,无论采用哪一种设计方法,都可以用任何一种程序设计语言来编码实现,但实际上对于具体的任务和设计风格,总可以在众多的编程语言中挑选出一种最适合的,使用它能够在程序运行效率、开发效率、软件可维护性等方面达到令人满意的效果。