引言与核心原则
本规范旨在确保 ABAP 程序具备良好的结构、可读性、可靠性和可维护性,从而提高生产力与客户服务质量。所有 NEACC 的 ABAP 开发人员都应遵循此文档中定义的标准。
核心政策声明
ABAP 应用开发人员 不得 对任何 SAP 标准对象进行修改。任何对此政策的例外都必须经过严格审查和批准。团队应尽一切努力寻找技术上合理的解决方案,以避免需要为此政策申请例外。
所有程序都 必须 包含权限检查,以确保只有适当的用户组才能执行给定的程序并访问相应业务领域的数据。
NASA 规范 vs. 通用规范:对比分析
与通用企业 ABAP 开发规范相比,NASA 的标准在多个维度上体现了其独特的严谨性与科学性,更接近于航空航天工程领域的开发准则。
核心差异总结:从“最佳实践”到“绝对指令”
对比维度 | 通用企业规范 (Best Practice) | NASA 规范 (Absolute Directive) | 核心差异解读 |
---|---|---|---|
1. 对象修改策略 | 强烈不建议修改标准对象,但通常作为一种高级开发者的“后门”存在。 | 绝对禁止修改标准对象,任何例外都需通过正式、严格的审批流程。 | NASA 将系统稳定性置于最高优先级,视任何对核心的直接修改为高风险行为,必须纳入风险管控流程。 |
2. 文档与可追溯性 | 要求有头部注释和变更日志。 | 强制使用标准模板,且每一处代码变更都必须在注释中与**传输请求号(TR)和服务请求号(SR)**直接关联。 | 通用规范满足了代码理解的需求,而 NASA 的要求构建了一个**法律和审计级别**的追溯链条,确保任何变更都有源可溯、有责可追。 |
3. 开发流程 | 给予开发者一定的灵活性,依赖于系统自带的版本管理。 | 高度流程化和标准化。例如,为无版本管理的 SAPscript 对象定义了详尽的手动版本控制流程。 | NASA 将软件开发视为一项系统工程,通过固化流程来消除因个人习惯差异带来的不确定性,确保过程的稳定和可重复性。 |
4. 权限与安全 | 通常在涉及财务、人事等敏感数据的事务性程序中强调权限检查。 | 强制要求所有程序都必须包含权限检查,并将安全视为**设计之初就必须内置**的属性。 | NASA 将安全从一个“功能点”提升到了一个“系统性要求”,体现了其对数据安全和合规性的零容忍态度。 |
详细对比分析
1. 对象修改策略:风险的“容忍度” vs “零容忍”
NASA 的标准将修改标准对象视为战略层面的红线。`“shall not make modifications”` 不是建议,而是指令。它背后是航空航天领域对系统可靠性的极致要求:核心系统必须是“黑盒”,其行为必须完全可预测。
2. 文档与可追溯性:为“理解” vs 为“审计”
将每一次变更与 `Transport#` 和 `SR#` 绑定,其目的不仅是“知道”,更是为了“证明”和“审计”。在出现问题时,可以迅速定位到是哪一次需求、哪一个审批流程、哪一个传输请求引入的变更。这是一种面向问题根源分析(Root Cause Analysis)和责任界定的工程化管理方法。
3. 开发流程:给予“自由” vs 施加“约束”
NASA 通过强制模板和为老旧技术定义手动版本控制流程,实际上是在用“约束”来保证“质量”。它不相信个人的“自由发挥”,而是相信严格遵循流程才能带来一致和可靠的产出。这与飞行器制造中每一个螺丝的拧紧力矩都有严格规定是同一种哲学。
4. 权限与安全:功能性 vs 系统性
`“All programs shall have an authorization check...”` 这意味着安全是系统性的,是每一个开发对象的固有属性。它要求开发人员在编码之初就与安全团队协作,将权限检查作为程序逻辑不可或缺的一部分,而不是一个可以事后添加的补丁。
3.0 程序结构
定义标准的程序布局对于产出结构一致的程序至关重要。所有自定义程序都必须遵守这些标准。
3.3.1 外部程序元素
指程序源代码之外的特性,如命名、文本和属性。
- 程序命名 (3.3.2): 程序标识必须遵守 ABAP 命名标准文档。
- 文本元素 (3.3.3): 所有文本字面量都必须声明为“文本元素”。这对于多语言支持和维护至关重要。
- 属性 (3.3.4): 必须为程序定义“应用程序”属性(如 FI, MM, SD),并提供有意义的标题。
3.4 内部程序元素
指直接关系到 ABAP 程序源代码的特性。
3.4.1 程序头部 (Header)
程序头部 必须 在程序开头声明,并采用模板程序 `ZABAPTEMPLATE` 的格式。
头部至少包含六个项目:NASA 标识、程序名、创建日期、作者、描述和修改日志。修改日志必须包含传输请求号和 SR 号。
*&---------------------------------------------------------------------* *& NASA *& PROGRAM: ZABAPTEMPLATE: V1.2, 04/11/06 *& CREATION DATE: <date created, e.g. May, 2024> *& AUTHOR: <programmer name> *& DESCRIPTION: Header template for all ABAP objects. *&---------------------------------------------------------------------* *& Modification Log *&---------------------------------------------------------------------* *& Date Developer Transport# SR# Description *& ---------- -------------- ------------ -------- --------------------* *& mm/dd/yy userid DEVK9nnnnn SR-nnnnn Initial Development. *&---------------------------------------------------------------------*
3.4.2 声明元素 (Declarative Elements)
数据声明的格式应保持一致,以提高可读性。建议使用 Pretty Printer 格式化代码。
- TABLES: 每个表声明占一行。在 ABAP Objects 中禁止使用。
- TYPES: 每个类型声明占一行。
- DATA: 每个字段声明占一行,类型定义应对齐。
- CONSTANTS: 每个常量声明占一行,类型和值定义应对齐。
3.4.3 事件元素 (Event Elements)
在所有 ABAP 报表程序中,必须 始终存在 `START-OF-SELECTION` 和 `END-OF-SELECTION` 事件。
3.4.4 控制元素 (Controlling Elements)
- IF vs CASE: 当一个变量被重复评估多个离散值时,必须 使用 `CASE...WHEN...ENDCASE` 语句替换 `IF...ELSE...ENDIF`。
- CASE 完整性: `CASE` 语句 必须 包含 `WHEN OTHERS` 处理块。
- 循环: `DO...ENDDO` 和 `WHILE...ENDWHILE` 循环 必须 编码有受控的退出点。
- 子程序 (FORM): 每个子程序 必须 以一个 FORM 头部注释块作为前缀,并包含子程序名称。
3.7 数据库表
创建自定义 Z 表时,表名 必须 以 "Z" 开头,后跟有意义的描述。
附加到现有 SAP 表的非 SAP 字段名称 必须 以 "ZZ" 作为命名约定。
3.10 ABAP 编码技术
本节包含一系列旨在提高性能和代码质量的编程技术。
3.10.1 数据选择
- `SELECT *` 禁忌: 仅选择程序所需的字段,以减少网络传输和内存消耗。
- `INTO TABLE` 优先: 优先使用 `SELECT ... INTO TABLE` 一次性读取数据到内表,避免在循环中使用 `SELECT`。
- `FOR ALL ENTRIES` 检查: 在使用 `FOR ALL ENTRIES` 之前,必须 检查驱动表是否为空。
3.10.2 其他指南
SAP 表 只能 通过 SAP 标准函数、BAPI 或 BDC 进行修改。此标准不适用于自定义 ABAP 表。
3.11 ABAP 面向对象
ABAP Objects 是 ABAP 语言的面向对象扩展。
- 类 (Classes): 本地类 必须 以 'lcl' 为前缀。全局类应在类的相关本地定义部分维护一个头部。
- 属性 (Attributes): 应 使用 `DATA` 语句和 `TYPE` 附加来定义数据对象。
- 方法 (Methods): 每个方法 必须 以一个 METHOD 头部注释块作为前缀,并包含方法名称。
3.12 SAPscript
必须 在 SAPscript 表单的 `DOCUMENTATION` 子对象中输入文档。
表单的头部信息应在文档的 `FORM` 部分定义,并遵循与程序头部相同的模板。由于 SAPscript 没有版本管理,在修改前应使用程序 `RSTXSCRP` 导出当前版本进行手动备份。
3.13 屏幕绘制器
当对话消息与屏幕上的单个字段相关时,光标 必须 动态定位到该字段上。
更改 SAP 数据库的事务 必须 检查所需记录是否空闲可更改(即加锁/解锁),以确保数据完整性。