软件实现

在本章中,我们将研究编程方法、文档和软件实现中的挑战。

结构化编程

在编码过程中,代码行不断增加,因此软件的大小也随之增加。渐渐地,几乎不可能记住程序的流程。如果忘记了软件及其底层程序、文件、过程的构造方式,那么共享、调试和修改程序就会变得非常困难。解决这个问题的方法是结构化编程。它鼓励开发人员使用子例程和循环,而不是在代码中使用简单的跳转,从而使代码更加清晰,提高效率。结构化编程还可以帮助程序员减少编码时间并正确组织代码。

结构化编程说明了程序的编码方式。结构化编程使用三个主要概念:

  • 自上而下的分析 - 软件总是用来执行一些合理的工作。这种理性的工作在软件术语中被称为问题。因此,了解如何解决问题非常重要。在自上而下的分析下,问题被分解成小块,每个小块都具有一定的重要性。每个问题都单独解决,并清楚地说明了如何解决问题的步骤。

  • 模块化编程 - 在编程时,代码被分解成更小的指令组。这些组称为模块、子程序或子例程。模块化编程基于对自上而下分析的理解。它不鼓励在程序中使用"goto"语句进行跳转,这通常会使程序流程不可跟踪。在结构化编程中,禁止跳转并鼓励使用模块化格式。

  • 结构化编码 - 参考自上而下的分析,结构化编码按执行顺序将模块细分为更小的代码单元。结构化编程使用控制结构来控制程序的流程,而结构化编码使用控制结构以可定义的模式组织其指令。

函数式编程

函数式编程是一种编程语言风格,它使用数学函数的概念。数学中的函数在接收相同的参数时应始终产生相同的结果。在过程语言中,程序的流程贯穿整个过程,即程序的控制权被转移到被调用的过程。当控制流从一个过程转移到另一个过程时,程序会改变其状态。

在过程式编程中,当使用相同的参数调用过程时,过程可能会产生不同的结果,因为程序本身在调用它时可能处于不同的状态。这是过程式编程的一个特性,也是它的一个缺点,其中过程执行的顺序或时间变得很重要。

函数式编程提供数学函数作为计算手段,无论程序状态如何都会产生结果。这使得预测程序的行为成为可能。

函数式编程使用以下概念:

  • 一等函数和高阶函数 - 这些函数能够接受另一个函数作为参数,或者返回其他函数作为结果。

  • 纯函数 - 这些函数不包含破坏性更新,即它们不会影响任何 I/O 或内存,如果它们未被使用,可以轻松删除,而不会妨碍程序的其余部分。

  • 递归 - 递归是一种编程技术,其中函数调用自身并重复其中的程序代码,除非某些预定义条件匹配。递归是在函数式编程中创建循环的方式。

  • 严格求值 - 这是一种求值传递给函数作为参数的表达式的方法。函数式编程有两种求值方法:严格(急切)或非严格(懒惰)。严格求值总是在调用函数之前求值表达式。非严格求值除非需要,否则不会求值表达式。

  • λ-演算 - 大多数函数式编程语言使用 λ-演算作为其类型系统。λ-表达式通过在其出现时求值来执行。

Common Lisp、Scala、Haskell、Erlang 和 F# 是一些函数式编程语言的例子。

编程风格

编程风格是一组所有程序员在编写代码时遵循的编码规则。当多个程序员在同一个软件项目上工作时,他们经常需要使用其他开发人员编写的程序代码。如果所有开发人员不遵循某种标准编程风格来编写程序,这将变得乏味,有时甚至不可能。

适当的编程风格包括使用与预期任务相关的函数和变量名称、使用适当的缩进、注释代码以方便读者以及整体呈现​​代码。这使得程序代码易于阅读和理解,从而使调试和错误解决更加容易。此外,适当的编码风格有助于简化文档和更新。

编码指南

编码风格的实践因组织、操作系统和编码语言本身而异。

以下编码元素可根据组织的编码指南进行定义:

  • 命名约定 - 本节定义如何命名函数、变量、常量和全局变量。

  • 缩进 - 这是行首留下的空间,通常是 2-8 个空格或单个制表符。

  • 空格 - 通常在行末省略。

  • 运算符 - 定义编写数学、赋值和逻辑运算符的规则。例如,赋值运算符"="前后应有空格,如"x = 2"。

  • 控制结构 - 单独和嵌套编写 if-then-else、case-switch、while-until 和 for 控制流语句的规则。

  • 行长和换行 - 定义一行中应有多少个字符,通常一行为 80 个字符。换行定义行太长时应如何换行。

  • 函数 - 定义应如何声明和调用函数,带参数和不带参数。

  • 变量 - 提到如何声明和定义不同数据类型的变量。

  • 注释 - 这是重要的编码组件之一,因为代码中包含的注释描述了代码的实际作用以及所有其他相关描述。此部分还有助于为其他开发人员创建帮助文档。

软件文档

软件文档是软件流程的重要组成部分。一份写得好的文档提供了了解软件流程所需的重要工具和信息存储库。软件文档还提供了有关如何使用产品的信息。

一份维护良好的文档应包含以下文档:

  • 需求文档 - 该文档是软件设计人员、开发人员和测试团队执行各自任务的关键工具。该文档包含预期软件的所有功能、非功能和行为描述。

    该文档的来源可以是先前存储的有关软件的数据、客户端已运行的软件、客户访谈、问卷调查和研究。通常,它以电子表格或文字处理文档的形式存储在高端软件管理团队中。

    该文档是要开发的软件的基础,主要用于验证和确认阶段。大多数测试用例都是直接从需求文档构建的。

  • 软件设计文档 - 这些文档包含构建软件所需的所有必要信息。它包含:(a)高级软件架构,(b)软件设计细节,(c)数据流图,(d)数据库设计

    这些文档作为开发人员实现软件的存储库。虽然这些文档没有提供有关如何编写程序的任何详细信息,但它们提供了编码和实现所需的所有必要信息。

  • 技术文档 - 这些文档由开发人员和实际编码员维护。这些文档作为一个整体,代表了有关代码的信息。在编写代码时,程序员还会提到代码的目的、编写者、需要它的地方、它的作用和工作原理、代码使用的其他资源等。

    技术文档增加了处理相同代码的不同程序员之间的理解。它增强了代码的重用能力。它使调试变得简单且可追溯。

    有各种自动化工具可用,有些是编程语言本身附带的。例如,java 附带 JavaDoc 工具来生成代码的技术文档。

  • 用户文档 - 此文档与上面解释的所有文档都不同。所有以前的文档都是为了提供有关软件及其开发过程的信息而维护的。但是用户文档解释了软件产品应该如何工作以及如何使用它来获得所需的结果。

    这些文档可能包括软件安装程序、操作指南、用户指南、卸载方法和特殊参考,以获取更多信息,如许可证更新等。

软件实施挑战

开发团队在实施软件时面临一些挑战。其中一些如下所述:

  • 代码重用 - 当今语言的编程接口非常复杂,并配备了大量库函数。尽管如此,为了降低最终产品的成本,组织管理层更愿意重新使用之前为其他软件创建的代码。程序员在兼容性检查和决定重复使用多少代码方面面临巨大问题。

  • 版本管理 - 每次向客户发布新软件时,开发人员都必须维护版本和配置相关文档。此文档需要高度准确并按时提供。

  • 目标主机 - 组织正在开发的软件程序需要针对客户端的主机进行设计。但有时,设计一个在目标机器上运行的软件是不可能的。