软件工程 实施
在本章中,我们将研究软件视线中的编程方法、文档和挑战。
结构化编程
在编码过程中,代码行数不断增加,从而使软件的体积增大。渐渐地,几乎不可能记住程序的流程。如果忘记了软件及其底层程序、文件、程序是如何构建的,那么共享、调试和修改程序就会变得非常困难。对此的解决方案是结构化编程。它鼓励开发人员在代码中使用子例程和循环,而不是使用简单的跳转,从而使代码更加清晰并提高其效率。结构化编程还有助于程序员减少编码时间并正确组织代码。
结构化程序设计告诉程序如何编码。结构化程序设计采用三个主要概念:
- 自顶向下分析:软件总是被用来执行一些合理的工作。这种合理的工作在软件术语中被称为问题。因此,了解如何解决问题非常重要。在自顶向下的分析中,问题都被分解为小块,每个小块都有一定的意义。每个问题都单独解决,并明确说明了如何解决问题的步骤。
- 模块化编程:在编程时,代码被分解成更小的指令组。这些组被称为模块、子程序或子例程。基于对自顶向下分析的理解的模块化编程。它不鼓励在程序中使用
goto
语句进行跳转,这通常会使程序流程不可追踪。在结构化编程中禁止跳转并鼓励模块化格式。 - 结构化编码:参考自顶向下分析,结构化编码将模块按执行顺序细分为更小的代码单元。结构化编程使用控制结构来控制程序流程,而结构化编码使用控制结构以可定义的模式组织其指令。
函数式编程
函数式编程是编程语言的一种风格,它使用数学函数的概念。数学中的函数在接收相同的参数时应该总是产生相同的结果。在编程语言中,程序的流程贯穿整个程序,即程序的控制权转移到被调用的程序中。当控制流从一个程序转移到另一个程序时,那么程序改变了它的状态。
在程序编程中,当使用相同的参数调用一个过程时,它可能会产生不同的结果,因为程序本身在调用它时可能处于不同的状态。这是程序编程的一个属性也是一个缺点,其中程序执行的顺序或时间变得很重要。
函数式编程提供了作为数学函数的计算手段,无论程序状态如何,都会产生结果。这使得预测程序的行为成为可能。
函数式编程使用以下概念:
- 初阶和高阶函数 - 这些函数有能力接受另一个函数作为参数,或者它们返回其他函数作为结果。
- 纯函数 - 这些函数不包括破坏性更新,也就是说,它们不影响任何 I/O 或内存,如果不使用它们,可以轻松删除它们,而不会妨碍程序的其余部分。
- 递归 - 递归是一种编程技术,其中函数调用自身并重复其中的程序代码,除非某些预定义的条件匹配。递归是在函数式编程中创建循环的方式。
- 严格评估 - 它是一种评估作为参数传递给函数的表达式的方法。函数式编程有两种类型的评估方法,严格(eager)和非严格(lazy)。严格评估总是在调用函数之前评估表达式。除非需要,否则费严格评估不会评估表达。
- λ-演算 - 大多数函数式编程语言使用 λ 演算作为它们的类型系统。 λ 表达式通过在它们出现时对其进行评估来执行。
Common Lisp、Scala、Haskell、Erlang 和 F# 是函数式编程语言的一些示例。
编程风格
编程风格是所有程序员编写代码所遵循的一套编码规则。当多个程序员在同一个软件项目上工作时,他们经常需要使用其他开发人员编写的程序代码。如果所有开发人员不遵循某种标准的编程风格来编写程序,这将变得乏味或有些困难。
适当的编程风格包括使用与预期任务相关的函数和变量名称、使用适当的缩进、注释代码以方便读者以及代码的整体呈现。这使得程序代码可读和易于理解,从而使调试和错误解决更容易。此外,适当的编码风格有助于简化文档和更新。
编码规则
编码风格的实践因组织、操作系统和编码本身的语言而异。
组织的编码规则可以定义以下编码元素:
- 命名约定 - 定义如何命名函数、变量、常量和全局变量。
- 缩进 - 行首留下的空间,通常是 2-8 个空格或单个制表符。
- 空白 - 通常在行尾省略。
- 运算符 - 定义编写数学、赋值和逻辑运算符的规则。例如,赋值运算符
=
前后应该有空格,如x = 2
。 - 控制结构 - 单独以嵌套方式编写
if-else
、case-switch
、while-util
和控制流语句的规则。 - 字符长度和换行 - 定义一行中应该有多少个字符,大多数情况下一行是 80 个字符长。换行定义了一条线如果太长的话,应该如何换行。
- 函数 - 定义函数应该如何声明和调用,带参数和不带参数。
- 变量 - 这提到了如何声明和定义不同数据类型的变量。
- 注释 - 这是重要的编码组件之一,因为代码中包含的注释描述了代码的实际作用以及所有其他相关的描述。这部分还有助于其他开发人员创建帮助文档。
软件文档
软件文档是软件过程的一个重要组成部分。一份写得很好的文档提供了一个很好的工具和方法,它是了解软件过程所必需的信息存储库。软件文档还提供有关如何使用该产品的信息。
维护良好的文件应包括下列文档:
- 需求文档 - 本文档是软件设计人员。开发人员和测试团队执行各自任务的关键工具。本文档包含预期软件的所有功能、非功能和行为描述。
该文档的来源可以是之前存储的有关软件的数据、已经在客户端运行的软件、客户的访谈、问卷和研究。一般以电子表格或文字处理文档的形式存储在高端软件管理团队中。
该文档是要开发的软件的基础,主要用于验证和验证阶段。大多数测试用例是直接从需求文档构建的。 - 软件设计文档 - 这些文档包含构建软件所需的所有必要信息。它包括:
- 高级软件架构
- 软件的设计细节
- 数据流图
- 数据库设计
这些文档作为开发人员实施软件的存储库。尽管这些文档没有提供有关如何编码程序的任何详细信息,但它们提供了编码和实施所需的所有必要信息。
- 技术文件 - 这些文档由开发人员和实际编码人员维护。这些文档作为一个整体代表了有关代码的信息。在编码代码时,程序员还会提到代码的目标、谁编写的、在哪里需要它、它做什么以及它是如何做的、代码使用了哪些其他资源等。
技术文档增加了处理相同代码的不同程序员之间的立节。它增强了代码的重用能力。它使调试变得容易和可追溯。
有各种可用的自动化工具,其中一些带有编程语言本身。例如 Java 自带 JavaDoc 工具来生成代码的技术文档。 - 用户文档 - 本文档不同于上述所有说明。保留所有以前的文档,以提供有关软件及其开发过程的信息。但是用户文档解释了软件产品应该如何工作以及如何使用它来获得所需的结果。
这些文档可能包括软件安装过程、操作指南、用户指南、卸载方法和特殊参考,以获得更多信息,如许可证更新等。
软件实施挑战
开发团队在实施软件时面临一些挑战。其中一些如下所述:
- 代码重用 - 当前语言的编程接口非常复杂,并配备了庞大的库函数。尽管如此,为了降低最终产品的成本,组织管理层更愿意重复使用之前为其他软件创建的代码。这是程序员在兼容性检查和决定要重用多少代码时面临的巨大问题。
- 版本管理 - 每次向客户发布新软件时,开发人员都必须维护与版本和配置相关的文档。该文单更需要高度精确并按时提供。
- 目标主机 - 组织中正在开发的软件程序需要为客户端的主机设计。但有时,不可能设计出在目标机器上运行的软件。