软件工程技术--第六章 软件实现

第六章 软件实现

本章要点

  1. 理解编码的目的与要求;
  2. 了解程序设计语言的发展与分类;
  3. 了解常见的程序设计语言;
  4. 了解程序设计语言的选择原则;
  5. 掌握良好的编码风格;
  6. 理解结构化程序设计方法;
  • 编码的目的与要求
    • 编码(coding)俗称编程序,其目的是使用选定的程序设计语言,把设计模型“翻译”为用该语言书写的源程序(或称源代码)。源程序经过编译等环节,再“转换”为可执行代码。
    • 设计是编码的前导。
    • 程序的质量首先取决于设计的质量,但程序设计语言和编码风格也将对程序的可读性、可靠性、可测试性和可维护性产生重要影响。

6.1结构化程序设计

  • 所谓结构化程序设计,一种较为流行的定义是:“如果一个程序的代码块仅仅通过顺序、选择和循环这三种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的”。
  • 结构化程序设计通常采用自顶向下、逐步求精的设计方法,这种方法符合抽象和分解的原则,是人们解决复杂问题常用的方法。采用这种先整体后局部、先抽象后具体的步骤开发的软件一般都具有较清晰的层次结构。结构化程序设计方法能提高程序的可读性、可维护性和可验证性,从而提高软件的生产率。

结构化程序设计的原则

  1. 尽量使用语言提供的基本控制结构,即顺序、选择和循环结构
  2. 选用的控制结构只准许有一个入口和一个出口
  3. 将程序语句组织成容易识别的块,每块只有一个入口和一个出口。
  4. 复杂结构应该用基本控制结构进行组合或嵌套来实现。
  5. 对于语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中前后一致。
  6. 严格控制goto语句,仅在两种情况下才可使用。一是用非结构化的程序设计语言去实现一个结构化的构造时;二是在某种可以改善而不是损害程序可读性的情况下。

自顶向下,逐步求精

  • 在总体设计阶段,已经采用自顶向下、逐步细化的方法把一个复杂问题的解法分解和细化成了一个由许多模块组成的层次结构的软件系统。在详细设计和编码阶段,还应当采取这种方法,把一个模块的功能逐步分解、细化为一系列具体的步骤,进而编制出用某种程序设计语言书写的程序。
  • 程序设计是一个由粗到细的 “渐进” 的过程
  • 程序设计不仅包括对控制结构的设计,也包括对数据结构的设计。 二者都要一步一步地细化。
  • 自顶向下、逐步求精方法的优点如下:
    1. 符合人们解决复杂问题的普遍规律,可提高软件开发的成功率和生产效率。
    2. 用先全局后局部、先整体后细节、先抽象后具体的逐步求精过程开发出来的程序具有清晰的层次结构,程序易读、易理解。

6.2程序设计语言

程序设计语言的发展与分类

自20世纪60年代以来,世界上公布的程序设计语言已经有上千种之多,但是只有很小一部分得到了广泛的应用。按照软件工程的观点,语言的发展至今已经历了四代、三个阶段

  1. 第一代语言(机器语言)

​ 自从有了计算机,就有了机器语言。机器语言由机器指令代码二进制0、1构成,不同CPU的计算机有不同的机器语言。用机器语言编写的程序占用内存少,执行效率高,其缺点是难编写、难修改、难于维护和移植,编程效率低。目前,这种语言已经被淘汰。

  1. 第二代语言(汇编语言)

汇编语言用助记符来代替机器语言中的二进制代码,比机器语言直观,容易理解。在执行时必须由特定的翻译程序转化为机器语言才能由计算机执行。与机器语言一样,汇编语言依赖于计算机硬件结构,也是面向机器的低级语言。其优点是易于实现系统接口,执行效率高。

  1. 第三代语言(高级语言)

高级语言是面向用户的、基本上独立于计算机种类和结构的语言。从语句结构上看,它比较接近人类的自然语言,所使用的运算符和运算表达式也与数学中的形式相似,因此也称算法语言。和机器语言和汇编语言相比,高级语言不依赖于计算机硬件结构,易学易用、通用性强、应用广泛。

  • 高级语言种类繁多,又可分为传统的基础语言、结构化语言和专用语言三类。
    • 基础语言:BASIC、FORTRAN、COBOL等
    • 结构化语言:ALGOL、C等
    • 专用语言:C++、Java
  1. 第四代语言(简称4GL)
    • 4GL是非过程化语言,它是面向应用的语言。其主要特征有:
      • 有可视化的、友好的用户界面。操作简单,使非计算机专业人员也能方便地使用它。
      • 兼有过程性和非过程性双重特性。非过程性语言只需要告诉计算机“做什么”,而不必描述“怎么做”,“怎么做”由计算机语言来实现。
      • 有高效的程序代码。能缩短开发周期,并减少维护的代价。
      • 有完备的数据库管理功能。
      • 有应用程序生成器。提供一些常用的程序来完成文件的维护、屏幕管理、报表生成和查询等任务,从而有效地提高了软件生产率。
    • 例如:SQL语言

常用程序设计语言:

  • Visual Basic语言
  • C语言
  • C++语言
  • Java语言
  • Delphi语言
  • C#语言

程序设计语言的选择

  • D.A.Fisher说过:“设计语言不是引起软件问题的原因,也不能用它来解决软件问题。但是,由于语言在一切软件活动中所处的中心地位,它们能使现存的问题变得较易解决,或者更加严重。”这段话言简意赅地揭示了语言在软件开发中的作用,因此,我们要重视在编码之前选好适当的语言。语言选择合适,会使编码困难减少,程序测试量减少,并且可以得到易读、易维护的软件。
  • 在选择语言时要从问题入手,确定它的要求是什么,以及这些要求的相对重要性。由于一种语言不可能同时满足它的各种需求,所以要对各种要求进行权衡,比较各种可用语言的使用程度,最后选择较适合的语言。
  • 一般情况下,程序设计语言的选择常从以下几方面考虑。
    • 项目的应用领域。
    • 用户的要求。
    • 软件开发工具。
    • 算法和数据结构的复杂性。
    • 软件开发人员的知识。
    • 系统的可移植性要求。
科学工程计算 FORTRAN、Pascal、C语言
数据处理与应用 COBOL、SQL、4GL
实时处理和系统 汇编语言和Ada语言
系统软件 汇编语言、C语言、Ada语言
人工智能 Prolog、lisp语言
面向对象的语言 C++、JAVA
可视化 Visual Basic、Visual C++、Visual Foxpro、Delphi

6.3程序设计风格

  • 程序设计风格是指一个人编制程序时所表现出来的特点、习惯、逻辑思路等。
  • 良好编码风格包括:
    • 程序内部应该有很好的文档:如标识符、注释良好,程序文档结构易读易理解。
    • 数据说明应易于理解和维护
    • 语句结构尽可能简单直观
    • 输入输出风格遵守人机界面设计准则
    • 效率满足用户需求即可

1、源程序文档化

  • 为了提高程序的可维护性,源程序(也称源代码)也需要实现“文档化”。即在源程序中包含一些内部文档,以帮助阅读和理解。

  • 源程序文档化主要包括:标识符命名、内部注释以及程序的视觉组织三个方面。

    • 标识符的命名

      标识符包括模块名、变量名、常量名、标号名、子程序(函数)名以及数据区名、缓冲区名等。

    • 程序代码的视觉组织

      在程序编写中应该注意代码的排版布局,以使代码更加清晰易读。可以在程序中利用空格、空行、缩进等技巧提高程序代码的视觉效果。

    • 程序的注释

      • 注释有助于理解代码,是程序员之间进行交流的有效途径,合理的注释有利于日后的软件维护。注释可分为序言性注释和功能性注释两大类。
      • 序言性注释通常置于每个程序或模块的开头部分,它是对程序或模块的整体说明。主要内容有:版权信息、文件名称、标识符、摘要、当前版本号、作者/修改者、完成日期、版本历史信息等。
      • 功能性注释通常嵌在程序体内,主要描述程序段的功能。

2、数据说明

  • 为了使程序中的数据说明更易于理解和维护,必须注意以下几点:
    • 显式地说明一切变量。
    • 数据说明的次序应该规范化,比如哪种数据类型的说明在前,哪种在后,以便于查找。
    • 当多个变量用一条语句说明时,应当对这些变量按字母顺序排列。例如,将int length,width,area,cost,price;写成:int area,cost,length,price,width;
    • 使用注释说明复杂数据结构。

3、语句构造

  • 语句构造要简单直接,清晰易读。以下是一些常用的规则:
    1. 要简单清楚,直截了当地说明程序员的用意
    2. 不要为了节省空间而在==同一行中写多个语句。
    3. 使用括号使逻辑表达式和算术表达式的运算次序直观清晰。
    4. 利用添加空格来清晰地表示语句的成分。
    5. 尽可能使用库函数,应使用函数或公共过程去代替具有独立功能的程序段。
    6. 尽量不用或少用goto语句,避免goto语句不必要的转移和相互交叉。
    7. 尽量不用或少用标准文本以外的语句,以利于提高可移植性。
    8. 对于多分支语句,应尽量把出现可能性大的分支放在前面,以节省运算时间。
    9. 每个循环要有终止条件,不要出现死循环,更要避免出现不可能被执行的循环。
    10. 避免使用过于复杂的条件判定。
    11. 避免使用测试条件“非”。如要使用if(ch>=′0′)取代if(!(ch<′0′))。
    12. 避免过多的循环嵌套和条件嵌套,嵌套深度不要超过三层
    13. 避免使用临时变量而使可读性下降
    14. 避免使用空的else语句和if…thenif …语句。
    15. 避免使用else goto和else return结构。
    16. 使与判定相联系的动作尽可能地紧跟着判定。
    17. 用逻辑表达式代替分支嵌套
    18. 对递归定义的数据结构尽量使用递归过程。
    19. 确保所有变量在使用前都进行初始化。
    20. 不要修补不好的程序,要重新编写。也不要一味追求代码的复用,要重新组织。
    21. 不要进行浮点数相等的比较,因为两个浮点数难于精确相等。

4、输入与输出

  • 设计输入/输出界面的原则是友好、简洁、统一,符合用户的日常工作习惯。在编写输入和输出程序时要考虑以下原则:
    1. 检验输入数据的合法性、有效性。
    2. 批量输入数据时,使用数据输入结束标志,而不是要求用户预先输入数据个数。
    3. 检查输入项的重要组合的合理性。
    4. 输入格式要简单,输入格式要一致
    5. 提示输入的请求==,并简要地说明可用的选择或边界值。
    6. 输入数据时应允许默认值
    7. 输出信息中不要有文字错误,要保证输出结果的正确性。
    8. 输出数据表格化、图形化
    9. 给所有的输出数据加标志

5、程序效率

  • 程序的效率是指程序的执行速度及程序所需占用内存的存储空间。提高效率的原则如下:
    1. 效率是一个性能要求,应当在需求分析阶段确定效率方面的要求。
    2. 效率是靠好的设计来提高的。
    3. 程序的效率与程序的简单性相关。
    4. 除非对效率有特殊要求,否则程序编写的原则是“清晰第一、效率第二”。不要为了追求效率而丧失了清晰性。

6.4程序设计质量评价

  • 程序设计的质量评价需要考虑多方面因素:正确性、清晰的结构、易使用性、易维护性、简单性、易移植性

你可能感兴趣的:(软件工程技术,软件工程)