昨日萬聖節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的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2662995/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 「程式設計師小漫畫」 之 程式設計師眼中的聖誕節和萬聖節程式設計師
- flex聖盃佈局程式碼例項Flex
- 可怕的萬聖節 Linux 命令Linux
- 《機退怪獸》:小機甲火拼大怪獸的硬核塔防
- 聖戈班集團公佈2022年全年業績 重新整理紀錄
- 聖誕節快到啦!Mac電腦系統如何在聖誕節讓電腦螢幕下雪?Mac
- 前瞻打造超級「怪獸」,商湯想要馴服AI長尾AI
- 程式設計師的聖誕節--送她一顆聖誕樹(附原始碼)程式設計師原始碼
- 程式設計師的聖誕節–送她一顆聖誕樹(附原始碼)程式設計師原始碼
- 來啦!OceanBase DevCon • 2023議程公佈!dev
- 美團向騰訊配發1135.3萬股 昨日收漲3.44%
- 打爆怪獸 合成 遊戲變xian遊戲
- 《真·簡單》Golang 輕量級桌面程式 wails 庫(聖誕節限定)GolangAI
- t美團向騰訊配發1135.3萬股 昨日收漲3.44%
- 自動駕駛系統程式碼洩露,黑客公佈特斯拉 Semi Truck 細節自動駕駛黑客
- 啦啦啦啦員工工資合計程式碼
- Pocket Monsters口袋怪獸 演算法實現演算法
- 2代作品如何加質加量?這個志怪解謎團隊昇華了
- 魔獸戰場,萬人爭霸:《萬龍覺醒》公測開啟
- 神奇的C語言輸出12天聖誕節歌詞程式碼C語言
- NRF:2021年65%的美國人慶祝萬聖節
- 公佈上一次搜尋引擎的程式碼
- 專為訓練Llama 3,Meta 4.9萬張H100叢集細節公佈
- CSS佈局–聖盃佈局和雙飛翼佈局以及使用Flex實現聖盃佈局CSSFlex
- 2020聖誕節Steam同時線上人數突破2450萬人
- 對話準獨角獸簡道雲:低程式碼不是萬能的
- ChatGPT資料洩露,技術細節公佈ChatGPT
- abc153E 殺死怪獸所需的最少魔法
- 辦公室出租,升級企業辦公和佈局
- ABAP程式碼分析工具 - 事務碼SQF
- Morning Consult:58%的美國人不參與2020年萬聖節
- AntD 聖誕節彩蛋事件事件
- 【教師節特別活動】思否程式設計公開招募內容合夥人啦程式設計
- 聖盃佈局與雙飛翼佈局
- 雙飛翼佈局和聖盃佈局
- 聖盃佈局和雙飛翼佈局
- 能否將TopThink每次的程式碼或功能更新公佈出來?
- 效能“怪獸”:全新戴爾Precision 7875塔式工作站亮相