1.1.1 软件工程方法
软件开发是以程序设计为基础的。在程序设计中,完美的设计方法、绝对可靠正确的程序是不存在的,只是相对而言的。于是,为提高程序效率和程序的正确性,产生了多种不同的但很有效的设计方法。例如,自顶向下、自底向上、结构化、面向数据结构、面向对象的程序设计等,并且不同的设计方法都有对应的分析方法和工具,这些不同的设计方法都有各自的特点,而且往往在同一个软件的设计中会结合多种方法。
各种不同的程序设计方法是软件发展的不同阶段的产物,其中使用最为广泛的主流设计方法是结构化与面向对象程序设计方法。
1.结构化程序设计方法
结构化程序设计是20 世纪70~80 年代的主流设计方法,适合软件规模不是非常庞大的数据处理系统。结构化程序设计实际上是面向过程的程序设计,其主要思想是“功能分解、自顶向下、逐步求精、模块化”,缺点主要是可重用性、可维护性差。
其中,“自顶向下、逐步求精”的技术思想指的是通过对问题进行分析,把一个大问题划分成若干个相对简单的小问题,每个小问题对应一个子功能模块,实现功能上的分解;然后对各个子功能模块进行结构化程序设计,即每个模块都是符合单入口单出口、只用3 种基本的控制结构(即顺序结构、选择结构、循环结构)的程序。
结构化程序设计的工具主要有流程图、功能模块结构图等。
流程图用于表示程序的控制结构和执行时的“流程”,是结构化程序设计普遍使用的抽象工具之一。流程图用类似英语的抽象语言对程序的执行过程进行描述,然后程序员用指定的程序设计语言根据流程图进行编程。
结构化程序设计的“模块化”特点是指系统经过分解以后可以用若干“功能模块”具体实现各功能。各个模块可以分配给不同的人编制,由多人合作完成复杂的软件工程。结构化编程中需要编程人员熟练使用三种基本结构(顺序、选择和循环),能对系统进行功能模块分析,画出功能模块图和流程图,流程图正确、清晰,编程时要注意代码简练、可用、功能全面。
流程图中常用的符号如图1-1所示。
图1-1 流程图常用符号
开始与结束标志。椭圆形符号,用来表示一个过程的开始或结束。“开始”或“结束”写在符号内。
活动标志。矩形符号,用来表示过程中的一个单独的操作步骤。活动的简要说明写在矩形内。
判定标志。菱形符号,用来表示过程中的一项判定或一个分岔点,判定或分岔的说明写在菱形内。
输入、输出数据标志。用平行四边形表示。
流线标志。用来表示步骤在顺序中的进展。流线的箭头表示一个过程的流程方向。
结构化程序设计语言很多,如C语言、Pascal、BASIC、Fortran等。
2.面向对象程序设计方法
结构化的设计思想注重自顶向下、逐层地把一个复杂的问题分解成若干比较简单的子问题,直到最后的程序实现。这就意味着软件设计者必须对原来提出的问题有全面而又充分的认识和理解,才能进行合理有效的分解。当一个问题更加庞大、更复杂,而非一时一地即能理解清楚时,结构化的设计思想就不够用了。通常人们对复杂而又庞大的事物的认识和理解是从某个局部或某个具体对象开始的,通过逐步地扩充、反复、抽象和提升,最终达到对整个事物的认识和理解,这就是面向对象的设计思想。
面向对象方法是以软件问题域中的对象为依据来构建软件系统开发模型。在面向对象的软件设计开发过程中,具体到每一个对象的处理,则仍然可以采用结构化的思想、方法和技术从微观上解决具体对象的具体操作。面向对象程序设计是从结构化程序设计发展而来的,不排斥结构化的、自顶向下、逐步求精的技术思想,而是采纳并包含了结构化程序设计所有的合理部分。结构化程序设计是面向对象程序设计的基础。
面向对象程序设计方法现在被人们所接受认可并得到广泛的应用。从技术上看,面向对象方法提供的继承性、委托机制、多态性及类属等机制,使其以类为封装的单位,达到了类级代码的复用。而软件复用是降低软件成本、提高软件生产率和软件质量的有效途径。在人们提出的诸多面向对象方法中,由Booch和Rumbaugh等提出的面向对象的方法成为主流方法,并被集合统称为统一建模语言(Unified Modeling Language,UML)。面向对象分析方法的核心思想是利用面向对象的概念和方法为软件需求构造一组相关模型(对象模型、动态模型和功能模型),来获得关于问题域的全面认识。
尽管面向对象方法有很多优点,但这并不意味着所有的一切都看做对象,更不是说这种方式对于所有的问题是适用的。它一般更适合于复杂的多界面多任务系统,但不适合下面的情况:参数和结果有联系,可以用数学函数来解决的问题等。
面向对象程序设计语言很多,如C++、Visual Basic、Java、Smalltalk、Ada、Object Pascal等。其中,C++语言使用非常广泛,它在C语言的基础上进行增强并引入了面向对象的机制,C++已经成为系统软件和应用软件设计者都乐意选用的程序设计语言;Visual Basic以BASIC语言为基础,容易学习和掌握,其可视化的优点为应用程序的界面设计提供了更迅速、便捷的途径。