zoukankan      html  css  js  c++  java
  • 昨日万圣节ABAP怪兽级代码谜团,公布答案啦

    首先非常感谢大家在周末还抽出宝贵的时间耗在Jerry昨天发布的文章 一段让人瑟瑟发抖的ABAP代码 上面。

    虽然Jerry在文末开玩笑的声称,只有文章阅读量上千或者评论数超过50,才公布答案。其实这只是Jerry的玩笑,因为正如Jerry在之前一篇文章 5000粉丝数达成,感谢大家一如既往的支持 里提到,在微信自媒体泛滥的今天,大家能够在众多公众号中关注汪子熙公众号,并抽出时间来阅读Jerry或一本正经或胡说八道的文字,Jerry真的很感激,谢谢大家。

    在分析ABAP代码谜题之前,Jerry还想讲一个故事。Jerry 2007年加入SAP成都研究院时,我老板的老板是E君,当时就已经是在SAP界打拼很多年的老江湖了。E君平时表情严肃的时候居多,做事雷厉风行,很有领导的范,包括Jerry在内的很多刚毕业入职的新人们都很害怕他(当然Jerry现在不怕了,哈哈)。

    2008年的时候,Jerry还是标准的ABAP菜鸟一枚,有一天学到了如何使用ABAP发送邮件给一个Distribution List,并任意指定邮件的SendTo字段。Jerry那时觉得这个技巧很酷(当时的确够菜的 -_-),正好当时我在开发一个工具,需要向整个团队的DL汇报进度。于是Jerry在用邮件汇报进度的时候,没有采用在Outlook里编写邮件然后发送的方式,而是写了一段ABAP代码,把邮件发送给了整个团队。很多同事收到邮件后,因为SendTo字段为空,所以不知道这封邮件是谁发的。当时Jerry觉得这很酷。

    后来E君把我叫到他的办公室谈工作上的事情时,特意提到了这封邮件,他说他不用猜都知道一定是我发的,然后问我为什么要这样做,听完我的解释之后,先说了句:“以后别这样。”然后给我分析了原因。从那以后,Jerry慢慢地开始懂得,作为一个SAP应用开发人员,再新再酷再吸引眼球的技术,如果不能为业务服务,不能为客户服务,那也make no sense at all.

    回到题目本身。这道题不过是用于万圣节搞怪消遣的产物罢了,相信没有任何ABAP开发顾问会在实际工作者去模仿这种风格来编码。

    Jerry给大家介绍这个谜题,目的不是在炫耀ABAP这门语言的一些奇技淫巧,而是觉得我们仍然可以从谜题本身找到一些积极的因素,比如借此弄清楚一些平时掌握得似是而非的ABAP语言特性。

    (1) 从评论区能看出,很多朋友都找到了谜题的突破口,即 NOT=>NOT( NOT ). 这是典型的ABAP类静态方法调用的语法,因此说明,在名为NOT的INCLUDE里,包含了一个名为NOT的ABAP类,有一个名为NOT的静态方法。同时,这个静态方法调用的前面出现了OR这个布尔逻辑运算符,只能有一种情况才能通过语法检查,就是NOT静态方法的输出参数为RETURNING类型,然后该输出参数作为OR的操作数。

    值得一提的是,很多其他编程语言都禁止使用关键字保留字来命名标识符或者类,而ABAP却没有这个限制,显得有点特立独行。

    (2) 也有朋友在评论区提到,代码可执行部分以IF开头,但是却没有以ENDIF结尾。唯一的解释,就是在NOT这个include里,声明了包含ENDIF语句的宏,并把宏的名称取名为NOT.

    (3) ABAP里感叹号的用法。

    ABAP帮助文档里说的很清楚,!作为ABAP里的转义字符,能够告诉ABAP编译器,!后面紧跟的并不是关键字,而是普通的ABAP标识符。

    给出的例子也很清晰,如果有人非要用CHANGING和USING作为形式参数的名称,只需要在前面加上感叹号即可。

    而如果感叹号后面跟的并不是真的ABAP关键字,而是普通的标识符,那又会如何呢?

    答案是,此时感叹号会直接被忽略。看下面的例子,加上感叹号的效果和不加一致。

    (4) 现在我们已经知道了,题目中的!NOT,暗示大家在NOT include里,还定义了一个名为NOT的变量。

    首先我们把谜题里迷惑人眼球的障眼法全部拿掉。

    在有NOT参与的ABAP逻辑判断语句里,出现偶数个NOT,相当于一个NOT也未出现过(类似负负得正的原理),出现奇数个NOT,只相当于出现一个NOT.

    所以题目中那多余的一系列NOT,就像《笑傲江湖》中衡山掌门莫大先生那套“衡山百变千幻云雾十三式”中的虚招一样,能让不明就里的对手眼花缭乱。

    人称“琴中藏剑,剑发琴音”的莫大,凭借这手如梦如幻的剑法,在衡山城外击杀了嵩山十三太保之一的“大嵩阳手”费彬。即使武功强如费彬,也没弄看透莫大剑法中的虚招。而亲爱的ABAP顾问们,这道谜团中重复的NOT虚招,大家看透了没?

    仔细观察代码中所有出现!NOT的地方,按照上述法则去除掉多余的NOT之后,能够提取出两个规律:

    a. !NOT 前面至少有一个IF,OR或者AND
    b. !NOT 后面直接结束,并未出现 IS INITIAL或者 > XXX, <> XXX等判断语句。

    什么样的ABAP变量类型允许这种操作呢?

    整型不行:

    字符串类型不行:

    而SELECTION-OPTIONS就可以。

    这个SELECTION-OPTIONS是ABAP古董级的功能了,在SAPGUI下做Dynpro开发的顾问们会经常用,而SAP Cloud Platform ABAP编程环境下已经不再支持了。

    上述四个语法点逐一突破后,如何编写NOT include的源码,思路也就清晰了。

    源代码如下:

    如果想复制粘贴这段代码,可以访问Jerry的github:

    https://github.com/i042416/KnowlegeRepository/blob/master/ABAP/backup/NOT.include.abap

    感谢阅读。

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  • 相关阅读:
    VC 常见问题百问
    python windows 环境变量
    Check server headers and verify HTTP Status Codes
    Where are the AES 256bit cipher suites? Please someone help
    outlook 如何预订会议和会议室
    安装Axis2的eclipse插件后,未出现界面
    windows 环境变量
    python 时间日期处理汇集
    openldap学习笔记(使用openldap2.3.32)
    set p4 environment in windows
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/11797131.html
Copyright © 2011-2022 走看看