最近几天发现这篇文章被单击的次数比较高, 这里把文档内容再充实一下:
本文谈得是SAP BAdI 机制背后的一些设计问题, 关于如何使用BAdI请参考:
...
在SAP系统中 BAdI 相关类的 类图 如下:
下面能过代码分析 BAdI 机制背后的一些设计问题:
1. 定义指向BAdI interface的Reference
DATA: exit_ref TYPE REF TO ZIF_EX_BADI.
2. 获得继承BAdI interface的子类实例
CALL METHOD cl_exithandler=>get_instance
CHANGING
instance = exit_ref.
这里的cl_exithandler=>get_instance方法是一个简化的Abstract Factory.
a) 为什么说它是个简化的Abstract Factory呢? 因为CL_EXITHANDLER没有一个抽象的工厂类, 只有一个产品簇, 只完成单一的创建工作。
b) 为什么不说它是个Factory Method? 是因为它没把类的创建工作延迟到子类。
c) 为什么cl_exithandler=>get_instance要用工厂模式呢?
在Client代码端看来,通过调用get_instance这个方法就可以得到具体实现类实例,然后调用下面的方法:
CALL METHOD exit_ref->CUSTOM_VALIDATION
IMPORTING
param = 'xxx'
EXPORTING
flt_val = 'xxx'.
就调用到实现类中的接口方法了。
但通过Debug代码你会发现这个调用返回的是Adapter Class 'ZCL_EX_BADI'而非我们的Impl Class!
其实这就是创建型模式的意义 - 隐藏对象的创建细节.
也就是说当我们调用CUSTOM_VALIDATION时,其实是调用了ZCL_EX_BADI->CUSTOM_VALIDATION.
3. ZCL_EX_BADI->CUSTOM_VALIDATION,这个方法是SAP系统自动生成的,核心代码如下:
- ...
- LOOP AT INSTANCE_BADI_TABLE ASSIGNING <exit_obj></exit_obj>
WHERE METHOD_NAME = 'DISPLAY'.
- APPEND TO EXIT_OBJ_TAB.
- ENDLOOP.
- ...
- LOOP at exit_obj_tab ASSIGNING <exit_obj></exit_obj>
WHERE ACTIVE = SXRT_TRUE.
- CHECK <exit_obj></exit_obj>-imp_class NE old_imp_class.
- <flt_cache_line></flt_cache_line>-valid = sxrt_true.
- flt_val_db = <exit_obj></exit_obj>-flt_val.
- ...
- MOVE <exit_obj></exit_obj>-imp_class to <flt_cache_line></flt_cache_line>-imp_class.
- MOVE <exit_obj></exit_obj>-imp_switch to <flt_cache_line></flt_cache_line>-imp_switch.
- MOVE <exit_obj></exit_obj>-order_num to <flt_cache_line></flt_cache_line>-order_num.
- INSERT INTO TABLE INSTANCE_FLT_CACHE.
- old_imp_class = <exit_obj></exit_obj>-imp_class.
- ENDLOOP.
- ...
- LOOP AT INSTANCE_FLT_CACHE ASSIGNING <flt_cache_line></flt_cache_line>
- WHERE flt_name = flt_name
- AND valid = sxrt_true
- AND method_name = 'CUSTOM_VALIDATION'.
- ...
- CALL METHOD ('CL_FOBU_METHOD_EVALUATION')=>load
- EXPORTING
- im_class_name = <flt_cache_line></flt_cache_line>-imp_class
- im_interface_name = 'ZIF_EX_BADI'
- im_method_name = 'CUSTOM_VALIDATION'
- RECEIVING
- re_fobu_method = <flt_cache_line></flt_cache_line>-eo_object
- EXCEPTIONS
- not_found = 1
- OTHERS = 2.
- ...
- ENDLOOP.
这时我们会发现这段代码会找到所有Active的BAdI Implemention然后去执行它。这里有点Adpater的味道而且在SAP标准文档中确实是把ZCL_EX_BADI 类为Adapter Class, 但是我觉得这个叫法不合适,改变接口不是这个类的主要价值,里面的Loop调用实现类方法和Filter显得更主要。所以它的主要价值应该是对实现类的访问控制,改称Adapter Class为 Proxy或许更合适。下面是Proxy模式的类图:
关于Proxy模式, 《Head First Design Pattern》中讲的非常不错,这里推荐一下。
总结:
1. 通过 Factory 获得Adapter Class 的实例 (障眼法 / 封装创建细节)
2. 通过 Proxy 对象(Adapter Class) 实现对 BAdI Implementations 的访问控制
分享到:
相关推荐
需要注意的是,在实现BADI时,需要遵守SAP的开发规范和命名惯例,以确保开发出的解决方案符合SAP的标准和要求。此外,BADI的实现还需要考虑到性能和安全性等方面的因素,以确保解决方案的稳定性和安全性。 本文提供...
BADI是SAP中用来实现面向对象的增强技术,它允许用户不改动标准代码的情况下,通过接口来扩展或改变系统行为。 描述:“对于MIGO,看它使用了哪些BADI:找到MIGO的program: System->status它的program为:SAPLMIGO ...
BADI(Business Add-In)和屏幕增强是ABAP开发中的关键概念,它们允许用户自定义和扩展标准SAP功能以满足特定业务需求。 **BADI简介** BADI是一种灵活的、面向对象的设计技术,它允许开发人员在不修改标准SAP代码的...
理解CL_EXITHANDLER类及其GET_INSTANCE方法的工作原理,以及如何通过设置断点来追踪具体出口的名称,是实现这一目标的关键。这种方法不仅提高了SAP系统的灵活性,也确保了在维护和升级过程中,不会破坏原有的功能和...
详细讲述SAP ABAP的BADI增强的概述及使用。详细讲述SAP ABAP的BADI增强的概述及使用。详细讲述SAP ABAP的BADI增强的概述及使用。详细讲述SAP ABAP的BADI增强的概述及使用。详细讲述SAP ABAP的BADI增强的概述及使用。...
企业客户在使用SAP SD模块的过程中,经常会遇到需要对标准流程进行个性化调整或功能扩展的情况,而SAP提供的BADI (Business Add-Ins) 正是用于实现这种业务增强的技术手段。 BADI是SAP开发中用于业务增强的一种技术...
如何写一本BADI程序,详细手顺
SAP_ABAP_BADI SAP_ABAP_BADI 是 SAP 系统中的一种业务增强工具,BADi 全称为 Business Add-In...这个资源提供了关于 SAP 系统中的业务增强接口 BADi 的详细介绍和实现过程,以及一个示例程序来展示 BADi 的实际应用。
#### BADI概念解析 BADI(Business Add-In)是SAP提供的一种增强技术,它基于ABAP Objects框架,旨在为用户提供一种灵活的方式来满足特定需求而无需修改标准SAP交付内容。这种机制允许企业根据自己的特殊业务需求...
本教程将深入讲解如何查找 SAP 标准程序中的用户出口和 BADI 实现方法,帮助开发者更高效地进行系统扩展。 一、用户出口(User Exits) 1. **理解用户出口**:用户出口是 SAP 为开发者预留的特定代码段,允许在...
需要注意的是,在实现 BADI 时,我们需要遵守 SAP 的开发标准和命名惯例,以确保我们的 BADI 实现能够与标准系统集成。 使用 BADI 对 XD01/XD02/XD03 进行附加屏幕,字段的增强是一个非常有用的功能,它可以满足...
### SAP BADI 技术详解 #### 一、BADI技术概述 SAP BADI (Business Add-In) 技术是一种先进的ABAP对象技术,它为SAP系统提供了灵活的扩展性和可定制性。与传统的增强技术相比,BADI提供了一个更加结构化的方法来...
SAP增强BADI UserExit CustomerExit SAP增强BADI UserExit CustomerExit是SAP系统中的一种扩展机制,通过预留的Form/Subroutine,allowing开发者在系统中添加自己的逻辑。这种机制分为三种类型:User Exits、...
BADI(Business Add-In)是 SAP 提供的一种用户出口机制,允许用户在不修改 SAP 标准代码的情况下,实现自己的业务逻辑。BADI 的实现步骤可以分为两个部分:BADI 定义和在应用程序中调用 BADI。 BADI 定义 1. 使用...
### BADI作为SAP的第三代用户出口 #### BADI简介 在SAP系统中,BADI(Business Add-In)作为一种非常重要的扩展性机制被广泛应用于各个模块中。它为开发人员提供了一种灵活的方式来增强标准SAP应用的功能,而无需...
SAP ABAP BADI(Business Add-Ins)是SAP系统中一种用于扩展标准功能的机制,它允许开发者在不修改标准代码的情况下实现业务逻辑的定制化。BADI为开发者提供了一个灵活的方式来插入自定义代码,从而满足特定业务需求...
### SAP如何查找BADI 在SAP系统中,BADI(Business Add-In)是一种非常重要的扩展机制,允许用户自定义业务逻辑而不修改标准SAP代码。对于开发人员来说,了解如何快速有效地查找与特定事务代码或功能模块相关的BADI...
### SAP ABAP中的BADI与UserExit:查找与理解 #### 概述 在SAP ABAP编程领域,BADI(Business Add-In)与UserExit是两种常见的扩展点,允许客户自定义或增强标准SAP应用程序的功能。这些扩展点对于满足特定业务...
SAP Concur Integration - BADI Guide 是一个详细指导,旨在帮助用户理解和利用SAP的Business Add-Ins(BAdIs)来实现与Concur解决方案的集成。Concur是一款流行的差旅和费用管理软件,而SAP是全球领先的业务流程...