SAP ABAP 零碎里的规范实现,有时会发现上面这种代码:
IF 1 = 0.
而后把逻辑写在这个永远都不可能执行到的 IF 分支里。比方下图这个 SAP CRM 里的规范类 CL_CRM_MDG_BP_CRGRP:
我查看了一下,这个类创立于 2009 年。
这个写法有什么作用?
咱们把视线放宽阔一点,留神到这行 IF 语句的下一行,即是将 Message Class 音讯类 CRM_MDG_CORE 里编号为 034 的音讯,通过 add_message 办法,显示在 WebClient UI 界面上。
咱们应用事务码 SE91,定位到编号为 034 的这条音讯,点击工具栏的 Where Used List 按钮,想查问这条音讯到底被哪些 ABAP 类和程序所应用到:
从查问的后果来看,高深莫测。原来,针对 ABAP Message 进行的 Cross Reference 即 Where Used List 查问,只能检测到那些通过 MESSAGE 关键字抛出的音讯,即下图查问后果里这些包裹在 IF 1 = 0 分支里的 MESSAGE 语句。
然而,MESSAGE 一旦执行,在不同的执行上下文,抛出不同类型的音讯,其体现行为都有所差别。
因为咱们探讨的代码在 WebClient UI 运行环境下执行,显然不须要 MESSAGE 语句像在 SAPGUI 环境下,执行时弹出一个对话框,因而咱们将 MESSAGE e034(crm_mdg_core) 放在永远不可能进入的 IF 1 = 0 分支内,起到的作用是,让 ABAP Message Text 的 Cross Reference 即 Where Used List 性能,可能顺利捕捉到这条音讯的应用状况,同时又不让这段代码真的被执行。这算是一个非功能性编程的例子吧。
我过后把这个案例,发在了 SAP 社区上,引起了大家的热烈探讨。
有敌人给出了另一种代替计划,应用下列语句:
MESSAGE e034(crm_mdg_core) INTO lv_message.
这条语句将 CRM_MDG_CORE 里编号为 034 的文本内容,写入变量 lv_message 之中。尽管引入了一个随后基本不会被读取的变量 lv_message, 然而的确打消了会令有些人费解的 IF 1 = 0 分支。
ABAP Extended check 会对这种定义了变量但却又没有读取它的行为提出埋怨 (warning),但好在能够通过 Pragma ##NEEDED 来屏蔽。