
124、ABAP对象与Function Module封装昨晚值班,被一个生产问题叫醒。用户报了一个采购订单保存时高频报错,错误日志指向一个古老的Function Module:Z_PO_CHECK。打开代码一看,里面用全局变量存了一堆中间状态,几百行IF嵌套,还直接读写了SAP标准表。关键是这个FM被两个新写的ALV报表和一个接口程序同时调用,一旦某个程序异常退出,全局变量没清,另一个程序进来就拿到脏数据。我盯着那段代码,想起很多人问过我:ABAP对象到底怎么跟Function Module结合?今天干脆把这个话题掰开揉碎。先说一个最扎心的场景:你写了个类,里面调用了某个Function Module,结果这个FM内部用了强类型数据引用,或者依赖调用方的内存上下文。类一实例化就崩,调试进去发现FM里某个Exporting参数根本没传出来,因为FM被封装在类里,调用方式变了,它内部某些隐式提交或回滚行为也跟着变。这不是FM的问题,是封装姿势不对。Function Module的本质是一段全局可调用的过程代码,它的生命周期跟ABAP会话绑定,内部数据默认是全局可见的。而ABAP对象是实例化的,状态封装在对象里。你把FM直接塞进方法里,相当于把一个喜欢裸奔的老程序员请进一间格子间,他习惯性想摸全局变量,你拦都拦不住。正确的做法不是拦,是给他一份规矩:接口收窄,上下文隔离。举个具体例子。我之前接手一个库存预留的后台任务,原实现是三个FM串行调用:FM_A取数,FM_B处理,FM_C更新。调用方是主程序,把数据通过一堆Global变量传递。我重构时把这套逻辑搬进了一个类,方法分三层:公共方法RUN,私有方法GET_DATA、PRO