<small id="7ktuj"></small>
      <bdo id="7ktuj"></bdo>
        <mark id="7ktuj"></mark>

        <source id="7ktuj"></source>
        <small id="7ktuj"></small>

        ITPub博客

        首頁 > 應用開發 > IT綜合 > 昨日萬圣節ABAP怪獸級代碼謎團,公布答案啦

        昨日萬圣節ABAP怪獸級代碼謎團,公布答案啦

        原創 IT綜合 作者:i042416 時間:2019-11-07 08:34:18 0 刪除 編輯

        首先非常感謝大家在周末還抽出寶貴的時間耗在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的原創文章,請關注公眾號"汪子熙":


        來自 “ ITPUB博客 ” ,鏈接:http://www.ep4tq.com/24475491/viewspace-2662995/,如需轉載,請注明出處,否則將追究法律責任。

        請登錄后發表評論 登錄
        全部評論
        SAP成都研究院開發專家,SAP社區導師,SAP中國技術大使。

        注冊時間:2018-01-20

        • 博文量
          807
        • 訪問量
          337965
        妹子图每日分享