Ada 样式指南/简介
风格是一个经常被忽视但非常重要的写作属性。写作风格直接影响最终产品的可读性和可理解性。编程风格,作为用计算机语言编写源代码,也遭受了这种忽视。程序需要让人类能够阅读和理解,而不仅仅是机器能够比较。这种要求对于创建高质量的产品至关重要,这些产品不仅满足用户需求,而且能够按计划开发并在估计成本内完成。本书旨在帮助计算机专业人员编写更好的 Ada 程序。它提供了一套具体的风格指南,用于以规范的方式使用 Ada 95 的强大功能(Ada 参考手册 1995)。
每个指南都包含一个关于应遵循的原则的简洁陈述以及遵循该指南的基本原理。在大多数情况下,都会提供使用该指南的示例,并且在某些情况下,还会包含另一个示例来展示违反该指南的后果。明确指出了应用该指南的可能例外情况,并在适当的情况下提供了进一步的解释性说明。在某些情况下,会提供实例以显示可以作为标准执行的更具体的指导。在选定的情况下,自动化说明会讨论如何自动执行指南的执行。
Ada 被设计用来支持开发高质量、可靠、可重用和可移植的软件。由于多种原因,没有任何编程语言可以单独确保实现这些理想的目标。例如,编程必须嵌入到一个规范的开发过程中,该过程以有组织的方式处理需求分析、设计、实现、验证、确认和维护。语言的使用必须符合基于成熟软件工程原则的良好编程实践。本书旨在帮助弥合这些原则与 Ada 实际编程实践之间的差距。
本书中的许多指南旨在促进清晰的源代码。这些指南的目标是提高程序演变、适应和维护的易用性。易于理解的源代码更有可能正确且可靠。轻松的适应需要对软件有透彻的理解;清晰度极大地促进了这一点。有效的代码改编是代码重用的先决条件,代码重用具有大幅降低系统开发成本的潜力。最后,由于维护(实际上是演变)是一个在系统整个生命周期中持续进行的昂贵过程,因此清晰度在降低维护成本方面发挥着重要作用。在整个生命周期中,代码需要阅读和理解的次数远远多于编写的次数;因此,投资编写可读、易于理解的代码是值得的。
本简介的其余部分讨论了本书的组织结构以及如何由不同角色的人员使用所提供的材料,包括 Ada 新手程序员、有经验的 Ada 程序员、面向对象程序员、软件项目经理、承包机构、标准制定组织以及从现有的 Ada 83 程序(Ada 参考手册 1983)过渡到 Ada 95 的规划人员。
本书的格式遵循了 Ada Quality and Style: Guidelines for Professional Programmer's,版本 02.01.01 (AQ&S 83)(软件生产力联盟 1992)广受好评的指南格式。样式指南分为几个部分,对应于每个程序员在创建高质量、可靠、可重用和可移植的 Ada 软件时必须做出的主要决策。各部分之间存在一些重叠,因为并非所有编程决策都可以独立做出。
各个章节分别介绍源代码呈现、可读性、程序结构、编程实践、并发、可移植性、可重用性和性能,以及一个新章节介绍面向对象特性。每章最后都总结了其中包含的指南。最后一章展示了由 Michael B. Feldman 博士和 Bjorn Kallberg 先生提供的哲学家就餐问题的完整实现。本书中的许多指南都用于创建此示例。附录提供了 Ada 参考手册(1995)各节与本样式指南中指南之间的交叉引用矩阵。
本书使用了过去 20 年来发展起来的通用软件工程词汇。软件工程是一门发展迅速的学科,拥有相对较新的概念和术语。但是,为了建立一个共同的参考框架,需要从 Ada 参考手册(1995)和基本原理(1995)中提取必要的定义。
在整本书中,都引用了有关 Ada 风格和其他 Ada 问题的其他信息来源。参考文献列在书的末尾。还提供了一个参考书目。
在本指南中,“Ada”指的是 1995 年 2 月发布的最新 Ada 标准(有时也称为 Ada 95)。对早期 Ada 标准的引用明确表示为“Ada 83”。
第 2 章和第 3 章直接解决了创建清晰、可读和易于理解的源代码的问题。第 2 章侧重于代码格式,第 3 章介绍了注释的使用、命名约定和类型等问题。
代码清晰度主要有两个方面:(1)在页面或屏幕上仔细且一致地布局源代码,第 2 章介绍了这一点,这可以极大地增强可读性;(2)仔细注意代码的结构,第 3 章介绍了这一点,这可以使代码更容易理解。这在小规模(例如,通过仔细选择标识符名称或规范地使用循环)和大规模(例如,通过正确使用包)上都是正确的。这些指南同时处理布局和结构。
代码格式和命名约定偏好往往非常个人化。您必须权衡您个人喜好与项目中其他工程师的喜好,以便就整个项目团队将遵循的一套一致的约定达成一致。自动代码格式化程序可以帮助执行这种一致性。
第 4 章介绍了整体程序结构。正确的结构可以提高程序的清晰度。这类似于较低级别的可读性,并包括高级结构的问题,特别是包和子包的使用、可见性和异常。本章中的大多数指南都与应用健全的软件工程原则有关,例如信息隐藏、抽象、封装和关注点分离。
第 5 章介绍了定义一致和逻辑语言特性用法的指南。这些指南涵盖了语法的可选部分、类型、数据结构、表达式、语句、可见性、异常和错误执行。
第 6 章定义了正确使用并发性的方法,以开发可预测、可靠、可重用和可移植的软件。主题包括任务、受保护单元、通信和终止。Ada 语言的一个主要增强领域是对共享数据的更好支持。任务机制一直是保护共享数据的唯一可用方法。本章中的指南支持使用受保护类型来封装和同步对共享数据的访问。
第 7 章和第 8 章从略微不同的角度探讨了面向变化的设计问题。第 7 章探讨了可移植性的基本原理,即软件从一个计算机系统或环境更改到另一个计算机系统或环境的难易程度,以及特定功能的使用对可移植性的影响。第 8 章探讨了代码的可重用性,即代码可以在不同的应用程序中使用而无需进行最小更改的程度。
第 7 章讨论的可移植性指南需要仔细注意。即使目前没有预见到移植所得软件的需要,遵守这些指南也很重要。遵循这些指南可以提高所得代码在使用不同 Ada 实现的项目中的潜在可重用性。您应该坚持,当特定的项目需求迫使放宽某些可移植性指南时,源文本的不可移植功能应突出显示。
第 8 章给出的可重用性指南基于封装和面向变化的设计原则。这些指南强调,理解和清晰度、健壮性、适应性和独立性都是有用且理想的,即使预期不会重用,因为生成的代码对计划内和计划外的更改更具抵抗力。
第 9 章定义了一组以面向对象术语为基础的指南,这些指南利用了 Ada 95 中的一些 Ada 83 中没有的功能。这些指南讨论了使用 Ada 的新特性,例如类型扩展(带标记类型)、抽象带标记类型和抽象子程序来实现单一继承、多重继承和多态性。
第 10 章定义了一组旨在增强性能的指南。我们认识到,某些性能方法与可维护性和可移植性存在矛盾。本章中的大多数指南都写着“. . . 当测量的性能表明时”。“表明”意味着您已确定,在您的环境中,提高应用程序性能带来的好处超过了对所得代码的可理解性、可维护性和可移植性的负面影响。
本书面向参与用 Ada 编写的软件系统实际开发的人员。以下部分讨论了如何最有效地利用所提供的材料。具有不同 Ada 经验水平或在软件项目中扮演不同角色的读者需要以不同的方式使用本书。
本书有多种使用方法:作为良好的 Ada 风格指南;作为有助于编写更好的 Ada 程序的指南的综合列表;或作为参考书,用于查阅特定语言功能的使用示例和设计权衡讨论。本书包含许多指南,其中一些非常复杂。没有必要同时学习所有这些指南;您不太可能同时使用语言的所有功能。但是,建议所有程序员(以及在可能的情况下,其他 Ada 项目人员)努力阅读并理解第 2 章、第 3 章、第 4 章和第 5 章直至第 5.7 节。其中一些内容相当困难(例如,讨论可见性的第 4.2 节),但它涵盖了 Ada 有效使用的一些基本问题,对于参与构建 Ada 系统的任何软件专业人员来说都非常重要。
本书并非作为 Ada 入门教材或 Ada 语言的完整手册。我们假设您已经了解 Ada 的语法并对语义有基本的了解。有了这样的背景,您会发现这些指南很有用、信息丰富,并且经常具有启发性。
如果您正在学习 Ada,则应配备一本关于该语言的综合入门教程。两本关于 Ada 83 的优秀的入门教材是 Barnes (1989) 和 Cohen (1986)。两位作者都出版了涵盖 Ada 95 的新书(Barnes 1996,Cohen 1996)。熟悉这些教材后,建议您结合 Rationale (1995) 使用它们。Ada 参考手册 (1995) 应被视为这些书籍的配套资料。大多数指南都参考了 Ada 参考手册 (1995) 中定义所讨论语言功能的部分。附录 A 将 Ada 语言参考手册的部分内容交叉引用到指南中。
乍一看,Ada 提供了种类繁多的功能。它是一个强大的工具,旨在解决难题,几乎每个功能在某种情况下都有其合法的应用。这使得以有纪律且有组织的方式使用 Ada 的功能尤其重要。遵循这些指南可以使学习 Ada 变得更容易,并帮助您掌握其明显的复杂性。从一开始,您就可以编写利用语言最佳功能的程序,并以设计者预期的方式进行。
有经验的其他编程语言程序员常常试图将 Ada 视为他们熟悉的语言,但语法略有不同。必须不惜一切代价避免这种陷阱;它会导致代码变得复杂,从而破坏了 Ada 的那些使其非常适合构建高质量系统的特性。您必须学会“思考 Ada”。遵循本书中的指南并阅读其使用示例将帮助您尽可能快速和轻松地做到这一点。
在某种程度上,学习 Ada 的新手程序员具有一定的优势。从一开始就遵循指南有助于培养一种清晰的编程风格,有效地利用该语言。如果您属于此类,建议您将这些指南应用于您作为学习 Ada 的一部分所执行的练习。最初,通过专注于指南本身及其支持示例来培养良好的编程习惯,比理解每个指南的基本原理更重要。
许多指南的基本原理帮助有经验的程序员理解和接受指南中提出的建议。一些指南本身也针对必须进行工程权衡的有经验的程序员。这在可移植性、可重用性和性能方面尤其如此。这些更难的指南和基本原理将使您了解影响每个编程决策的问题。然后,您可以利用这些认识来识别最终在您成为有经验的 Ada 程序员时将被要求进行的工程权衡。
作为一名有经验的 Ada 程序员,您编写的代码已经符合本书中的许多指南。但是,在某些领域,您可能采用了与此处介绍的不同的个人编程风格,并且可能不愿意更改。仔细审查与您当前风格不一致的指南,确保您理解其基本原理,并考虑采用它们。本书中的指南整体体现了一种一致的方法,用于生成高质量的程序,而过多的例外情况会削弱这种方法。
一致性是普遍采用通用指南的另一个重要原因。如果项目的全体人员都以相同的风格编写源代码,则许多关键的项目活动会更容易。一致的代码简化了正式和非正式的代码审查、系统集成、项目内的代码重用以及支持工具的提供和应用。在实践中,公司或项目标准可能要求对偏离指南的情况进行明确注释,因此采用非标准方法可能需要额外的额外工作。
本书中的一些指南,尤其是在并发性、可移植性、可重用性、面向对象特性和性能方面的章节,侧重于设计权衡。这些指南要求您考虑使用 Ada 特性是否适合您的应用程序的设计决策。通常有几种方法可以实现特定的设计决策,这些指南讨论了您在做出决策时应考虑的权衡。
作为一名有经验的面向对象程序员,您会赞赏为优雅地扩展 Ada 语言以包含强大的面向对象特性所付出的努力。这些新特性与现有的语言特性和词汇紧密集成。本书有意从风格的角度出发进行编写;因此,本书贯穿始终都使用了 Ada 面向对象特性。这些特性的规范使用将有助于创建更易于阅读和修改的程序。这些特性还为您构建可重用组件提供了灵活性。第 9 章讨论了面向对象编程以及继承和多态性问题。前面的章节交叉引用了第 9 章中的指南。
如果您已经进行过面向对象设计,那么您会发现更容易利用第 9 章中的许多概念。面向对象设计的成果将包括一组有意义的抽象和类层次结构。抽象需要包括设计对象的定义,包括结构和状态、对象上的操作以及每个对象的预期封装。设计这些抽象和类层次结构的细节超出了本书的范围。许多好的资源提供了这方面的详细信息,包括 Rumbaugh 等人 (1991)、Jacobson 等人 (1992)、ADARTS 指南 (软件生产力联盟 1993) 和 Booch (1994)。
技术管理在确保项目过程中产生的软件正确、可靠、可维护和可移植方面发挥着关键作用。管理层必须在项目范围内建立对高质量代码生产的承诺;定义项目特定的编码标准和指南;培养对统一遵守所选编码标准对于产品质量至关重要的理解;并建立检查和执行该遵守情况的政策和程序。本书中包含的指南可以帮助实现这一目标。
管理人员的一项重要活动是为项目或组织定义编码标准。这些指南本身并不构成一套完整的标准;但是,它们可以作为标准的基础。一些指南指出了多种决策范围,但并没有规定具体的决策。例如,本书中的第二条指南(指南 2.1.2)提倡使用一致的空格数进行缩进,并在基本原理中指出 2 到 4 个空格是合理的。您应该与您的高级技术人员一起审查每一条此类指南,并就其实例化做出决定,这将构成您的项目或组织标准。
另外两个领域需要管理层做出关于标准化的决策。指南 3.1.4 建议您避免在对象或单元名称中使用任意缩写。您应该为允许使用应用程序特定术语的较短版本的项目准备一份可接受缩写的词汇表(例如,FFT 表示快速傅里叶变换或 SPN 表示随机佩特里网)。您应该保持此词汇表简短,并将其限制在需要作为名称一部分频繁使用的术语。必须不断参考冗长的词汇表才能理解源代码,这使得阅读变得困难。
第 7 章中给出的可移植性指南需要仔细注意。即使目前没有预见到移植所得软件的需要,遵守这些指南也很重要。遵循这些指南可以提高所得代码在使用不同 Ada 实现的项目中的潜在可重用性。您应该坚持,当特定项目需求迫使放宽某些可移植性指南时,源代码的不可移植特性会得到突出显示。遵守第 7 章中的指南需要定义和标准化项目或组织特定的数值类型,以代替(可能不可移植的)预定义数值类型。
您关于标准化问题的决策应纳入项目或组织编码标准文档中。有了编码标准,您需要确保遵守这些标准。获得您的编程人员全心全意地承诺使用这些标准至关重要。鉴于这种承诺以及您的程序员生产的高质量 Ada 代码的示例,进行有效的正式代码审查以检查对项目标准的合规性将变得容易得多。
Hefley 等人 (1992) 讨论了一些关于 Ada 项目管理的一般问题。
此处提供的许多指南都足够具体,可以作为公司或项目的编程标准。其他一些指南需要在作为标准使用之前做出关于特定实例化的管理决策。在这种情况下,会提供一个示例实例化并在所有示例中使用。此类实例化应被视为比指南本身更弱的建议。在某些情况下,如果示例是从已发表的作品中提取的,则作者的风格将保持不变。
本书中提供的其他指南有意以需要考虑的设计选择的形式表达。这些指南不能作为项目必须遵循的硬性规则来实例化。例如,您不应将指南 6.1.1 和 6.1.2 解释为项目禁止使用任务。相反,这些指南旨在帮助设计人员在使用受保护对象和任务之间进行权衡,从而引导设计人员在这些特性之间做出更明智的选择。
本文档中的指南并非旨在独立作为标准。在某些情况下,不清楚是否可以强制执行指南,因为它仅旨在让工程师了解权衡。在其他情况下,关于指南仍然存在选择,例如每个缩进级别使用多少空格。
当指南过于笼统而无法显示示例时,每个指南的“实例化”部分包含更具体的指南。这些实例化可以被视为标准,并且更有可能得到执行。任何试图从本文档中提取标准的组织都需要评估完整的上下文。每条指南在相关的指南被实践时效果最佳。如果孤立地使用,指南可能几乎没有或没有益处。
过渡问题分为两大类:语言之间不兼容性,特别是向上兼容性,以及新语言特性的利用。
Ada 95 的向上兼容性是该语言的主要设计目标。在实践中可能发生的 Ada 83 和 Ada 95 之间少量的不兼容性很容易克服(参见 Ada 95 Rationale [1995] 附录 X,标题为向上兼容性)。有关兼容性问题的详细信息,请参见 Taylor (1995) 和 Intermetrics (1995)。
过渡规划人员可以通过本书以两种方式深入了解语言特性的利用。首先,表 1 显示了新的 Ada 95 语言特性对风格指南章节的影响。其次,附录 A 将 Ada 参考手册 (1995) 的章节映射到特定的风格指南。
本风格指南使用以下排版约定
- 衬线字体 信息的一般呈现。
- 斜体衬线字体 出版物标题和强调。
- 粗体衬线字体 章节标题。
- 粗体无衬线字体 指南、实例化、示例、基本原理、注释、异常、自动化注释、警告以及摘要部分中的子标题的子标题。
- 打字机字体:
Syntax of code.