常见错误与规范

常见错误与编程规范 (★★)

#best-practices #abap-basics

常见编程错误

错误 后果 预防
数据库操作后缺少 sy-subrc 检查 静默数据丢失 始终检查 sy-subrc
使用 SELECT * 而非指定列 不必要的数据传输 列出需要的列
循环中的 SELECT n+1 次数据库往返 使用 JOIN 或预缓冲
错误的表类型(标准表用于查找) 线性搜索 O(n) 使用排序表或哈希表
未排序的表 + BINARY SEARCH 不可预测的结果 先排序再搜索
代码中遗留 BREAK-POINT 生产环境调试器 使用检查点组
算术中的类型不匹配 隐式转换错误 使用显式类型
忽略异常 未捕获的转储 使用 TRY/CATCH 处理

命名规范

客户命名空间

前缀 范围
Z* 客户开发
Y* 客户开发(备选)

对象命名

对象 前缀 示例
程序 ZY ZMY_PROGRAM
ZCL_ ZCL_ORDER_HANDLER
接口 ZIF_ ZIF_PAYMENT_PROCESSOR
函数组 Z ZFG_ORDER
函数模块 Z Z_CALCULATE_TAX
Z ZCUSTOMERS
结构 Z ZS_ORDER_ITEM
表类型 Z ZTT_ORDER_ITEMS
数据元素 Z ZDE_ORDER_STATUS
Z ZDOM_STATUS

变量命名(程序内部)

前缀 类型 示例
lv_ 局部变量 lv_countlv_name
gv_ 全局变量 gv_status
ls_ 结构 / 工作区 ls_flight
lt_ 内表 lt_flights
lw_ 工作区(备选) lw_result
lr_ 引用 / 范围 lr_datalr_range
lo_ 对象引用 lo_handler
mc_ 常量 mc_max_rows
co_ 常量(备选) co_initial_date

程序组织

Include 结构

1
2
3
4
5
6
7
8
9
+----------------------------------+
| 主程序 |
| INCLUDE zprog_top. | ← Top include(数据声明)
| INCLUDE zprog_cls. | ← 类定义
| INCLUDE zprog_pbo. | <-- PBO 模块(对话程序)
| INCLUDE zprog_pai. | <-- PAI 模块(对话程序)
| INCLUDE zprog_f01. | <-- FORM 例程
| INCLUDE zprog_f02. | <-- FORM 例程(按功能分组)
+----------------------------------+
Include 用途
Top include(_top 全局数据声明、TYPES、CONSTANTS
类 include(_cls 局部类定义和实现
Form include(_f01_f02、…) 按功能分组的模块化 FORM 例程
💡Top include 模式集中了所有数据声明。这防止重复声明并提供程序数据的清晰概览。

模块化建议

建议 原因
优先使用方法而非 FORM 方法在类中:更好的封装、继承、接口
使用类(局部或全局) 面向对象设计更易维护
保持模块化单元简短 更容易测试和理解
每个单元单一职责 每个方法/FORM 应做一件事
避免过程中使用全局变量 显式传递参数

错误处理

级别 方法
数据库操作 立即检查 sy-subrc
基于类的异常 TRY ... CATCH ... ENDTRY 配合异常类
断言 ASSERT 用于开发者不变量
函数模块 通过 EXCEPTIONS 或基于类的异常处理
返回值 使用返回参数,而不仅是 sy-subrc
1
2
3
4
5
6
7
8
9
10
11
12
" 好:立即检查 sy-subrc
SELECT SINGLE * FROM sflight INTO ls_flight WHERE carrid = 'LH'.
IF sy-subrc <> 0.
" 处理错误
ENDIF.

" 好:基于类的异常处理
TRY.
lo_handler->process_order( ls_order ).
CATCH cx_static_check INTO lx_error.
MESSAGE lx_error->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

代码可读性

实践 示例
有意义的命名 lv_flight_count 而非 lv_ncnt
注释解释”为什么”而非”什么” " 检查授权(业务规则 XYZ) 而非 " 设置标志为 X
一致的格式 对齐赋值,使用缩进
分组相关语句 一起声明所有数据,按逻辑顺序处理
避免深层嵌套 提取到辅助方法

考试/测试模式

关键词 / 短语 答案
“客户命名空间前缀” Z*Y*
“Top include 用途” 集中数据声明
“方法 vs FORM” 优先使用方法(更好的封装、OO 特性)
“常见错误:循环中的 SELECT” n+1 问题;使用 JOIN 或预缓冲
“sy-subrc 检查时机” 在设置它的操作之后立即检查
“注释最佳实践” 解释为什么,不是什么
“异常处理方法” 基于类的异常配合 TRY/CATCH
“对象引用的变量前缀” lo_
“内表的变量前缀” lt_

相关笔记