Ada编程中的命名约定
1. Ada命名约定的重要性
Ada编程语言允许使用任意长度的标识符,但同时也要求这些标识符能够命名各种各样的实体。为了确保代码的可读性和可维护性,选择合适的命名约定至关重要。本篇文章将探讨Ada编程中命名约定的最佳实践,帮助开发者写出高效、清晰的代码。
1.1 标识符选择指南
Ada的一个重要目标是促进编写易于维护的程序。大型Ada程序包含了大量的实体,这些实体必须被赋予有意义的名称。为了确保程序的可维护性,需要制定一些规则来帮助程序员选择合适的标识符。
抽象问题
在选择命名实体时,程序员通常会面临一些挑战。例如,在一个复杂的程序中,如何为不同的实体选择描述性强且一致的名称?以下是案例研究中提出的一些具体问题:
- 命名实体 :在一个消息交换程序中,如何选择合适的标识符以确保代码的清晰性和可维护性?
- 现有代码的不足 :现有代码可能存在一些不足之处,如何通过改进命名方式提高代码的效率、可读性和一致性?
问题的原因
命名实体时面临的问题通常源于以下几个方面:
- 实体种类繁多 :Ada程序中存在多种具有相关含义的实体,如命名数字、对象、类型、记录组件等。为每个实体选择一个独特的名称是一项挑战。
- 保留字的影响 :Ada中有大量的保留字,这些保留字不能作为标识符使用,这减少了可选的标识符数量。
- 上下文子句的作用 :上下文子句允许在单独编译的单元中声明的大量实体在没有本地声明的情况下被使用,因此这些实体的名称应该能够清晰地描述其目的。
研究目标
研究的目标是探索大型Ada程序中良好标识符的要求,描述在尝试制定良好Ada标识符时遇到的问题,并提供选择标识符的示例指南。
示例
以下是一些具体的命名示例,展示了如何通过改进命名方式提高代码的质量:
类型 | 现有名称 | 改进后的名称 |
---|---|---|
类型 | MsgID | MessageID |
记录组件 | LogicalLine | LogicalOutputLine |
形式参数 | LineNumber | LogicalLineNumber |
通过这些改进,代码的可读性和可维护性得到了显著提升。
1.2 描述性标识符的重要性
描述性标识符可以显著提高程序的可读性和可维护性。许多较旧的语言对标记符的长度和形式有严格限制,而Ada允许使用任意长度的标识符。有效利用这种能力非常重要,原因如下:
- 唯一性 :在Ada程序中可能存在几种具有密切相关含义的不同实体,因此希望给每个实体一个能够唯一描述它的名称。
- 避免冲突 :大量的保留字消除了许多好的标识符候选,因此需要确保选择的标识符不会与保留字冲突。
- 自文档化 :上下文子句允许在单独编译的单元中声明的大量实体在没有本地声明的情况下被使用;命名这些实体的标识符应该记录它们的目的。
1.3 标识符选择的原则
为了帮助程序员选择合适的标识符,以下是一些基本原则:
-
一致性
:每个英文单词在标识符中应以一致的方式书写。例如,
Num-RIs
、ExtSerialNo
和Segment-Number
违反了这一规则。 -
避免过短的缩写
:除非至少节省了三个字母,否则不应使用缩写。例如,
Most
和Least
的缩写Mst
和Lst
,以及Length
的缩写Lgth
违反了这条规则。 - 避免混淆 :不应该有可能将一个单词的缩写误认为是另一个单词的缩写或完整形式。
缩写指南
为了确保缩写的清晰性和一致性,可以采用以下指南:
- 唯一缩写 :每个英文单词应有一个唯一的缩写。
- 显著缩短 :只有当缩写显著缩短单词时才使用。
- 明确意义 :缩写的含义应清晰明了。
- 截断法 :单个单词的缩写应通过截断形成。
例如:
英文单词 | 缩写 |
---|---|
Segment | Seg |
Identifier | Id |
Parameter | Param |
1.4 大小写混合的使用
与编写简短、神秘标识符的习惯相似,完全用大写字母键入标识符也是一个常见的做法。然而,为了提高代码的可读性,建议使用大小写混合的方式。
规则
- 保留字 :所有保留字应使用相同的大小写书写。大写或小写均可,取决于个人偏好。
- 标识符 :标识符应使用混合大小写,其中大写保留给缩写和单词的开头。
- 单字母标识符 :单字母标识符(在简短的循环中作为循环参数是适当的)应使用未用于保留字的大小写书写,以将其与保留字区分开来。
通过使用混合大小写,可以使代码更加清晰易读。例如:
EOMSEQ vs EOMSeq
BADMCB vs BadMCB
LOGSOMIN vs Log-SOM-In
CHECK-EOM vs CheckEOM
通过这些改进,代码的可读性和可维护性得到了显著提升。
接下来的部分将继续探讨Ada编程中的命名约定,包括如何在不同类型的实体中应用这些规则,以及如何通过一致的命名约定提高代码的整体质量。
1.5 不同类型实体的命名规则
在Ada编程中,不同类型的实体需要遵循不同的命名规则。以下是一些建议,可以帮助程序员在编写代码时选择合适的标识符。
1.5.1 过程和入口名称
过程和入口名称应使用命令式短语,以明确指示其功能。例如:
-
Set-LogicalLine(MsgID, LogicalLineNumber)
:设置消息的逻辑行号。 -
Transmit(MessageID)
:发送消息。
通过这种方式,程序员可以清楚地知道调用该过程或入口时将执行什么操作。
1.5.2 非布尔变量、常量、数字和函数
非布尔变量、常量、数字和函数应使用名词短语命名,以描述其所代表的值。例如:
-
Message
:表示一条消息的变量。 -
Trailer
:表示消息尾部的常量。 -
HardwareClockReading
:获取硬件时钟读数的函数。 -
NextSegment
:获取下一个段的函数。
1.5.3 布尔变量和函数
布尔变量和函数应基于声明性短语命名,以描述其逻辑状态。例如:
-
IsValidPhysicalLine(Line)
:判断某行是否为有效的物理行。 -
IsAvailable(Line)
:判断某行是否可用。
1.5.4 任务名称
任务名称应通过在动词后面添加“-er”后缀来形成,以表明任务的功能。例如:
-
VersionFreer
:负责版本释放的任务。 -
Transmitter
:负责传输消息的任务。 -
SvcMessageGenerator
:生成服务消息的任务。
1.5.5 类型名称
类型名称应在末尾加上“-Type”后缀,以表明这是一个类型定义。例如:
-
MessageType
:消息类型。 -
CharSetType
:字符集类型。
1.5.6 记录组件名称
记录组件名称应在末尾加上“-Part”、“-Field”或“-Component”后缀,以表明这是记录的一部分。例如:
-
VersionHeaderPart
:版本头部分。 -
LogicalOutputLineField
:逻辑输出行字段。
1.5.7 包名称
包名称应在末尾加上“-Package”后缀,以表明这是一个包。例如:
-
MessageOpsPackage
:消息操作包。 -
UtilsPackage
:工具包。
1.5.8 枚举字面量
枚举字面量应使用后缀来指示其类型。例如:
-
AsciiChar
:ASCII字符。 -
ItaChar
:ITA字符。
1.5.9 访问类型
访问类型用于指定类型
XXXType
的值时,应命名为
XXX-PointerType
,除非有更抽象的名称更合适。例如:
-
MessagePointerType
:指向消息类型的指针。
1.6 标准缩写词典
为了确保项目范围内的一致性,建议维护一个标准缩略语词典。这个词典应列出所有将通过下划线连接起来形成标识符的元素。以下是一个示例词典:
英文单词 | 缩写 |
---|---|
Message | Msg |
Identifier | Id |
Parameter | Param |
Logical | Log |
Output | Out |
Input | In |
这个标准缩略语词典将成为项目文档的重要部分,使代码更易于阅读和维护。
1.7 混合大小写的应用
混合大小写的使用不仅可以提高代码的可读性,还可以帮助区分不同的编程元素。以下是一些具体的例子:
EOMSEQ vs EOMSeq
BADMCB vs BadMCB
LOGSOMIN vs Log-SOM-In
CHECK-EOM vs CheckEOM
通过使用混合大小写,首字母序列会突出显示,不会被误认为是单词或单词的缩写。例如,
BADRIS
可能会被误解为某种称为
RIS
的东西,而写成
BadRIs
则更清楚地表明其含义。
1.8 自文档化的重要性
上下文子句能够引入大量标识符而无需局部声明,这使得标识符必须具有自文档化功能。以下是确保标识符自文档化的一些方法:
-
避免混淆
:标识符中的单词应通过下划线分隔,以避免混淆。例如,
Logical_Output_Line
。 - 不隐藏外部标识符 :内部标识符不应隐藏具有相同名称的外部标识符,尤其是在内部标识符的作用域中包含对外部标识符的引用时。
1.8.1 示例:消息交换程序
考虑一个消息交换程序,其中包含多种类型的实体需要命名。以下是一些具体的命名示例:
-
类型
:
MsgID
改进为MessageID
。 -
记录组件
:
LogicalLine
改进为LogicalOutputLine
。 -
形式参数
:
LineNumber
改进为LogicalLineNumber
。
通过这些改进,代码的可读性和可维护性得到了显著提升。
1.9 模块化结构
在大型Ada程序中,模块化结构对于提高代码的可读性和可维护性至关重要。以下是一些模块化结构的例子:
graph TD;
A[消息交换程序] --> B[库单元];
B --> C[子单元];
C --> D[任务];
C --> E[过程];
C --> F[记录];
在这个例子中,消息交换程序被分解为多个模块,每个模块负责不同的功能。库单元和子单元的使用有助于减少嵌套深度,提高代码的可读性。
1.10 结束语
通过遵循上述命名约定和最佳实践,程序员可以编写出更加清晰、易于维护的Ada程序。良好的命名不仅提高了代码的可读性,还减少了错误的发生率。以下是一些总结性的建议:
- 保持一致性 :在整个项目中保持一致的命名规则。
- 避免缩写 :除非确实必要,否则尽量避免使用缩写。
- 使用混合大小写 :通过混合大小写提高代码的可读性。
- 维护标准缩略语词典 :确保所有团队成员都遵循统一的缩写规则。
通过这些方法,程序员可以编写出更加高效、清晰的Ada代码,从而提高项目的整体质量。