|
|
程序设计即编码(coding),也就是为各个模块编写程序。这是系统实现阶段的核心工作。在系统开发的各个阶段中,编程是最容易的、也是人们已掌握得较好的一项工作。根据结构化方法设计了详细的方案,又有了高级语言,初级程序员都可以参加这一阶段的工作。当然,程序员的水平决定了程序的水平。
|
|
|
|
|
程序设计阶段是系统生命周期中详细设计之后的阶段。系统设计是程序设计工作的先导和前提条件。程序设计的任务是使用选定的语言设计程序,把系统设计阶段所得到的程序设计说明书中对信息处理过程的描述,转换成能在计算机系统运行的源程序。
|
|
|
程序设计又被称为编码,由程序设计人员承担,编码工作与系统分析设计阶段的工作相比,是相对比较容易的。
|
|
|
程序设计人员应当仔细阅读系统全部文档,以保证系统设计与系统实施的一致性;深刻理解、熟练掌握并正确运用程序设计语言和软件开发的环境和工具,保证功能的正确实现。
|
|
|
|
.程序的正确性。包括正确运用程序设计语言环境和满足系统设计的功能要求。
|
|
|
|
.较高的效率。程序应较少占用内存而具有较高的运行速度。
|
|
|
程序设计质量的几个方面常常是有矛盾的,因此应该结合具体情况,权衡处理。
|
|
|
|
|
|
|
|
|
|
对于什么是“好程序”,早期观点与现在有很大不同。早期计算机内存小、速度慢,人们往往把程序的长度和执行速度放在很重要的位置。费尽心机缩短程序长度、减少存储量、提高速度。现在情况有了很大的不同,一般认为好程序应具备下列特点。
|
|
|
|
|
|
|
|
|
正常工作是最基本的,一个根本不能够工作的程序当然谈不上“好”,谈执行速度、程序长度等指标也毫无意义;调试代价低,即花在调试上的时间少,这一条是衡量程序好坏,也是衡量程序员水平的一个重要标志;其他要求程序可读性强,易于理解。
|
|
|
在相当长的一个时期里,人们认为程序是用于给机器执行的而不是给人阅读的。因而程序员中就存在严重的低估编程方法、不注意程序风格的倾向,认为可以随意编写程序,只要结果正确就行了,读这种程序像读“天书”。可读性(readability)是后来提出的新概念,它主张程序应使人们易于阅读,编程的目标是编出逻辑上正确而又易于阅读的程序。程序可读性好,自然易于理解、易于维护,并将大大降低隐含错误的可能性,从而提高程序的可靠性。
|
|
|
要使程序的可读性好,程序员应有一定的写作能力。他应能写出结构良好、层次分明、思路清晰的文章。有人说:“对于程序员来说,最重要的不是学习程序设计语言等,而是英语(日语、汉语)”。程序员在写程序时应该记往:程序不仅是给计算机执行的,也是供人阅读的。
|
|
|
要使程序可读性好,总的要求是使程序简单、清晰。人们总结了使程序简单、清晰的种种技巧和方法,包括的内容如下。
|
|
|
|
|
|
|
|
程序设计语言是程序设计人员用以求解问题的工具,程序设计人员必须适应特定的程序设计语言的限制。程序设计语言的特性表现为其心理特性、技术特性及工程特性。
|
|
|
程序的实现最终要靠人来完成,因此人的因素对程序的实现质量有很大的影响。语言的心理特性,主要表现在编写程序时对人的影响,包括对程序代码的理解等。它在语言中表现为以下几个方面:
|
|
|
|
程序设计语言总是以一种确定的方式对源程序的语句进行解释,但程序员可能对其有不同的理解,形成歧义性。歧义影响程序的可读性,容易产生错误。
|
|
|
|
是指在用某种程序设计语言编写程序时,人脑必须记忆的关于程序的信息量,用来表示简洁性的属性有:该语言是否便于构造逻辑块及结构化程序,有多少种关键字及缩写;有多少数据类型及默认说明;有多少个算术运算符及逻辑运算符:有多少内部函数。简洁性影响程序的理解性、可读性。
|
|
|
|
人的记忆能力通常分为综合和顺序两类,综合是指把事物作为一个整体记忆及识别的能力,顺序能力是指预知序列中下一个元素的能力。
|
|
|
局部性是指程序设计语言的综合特性。当语句可以组合成程序块时,当结构化构造可以直接实现时,以及编写出的程序表现出高度的模块化及内聚时,局部性就比较显著。如果语言提供不连续的处理,就要降低局部性。顺序性是指一种心理特性,它会影响到软件的维护工作。当遇到逻辑操作的线性序列时,人们易于理解,而很多的分支或多个循环就违反了处理的顺序性。
|
|
|
|
|
从软件工程的观点来看,程序设计语言特性的表现形式包括如下内容。
|
|
|
(1)是否易于把设计转换为程序,从理论上说,根据系统设计说明去编写程序,其过程应该是明确的。把设计变成程序的难易程度实际上反映了程序设计语言与设计说明相接近的程度。如果该语言能直接实现结构化程序构造,能直接实现复杂的数据结构,能直接实现特殊的输入输出处理、位操作及字符串操作,就能很方便地把设计转换成源程序。
|
|
|
(2)编译效率,程序设计语言的编译器的性能决定了目标代码的运行效率,如果对软件性能要求较高,则配有优化编译器的程序设计语言是很有吸引力的。
|
|
|
(3)可移植性,可移植性是程序设计语言的一种特性,它的含义是,当源程序从一个处理器转换到另一个处理器,或者从一个编译器转换到另一个编译器时,源程序本身不需修改或仅需少量修改。
|
|
|
(4)是否有开发工具,使用开发工具,可以缩短编写源程序的时间,可以改进源程序的质量。这些工具可能包括排错编译器、源程序格式编排功能、内部编辑功能,用于源程序控制的工具,各种应用领域中的详尽的子程序库等。
|
|
|
(5)源程序的可维护性,设计文档是理解软件的基础,但还必须读懂源程序,才能根据设计的改动去修改源程序。是否易于从设计转变为源程序和语言本身的某些规定,是可维护性的两个主要因素。
|
|
|
语言的技术特性对系统开发的各个阶段都有一定的影响。确定系统需求后,要根据项目的特性选择相应特性的语言,有的要求提供复杂的数据结构,有的要求实时处理强,有的要求能方便地进行数据库的操作。特别是系统设计转化为程序代码时,转化的质量往往受语言性能的影响可能还会影响到设计方法。
|
|
|
为一个特定的设计课题选用程序设计语言时,必须从心理特性、工程特性及技术特性几个方面加以考虑。从所要解决的课题出发确定对语言的要求,并确定这些要求的相对重要性。既然一种语言不可能同时满足多个要求,那么就应该分别对各个要求进行衡量,比较各种可用语言的适用程度。
|
|
|
选择程序设计语言通常应考虑的因素有,项目的应用领域、系统开发的方法、算法及数据结构的复杂性、系统运行的环境、语言的性能、开发人员的知识及对语言的熟悉程度。
|
|
|
|
|
标识符是文件名、变量名、常量名、函数名、程序名、段名和程序标号等用户定义的名字的总称。应注意以下规则。
|
|
|
|
|
|
|
|
在每个程序或模块的开头的一段说明,起对程序理解的作用,一般包括以下内容:
|
|
|
|
|
.接口与截面描述,包括调用及被调用关系、调用形式、参数含义以及相互调用的程序名。
|
|
|
|
.开发历史,包括原作者、审查者、修改者、编程日期、编译日期、审查日期、修改日期等。
|
|
|
.与运行环境有关的信息,包括对硬件、软件资源的要求,程序存储与运行方式。
|
|
|
|
|
|
|
.解释性注释不是简单直译程序语句,应能说明“做什么”。
|
|
|
.一定要保证注释与程序的一致性,程序修改时注释也必须修改。
|
|
|
|
利用空格、空行和缩进等方式改善程序的布局,取得较好的视觉效果。
|
|
|
|
|
|
一般原则是:语旬简明、直观,直接反映程序设计意图,避免过分追求程序的技巧性,不能为追求效率而忽视程序的简明性、清晰性。应遵守如下规则。
|
|
|
|
|
|
|
.应采用空格、括号等符号使复杂表达式的运算次序清晰直观。
|
|
|
|
|
.针对用户的不同对象、特点和要求设计人机交互方式。
|
|
|
|
|
|
|
|
主要指计算机运行时间和存储空间两个方面,主要注意事项如下。
|
|
|
.编写程序前应尽量简化算术表达式和逻辑表达式,并尽量用逻辑表达式。
|
|
|
|
|
|
|
|
|
|
结构化程序设计被称为软件发展中的第一个里程碑,其影响比前两个里程碑(子程序、高级语言)更为深远。结构化程序设计的概念和方法、支持这些方法的一整套软件工具,构成了“结构化革命”。这是存储程序计算机问世以来,对计算机界影响最大的一个软件概念。对于什么是“结构化程序设计”,至今还没有被普遍接受的定义。通常认为结构化程序设计包括以下4方面的内容。
|
|
|
|
从理论上讲,只用顺序结构、选择结构、循环结构这三种基本结构就能表达任何一个只有一个入口和一个出口的程序逻辑。为实际使用方便,往往允许增加多分支结构、REPEAT型循环等两三种结构。程序中可以完全不用GOTO语句。这种程序易于阅读、易于验证。但在某些情况下,例如从循环体中跳出,使用GOTO语句描述更为直截了当。
|
|
|
因此,一些程序设计语言还是提供了GOTO语句。无限制地使用GOTO语句,将使程序结构杂乱无章、难以阅读、难以理解,其中容易隐含一些错误。
|
|
|
|
在一个程序模块内,先从该模块功能描述出发,一层层地逐步细化,直到最后分解、细化成语句为止。
|
|
|
|
这是把逐步求精的方法由程序模块内的设计推广到一个系统的设计与实现。这正是本书介绍的结构化方法的来源。
|
|
|
|
这是程序人员的组织形式。一个主程序员组的固定成员是主程序员一人,辅助程序员一人,程序资料员(或秘书)一人。其他技术人员按需要随时加入组内。主程序员负责整体项目的开发,并负责关键部分的设计、编码和调试。辅助程序员在细节上给主程序员以充分的支持。主程序员、辅助程序员必须在程序技术方面和项目管理方面具有经验和才能,必须完全熟悉该项目的开发工作。这种组织方式的好处在于显著减少了各子系统之间、各程序模块之间通信和接口方面的问题。把设计的责任集中在少数人身上,有利于提高质量。
|
|
|
作为这种组织形式中的一个程序员,不仅应具备程序设计的基本知识,还要对项目所在的领域有较深入的了解、熟悉开发的技术环境,因而能承担一定的程序编写工作,更为重要的是必须有高度的组织纪律性和团队精神,使自己的工作融入整个系统,与组内其他成员协调一致地工作。为此,必须严格遵守以下几项规则。
|
|
|
|
.按总体设计的要求传递参数,不随意修改其内容与含义。
|
|
|
|
|
|
|
|
传统的过程式程序设计随着软件危机和应用系统的不断膨胀越来越显得力不从心,随着20世纪70年代Smalltalk及Modula-2等面向对象的编程语言(Object Oriented Programming Language, OOPL)的出现,以及C++的发展成熟,面向对象程序设计(Object Oriented Programming, OOP)思想得到了广泛的认同和普及。至20世纪90年代,各种程序语言或工具都融入了这一思想,其优越性是有目共睹的,它已成为这一时代软件产业的主体技术。
|
|
|
在OOP方法中,一个对象即是一个独立存在的实体,对象有各自的属性和行为,彼此以消息进行通信,对象的属性只能通过自己的行为来改变,实现了数据封装,这便是对象的封装性。而相关对象在进行合并分类后,有可能出现共享某些性质,通过抽象后使多种相关对象表现为一定的组织层次,底层次的对象继承其高层次对象的特性,这便是对象的继承性。另外,对象的某一种操作在不同的条件环境下可以实现不同的处理、产生不同的结果:这就是对象的多态性。现有的OOPL中都不同程度地实现了对象的以上三个性质。
|
|
|
|
一般以类(class)来创建一个对象,类表现为一种数据结构。对外提供的界面包括一组数据以及操作这些数据的方法(函数或过程),而隐藏了内部实现的细节,对象操作者只需要了解该对象的界面即可。这样大大增强了模块化程度,很好地实现了软件重用和信息隐藏。
|
|
|
为了更好地保持安全性和独立性,类有部分数据可以被定义为私有教据,其他类的对象或过程不能直接访问私有数据,而一般情况下利用消息机制向对象发送消息,对象所有类就需要定义对应的消息响应函数,主动接受消息并做处理,这也是OOPL的一大特点。
|
|
|
|
类通过继承被定义成不同的层次结构,将相关类的特点抽象出来作为父类,子类继承父类的结构和方法后,再定义各自特定的数据和操作,或者还可以通过重载将父类的某些特殊操作进行重新定义。继承一个单一的父类时叫单继承,如果有两个或两个以上的父类则是多继承。这样做的目的不仅体现了软件重用技术,同时又可最大限度地精简程序、减少冗余代码,极大地提高了程序开发和运行效率。
|
|
|
|
类的某些操作允许同一名称具有多种语义。OOPL的这些特点使程序员进行面向对象程序设计时与进行过程式的程序设计有很大的不同,体现在以下这些方面。
|
|
|
.设计程序不采用顺序性的结构,而是采用对象本身的属性与方法来解决问题。
|
|
|
.在解决问题的过程中,可以直接在对象中设计事件处理程序(接受事件消息),而不用调用子过程严格地按顺序执行,很方便地让用户实现自由无顺序的操作。
|
|
|
.数据与程序不是分离的,数据是特定对象的数据,也只有对象的函数或过程才能对数据进行处理,一个对象中的函数或过程共享对象的数据,解决了因调用子过程出现大量数据传递的情况(如函数返回值和较多参数)。
|
|
|
.不用设计公用程序模块,因特定方法下的公用模块很难再被扩展为更复杂的处理方式,只需设计类就可以实现重用,而且类库中提供大量基类,掌握它们后可以加快开发过程,开发小组还可以按自己设想的基类放入类库共享。
|
|
|
.OOPL非常适合于Windows环境下的程序开发,可以充分利用Windows的各种资源来构造应用程序,这也就需要程序员比较熟悉Windows。
|
|
|
|
虽然OOPL提高了程序的可靠性、可重用性、可扩充性和可维护性,但应用软件为了适应Windows界面环境,使用户界面的开发越来越复杂,有关这部分的代码所占比例也越来越大,因此,微软公司推出Visual Basic以后,可视化编程技术得到了极大的欢迎,编程人员不再受Windows编程的困扰,能够所见即所得地设计标准的Windows界面。
|
|
|
可视化编程技术的主要思想是用图形工具和可重用部件来交互地编制程序。它把现有的或新建的模块代码封装于标准接口封包中,作为可视化编程编辑工具中的一个对象,用图符来表示和控制。可视化编程技术中的封包可能由某种语言的一个语句、功能模块或数据库程序组成,由此获得的是高度的平台独立性和可移植性。在可视化编程环境中,用户还可以自己构造可视控制部件,或引用其他环境构造的符合封包接口规范的可视控制部件。增加了编程的效率和灵活性。
|
|
|
可视化编程一般基于事件驱动的原理。用户界面中包含各种类型的可视控制部件,如按钮、列表框和滚动条等,每个可视控制部件对应多个事件和事件驱动程序。发生于可视控制部件上的事件触发对应的事件驱动程序,以完成各种操作。编程人员只要在可视化编程工具的帮助下,利用鼠标或表单建立、复制、缩放、移动或清除各种已提供的控件,然后使用该可视化编程工具提供的语言编写每个控件对应的事件程序,最后可以用解释方式运行来测试程序。这样,通过一系列的交互设计就能很快地完成一个应用项目的编程。
|
|
|
另外,一般可视化编程工具还有应用专家或应用向导提供模板,按照步骤对使用者进行交互式指导,让用户定制自己的应用,然后就可以生成应用程序的框架代码,用户再在适当的地方添加或修改以适应自己的需求。
|
|
|
面向对象编程技术和可视化编程开发环境的结合,改变了应用软件只有经过专门技术训练的专业编程人员才能开发的状况。它使软件开发变得容易,从而扩大了软件开发队伍。由于大量软件模块的重用和可视控件的引入,技术人员在掌握这些技术之后,就能有效地提高应用软件的开发效率、缩短开发周期、降低开发成本,并且使应用软件界面风格统一,有很好的易用性。
|
|
|