對於 Java 從業人員來説,無論是剛入門的新手還是專家,肯定都正在或者曾經使用過 Eclipse,這是一款優秀的編寫 Java 程序的 IDE.
然而可能大多數 Java 開發人員都沒有意識到,Eclipse 同時也能用來進行另一款在企業管理軟件開發領域大名鼎鼎的編程語言的開發工作,這門語言就是 ABAP.
在 2022 年 3 月最新的 TIOBE 編程語言排行榜上,Python, C 和 Java 分列前三甲,而 ABAP 位列第 42 名。
ABAP 之前的兩門語言,分別是同樣出自豪門微軟的 Powershell 和 TypeScript.
而 ABAP 這門編程語言,是企業管理軟件巨頭,德國最大的軟件公司 SAP 使用的開發語言,其旗艦級產品 S/4HANA 和曾經成為 ERP 軟件領域代名詞的 R/3,都基於 ABAP 開發而成。
在 SAP 公司創始之初,ABAP 程序的編寫工具是 SAP GUI,一個界面古樸的 IDE,如下圖所示:
SAPGUI 這款 IDE 的頁面佈局設計,乍一看有點像現在的 Visual Studio Code,但 SAPGUI 誕生於 1992 年,可以説是 Visual Studio Code 的前輩了。
那麼為什麼 SAP 有了 SAPGUI 之後,還會選擇將 Eclipse 改造成 ABAP 的另一款開發工具呢?這就是本文要闡述的內容。
SAP 在 Eclipse 框架的基礎上,開發出了一系列專門用於 ABAP 開發的插件。這一經過改造後的 Eclipse,有了一個新的名稱:ABAP Development Tools for SAP Netweaver,在 SAP 官方文檔裏經常簡寫為 ADT. 為了便於 Java 程序員閲讀,本文餘下部分中提到的 Eclipse,如無特殊説明,均代表 ADT.
下圖是在 ADT 裏點擊 Help -> About 之後彈出的該 Eclipse 的版本號。
本文餘下的部分從下列幾個方面向大家介紹,經過 SAP 改造之後的 Eclipse(ADT),為何能成為企業管理軟件領域的 ABAP 應用開發利器。
1. ADT的工作原理
很多從 Eclipse 做 Java 開發的朋友轉到 ADT 後,最大的不習慣就是 ADT 沒辦法離線使用。即使是用 SAP 雲平台 Neo 編程環境裏的 SDK,開發人員也可以在本地完成開發後,使用命令行或者 Eclipse Run As 菜單將其發佈到 SAP 雲平台上。然而這種用法對於 ADT 來説行不通,因為後者仍然是一個 Client / Server模式中的 Client 端。從本質上講,在開發 ABAP 時,Eclipse 和 SAP GUI 的區別,僅僅體現在對 Netweaver 服務器上開發資源的展示和操作方式有所差異罷了。
正因為這種 C/S 架構,每次我們在 ADT 裏操作 Netweaver 上的 ABAP 資源時,比如編輯一個 ABAP 類並保存,實際上都是通過消費 ABAP 後台暴露出的 Restful API 來完成的。
這種 Restful API 的消費行為可以通過打開 ADT 裏的 ABAP Communication Log 視圖來觀察。點擊 Start logging 按鈕:
在源代碼裏隨便做一些改動,比如增加一個空行,能觀察到這個修改動作觸發了很多到 ABAP 後台的 HTTP 請求:
如果想自己調試這些後台操作的具體實現,用 SAP GUI 登錄 ABAP 後台,使用事務碼SICF找到節點/sap/bc/adt:
在節點處理類的方法 HANDLE_REQUEST 裏設置斷點即可調試:
HTTP 請求發送到後台之後,上述方法會調用一個統一的入口函數 SADT_REST_RFC_ENDPOINT, 該函數和 ADT 後台框架其他處理邏輯的交互如下圖所示:
在 ADT 裏對 ABAP 源代碼做語法檢查,實際上就是把整段代碼做一個 Base64 編碼,然後通過 HTTP Post 發送到後台,由後台執行對應的檢查函數,結果通過 HTTP 響應返回給 ADT 前端。
相應的,如果對ADT的前台 Java 代碼感興趣,請移步 ADT 安裝目錄下的 plugins 文件夾,把裏面的 jar 包反編譯出來閲讀源代碼即可。
2. SAP GUI 和 ADT的 關係
一言以蔽之:二者互為補充。
一方面,對於S/4HANA很多新功能的開發,比如 CDS view 和 AMDP(ABAP Managed Database Procedure), 開發人員沒有選擇的餘地,必須使用 ADT,因為 SAP GUI 不支持這些新功能的開發。
比如在 SAP GUI 裏即使想瀏覽 CDS view 的內容也不行,會收到提示:
Please use the ADT Tools in Eclipse to process DDL sources.
而 AMDP,就是一個特殊的 ABAP 類,能夠在 ABAP 方法裏執行 HANA 的SQLScript 或者存儲過程。
SAP GUI 裏可以查看 AMDP 的源代碼,但是沒法做開發。試圖在 SAP GUI 裏進行編輯時,會遇到上面的提示信息:
Class XX contains stored procedures which cannot be changed in SAP GUI
反之,SAP GUI 裏一些比較傳統的開發,ADT 也是不支持的。舉一些例子。
傳統 Dynpro 程序的 Screen 開發,雙擊 Screen number,就可以通過點擊Layout 按鈕打開 Screen Painter,然後進行所見即所得的 Screen 佈局開發:
然而如果在ADT裏試圖編輯這個Screen會發生什麼事?
ADT 會打開一個新的標籤頁,裏面顯示一個嵌入的 SAP GUI 窗口,像 Screen Painter 和其他一些傳統的 ABAP 開發,均在這個嵌入的 SAP GUI 裏進行。
使用 SAP GUI 做開發的 ABAP 顧問,應該明白這三個 session 的區別:
- User Session
- ABAP Session
- Internal Session
我們每次用 SAP GUI 登錄一個系統,都會產生一個新的 User Session,每個User Session 裏用 /o 打開一個新的事務碼,則是在該 User Session 裏開啓了一個新的 ABAP Session.
一個 User Session 默認能打開最多 6 個 ABAP Session,可以通過修改系統參數把最大數目擴充為 16 個。
那麼 ADT 裏打開的嵌有 SAP GUI 窗口的標籤頁,背後啓動的 Session 類型是什麼?答案是 User Session.
下圖是 ADT 裏打開的兩個標籤和其對應的兩個 User Session,用不同顏色來區分。
3. ADT 和 SAP GUI 相比的一些獨到之處
既然是一個基於Eclipse的IDE,ADT 和 SAP GUI 相比還是存在一些獨到之處。
第一,由於 ADT 是基於 Eclipse 這個較之 SAP GUI 來説更加現代的 IDE,從使用習慣上來説更貼近 Java/C++ 程序員。
以 ABAP 類為例,各個維度的信息在 ADT 裏能在一個屏幕裏同時顯示,在 SAP GUI 裏一個屏幕顯示的信息維度很單一。
如果想看其他維度信息,只有通過雙擊的方式跳轉,查看完畢後通過回退鍵回到正在工作的界面。
又比如所有添加了關注的系統的 ST22 信息能在一個地方統一監控了:
第二,ADT 提供了很多代碼重構的嚮導(Assistant), Java 和 C++ 的開發人員對這些類的重構功能一定不會陌生。
一些常用的代碼重構功能如下:
- Delete unused variables:
快速刪除一個方法裏所有定義了但未使用的局部變量,這個功能很實用,SAP GUI 不支持。
- Extract Methods: 如果一段代碼反覆出現,可以考慮用重構技術裏的方法提取,將其封裝成一個方法。
當然還在使用 SAP GUI 的開發人員要使用 ABAP 重構嚮導也是可以的, 根據SAP GUI 版本的不同, 入口也稍有差異。
在 SAP GUI 740 版本里,重構嚮導通過 Utilities 菜單進入。
740 之前的版本,重構嚮導的打開方式大同小異:
第三,對 SAP GUI 一些常用功能的原生支持。
所謂原生支持,指用 Eclipse 原生的頁面來提供以前在 SAP GUI 裏實現的功能。
對 ABAP 開發顧問來説,幾乎每天都要在 SAP GUI 進行的操作就是 ABAP 類和報表的調試。
有的以前從事 Java 開發的朋友們轉到 SAP GUI 後,剛上手時使用 SAP GUI 的調試器總覺得很彆扭。一旦使用 ADT 的調試器,熟悉的味道又回來了。在 ADT裏調試 ABAP 和 Eclipse 裏調試 Java 程序的方式完全一致。
SAP GUI 裏的單元測試和分支/語句執行覆蓋率:
ADT 裏也提供了單元測試和各種覆蓋率審查的原生支持:
SAP GUI 裏的事務碼 SAT 在 ADT 裏的原生支持:
使用方式和 SAP GUI 裏的沒有差別。
第四,方便的SQL console功能。
以前在 SAP GUI 裏時,有時出於測試目的想寫些簡單的 SQL 語言做些驗證,還得創建一個報表然後在報表裏書寫。在 ADT 裏,直接使用 SQL console 就可省去不必要的報表創建:
第五,改進的代碼版本比較功能。
有些朋友反映 SAP GUI 裏自帶的代碼比較工具不是很好用:
如今在 ADT 裏,ABAP 開發人員終於可以像 Java 程序員一樣,享受 Eclipse 提供的便利的代碼版本比較功能了:
4. ADT 其他一些值得一提的小功能
- ADT Link
比如任何一個在 ADT 裏能夠查看的資源,都有一個所謂的 ADT Link,通過菜單 Share Link 查看:
這種Link格式如下:
adt://AG3/sap/bc/adt/vit/wb/object_type/tabldt/object_name/ZORDER
通過 Open ADT Link 菜單,輸入上述 ADT Link,能直接打開對應的資源,而不需要像 SAP GUI 那樣,需要先運行正確的事務碼,進入事務碼之後再打開資源。
- 自定義編輯器顏色
如何才能讓自己使用的 IDE 和其他程序猿相比顯得與眾不同呢?一個辦法是個性化字體和背景色。比如字體必須用程序猿專用的等寬開源字體 Inconsolata:
SAP GUI 的顏色個性化設置稍顯麻煩,需要一項項手動設置。而 ADT 因為是基於 Eclipse,所以主題的個性化就容易多了。如果覺得下面的 dark 主題還不夠酷,
安裝一個名叫 Eclipse Color Theme 的插件,就可以使用這個插件預置好的幾十套主題,真正做到一年 54 周每週換一套 Theme 了。
總結
作為一個擁有 14 年 ABAP 開發經驗的老程序員,在筆者心中 SAP GUI 和 Eclipse 都是優秀的 ABAP IDE,各有其長處和適應場合。本文通過逐一將 SAP GUI 和 ADT 提供的開發特性做橫向比較,希望能夠幫助開發人員感知到這些年的集成開發環境自身隨時代發展而持續演進,提高,不斷改善開發人員使用體驗的發展方向。
祝每一位 ABAP 開發人員都能愉快地使用 SAP GUI 和 ADT,做到得心應手。感謝閲讀。