溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

發(fā)布時(shí)間:2020-08-10 11:59:38 來(lái)源:ITPUB博客 閱讀:193 作者:i042416 欄目:編程語(yǔ)言

最近有粉絲在后臺(tái)給我留言,說(shuō)新知識(shí)太多,“學(xué)不動(dòng)了”。所謂溫故而知新,今天我們就來(lái)重溫下ABAP里的Code Inspector的用法。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

2015年6月,我在SAP社區(qū)上寫了一篇博客,介紹了ABAP Code Inspector里一些大家不常用的功能,在2016年SAP社區(qū)改版,所有文章閱讀量清零之后,到現(xiàn)在仍然有17000多的點(diǎn)擊量。

https://blogs.sap.com/2015/06/15/useful-tips-regarding-abap-code-inspector-that-you-may-not-know/

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

本文是Jerry英文博客翻譯成中文的濃縮版,并且假定讀者都知道如何使用SCI這個(gè)事務(wù)碼。對(duì)ABAP Code Inspector還不熟悉的朋友,可以查閱我另一篇講述其用法的博客:

A Small tip to get all transparent tables used in ABAP code

我們可以在ABAP Code Inspector的檢查變體(Check Variant)里,根據(jù)自己的需要靈活地選擇對(duì)ABAP代碼進(jìn)行哪種類型的掃描動(dòng)作。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

下圖是一個(gè)例子,意思是對(duì)ABAP代碼中所有對(duì)數(shù)據(jù)庫(kù)表產(chǎn)生了讀寫訪問(wèn)之處,進(jìn)行"Table Names from SELECT Statements"的掃描。該掃描的具體行為,可以點(diǎn)擊藍(lán)底白色的感嘆號(hào)圖片,以獲得幫助文檔。下圖這個(gè)例子里勾取的選項(xiàng),意思是檢查被訪問(wèn)的數(shù)據(jù)庫(kù)表,在SE11的ABAP字段里的Technical Settings是否正確被維護(hù)了,比如表的緩存類型是否設(shè)置正確。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

Performance Check

Select-Statement can be transformed. X% of fields used - 檢查內(nèi)表字段的使用率

假設(shè)我們使用SELECT * 從一張表里讀取數(shù)據(jù)到ABAP內(nèi)表,然后在后續(xù)代碼中只使用到了A個(gè)字段,而讀取的表在SE11里總共有B個(gè)字段,那么A除以B的結(jié)果越小,說(shuō)明讀出來(lái)的內(nèi)表字段使用率越低。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

也就是說(shuō),你或許該考慮只SELECT真正需要的字段來(lái)替代SELECT *? 只需要在上圖設(shè)置里維護(hù)一個(gè)最低閥值,當(dāng)Code Inspector掃描代碼時(shí),一旦檢測(cè)到使用率低于維護(hù)的閥值就會(huì)報(bào)錯(cuò)。上圖的20意思是20%.

Search DB Operations in loops across modularization units

Jerry 2007年剛加入SAP開(kāi)始學(xué)習(xí)ABAP編程時(shí),前輩們就告誡過(guò)我,不要在LOOP里使用SELECT語(yǔ)句,這樣會(huì)極大影響代碼的性能。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

上圖是通過(guò)Code Inspector掃描出來(lái)的一個(gè)例子,在雙重LOOP循環(huán)里使用SELECT讀取數(shù)據(jù)庫(kù)表CRMD_DPP_HI_BLCK.

Nested Loops - 嵌套循環(huán)的檢測(cè)

盡管當(dāng)應(yīng)用代碼里嵌套循環(huán)的循環(huán)次數(shù)不大時(shí),對(duì)代碼運(yùn)行的絕對(duì)時(shí)間沒(méi)有太大影響——然而編寫具有至少指數(shù)級(jí)時(shí)間復(fù)雜度的代碼,在任何上下文里都不是一個(gè)好的編程習(xí)慣。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

這個(gè)設(shè)置能夠幫助我們快速找到所有的嵌套循環(huán)。

Copy current table row for LOOP AT

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

找出所有LOOP AT ... INTO之處,理論上這些地方都可以用LOOP AT ... REFERENCE INTO或者ASSIGNING <fs>替換。當(dāng)內(nèi)表的行結(jié)構(gòu)體字段很多時(shí),使用后兩種方式可以獲得一些性能的提升。

Low-Perform. Parameter Transfers - 檢測(cè)所有參數(shù)傳遞使用"Pass by Value"之處

Jerry關(guān)注了很多技術(shù)公眾號(hào),發(fā)現(xiàn)參數(shù)傳遞的"傳引用"和"傳值"這兩種方式的辨析,至今仍然是很多互聯(lián)網(wǎng)公司的面試題之一。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

這個(gè)選項(xiàng)可以讓您指定針對(duì)何種類型的參數(shù)進(jìn)行參數(shù)傳遞方式的掃描:

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

在ABAP里理論上采用引用傳遞的方式進(jìn)行參數(shù)傳遞,性能上總是優(yōu)于值傳遞,具體性能會(huì)提高多少,依賴于具體傳遞的參數(shù)類型,無(wú)法一概而論。

Security Check – Dynamic and Client-Specific accesses in SELECT - 動(dòng)態(tài)SQL語(yǔ)句的檢測(cè)

符合下列范式的動(dòng)態(tài)SQL會(huì)被掃描出來(lái):

Dynamic table accesses: SELECT * FROM (dbtab) WHERE …
Dynamic WHERE conditions: SELECT * FROM dbtab WHERE (where_cond)
Accesses to certain tables: SELECT * FROM dbtab WHERE …
Client-specific accesses: SELECT * FROM dbtab FROM WA … CLIENT SPECIFIED …

這個(gè)選項(xiàng)并不是禁止您使用動(dòng)態(tài)SQL語(yǔ)句——事實(shí)上SAP應(yīng)用的持久層里有大量的動(dòng)態(tài)SQL語(yǔ)句的使用例子——而是提醒您別忘記了進(jìn)行SQL注入的預(yù)防措施:一旦掃描出來(lái),如果有用戶輸入?yún)⑴c了這些動(dòng)態(tài)SQL語(yǔ)句的拼接,那就別忘記看看上下文有沒(méi)有使用CL_ABAP_DYN_PRG對(duì)用戶輸入進(jìn)行處理。

Search for APPEND and INSERT … INDEX in SORTED Tables

檢測(cè)所有在有序內(nèi)表上施加了APPEND操作的地方。有了這個(gè)掃描選項(xiàng),能夠幫助您避免下圖第13行這種類型的運(yùn)行時(shí)錯(cuò)誤。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

Check of SY-SUBRC Handing - ABAP關(guān)鍵字調(diào)用后系統(tǒng)變量sy-subrc的檢測(cè)

Jerry至今仍清楚地記得,十多年前上研究生課程《UNIX環(huán)境高級(jí)編程》時(shí),老師不斷地強(qiáng)調(diào)在進(jìn)行系統(tǒng)調(diào)用之后一定要檢查返回值并進(jìn)行相應(yīng)的錯(cuò)誤處理。在Jerry看來(lái),錯(cuò)誤檢測(cè)和處理是每一位編程人員都應(yīng)該具備的基本素養(yǎng)。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

對(duì)應(yīng)到ABAP里,就意味著每次調(diào)用ABAP的關(guān)鍵字完成某項(xiàng)操作后,都必須檢查sy-subrc的值來(lái)確認(rèn)這次操作是否成功。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

當(dāng)然也可以根據(jù)項(xiàng)目的實(shí)際情況,告訴Code Inspector只檢查某些類型的ABAP關(guān)鍵字調(diào)用。比如上圖意思就是只檢查READ TABLE關(guān)鍵字調(diào)用后是否進(jìn)行了sy-subrc的檢查。

Missing table content check before calling SELECT … FOR ALL ENTRIES IN

在使用FOR ALL ENTRIES IN <itab>之前,必須先檢查內(nèi)表itab是否為空。這個(gè)選項(xiàng)能掃描出沒(méi)有按照這個(gè)規(guī)范來(lái)編寫的代碼。

Programming Conventions - Naming conventions

在這個(gè)界面里為ABAP里不同類型的變量設(shè)置好您團(tuán)隊(duì)里達(dá)成一致的命名規(guī)范,然后Code Inspector就能把代碼里所有違反了這些命名規(guī)范的地方掃描出來(lái)。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?
ABAP Code Inspector那些隱藏的功能,您都知道嗎?

Metrics and Statistics

這個(gè)檢查類別下面的設(shè)置都是一些很有意思的統(tǒng)計(jì)信息。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

還是舉例說(shuō)明。下圖紅色區(qū)域的設(shè)置,意思是如果一個(gè)類的方法內(nèi)的可執(zhí)行語(yǔ)句行數(shù)超過(guò)150行,Code Inspector就報(bào)一條警告消息。這是為了避免大家寫出一個(gè)過(guò)于冗長(zhǎng)的方法。

而藍(lán)色區(qū)域的設(shè)置是如果每100行可執(zhí)行代碼的對(duì)應(yīng)注釋量小于10行,就報(bào)一條警告消息。這些閥值可以根據(jù)實(shí)際情況自行修改或關(guān)閉。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

FAN-OUT Structural Metrics - 統(tǒng)計(jì)一個(gè)方法的扇出值

方法的扇入值和扇出值在模塊化編程的上下文會(huì)經(jīng)常被提及,這對(duì)概念不是編程界首創(chuàng)的,而是源自半導(dǎo)體行業(yè)里的邏輯電路設(shè)計(jì):

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

邏輯門的扇出系數(shù)定義了該門能夠驅(qū)動(dòng)的數(shù)字信號(hào)輸入的最大量,而一個(gè)代碼模塊的扇出值則代表了其直屬下層的模塊個(gè)數(shù)。

這個(gè)選項(xiàng)能夠統(tǒng)計(jì)您方法的扇出系數(shù)。扇出系數(shù)太小,意味著該方法基本沒(méi)有調(diào)用其他下層的函數(shù),這有兩種可能:

  1. 該方法的邏輯本身非常簡(jiǎn)單,只有兩三行代碼,比如類的setter/getter方法;
  2. 這個(gè)方法的模塊化沒(méi)有做好,存在優(yōu)化的空間,比如某些直接寫在方法內(nèi)的語(yǔ)句,可以提煉成下層函數(shù)并在方法內(nèi)調(diào)用。

Comment Language Metrics

這個(gè)選項(xiàng)可以統(tǒng)計(jì)代碼中出現(xiàn)的德文注釋的函數(shù)。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

Jerry不太明白該選項(xiàng)有什么用處,給非德國(guó)ABAP開(kāi)發(fā)人員吐槽用的么?

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

OO Size Metrics

這個(gè)選項(xiàng)也是為了防止您不經(jīng)意間就創(chuàng)造出怪獸級(jí)的類(monster class)而生的:一旦您關(guān)注的類的屬性超過(guò)設(shè)置的閥值,比如類的成員,類的公/私有方法等關(guān)注點(diǎn)超過(guò)選項(xiàng)里設(shè)置的值時(shí),Code Inspector就會(huì)報(bào)警。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

Program Complexity Test – cyclomatic complexity - 代碼環(huán)復(fù)雜度(圈復(fù)雜度)的測(cè)試?yán)?/h3>

這又是一個(gè)能幫助您寫出Clean ABAP code的強(qiáng)大工具。

什么是代碼的環(huán)復(fù)雜度?

根據(jù)維基百科的定義,我們把一段代碼的執(zhí)行流畫成一張有向無(wú)環(huán)圖,然后環(huán)復(fù)雜度可以通過(guò)下面的公式計(jì)算出來(lái):

https://en.wikipedia.org/wiki/Cyclomatic_complexity

環(huán)復(fù)雜度 = 圖的邊數(shù) - 圖的節(jié)點(diǎn)數(shù) + 2

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

這其實(shí)就是我們研究生專業(yè)課《圖論》里學(xué)的歐拉定理。

看下面這個(gè)例子:

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

上面這8行ABAP代碼,環(huán)復(fù)雜度為3,怎么計(jì)算出來(lái)的?

先把其對(duì)應(yīng)的有向無(wú)環(huán)圖畫出來(lái):

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

這張圖的邊數(shù)為3,即圖中黑色,紅色和綠色三條粗線。
這張圖的頂點(diǎn)數(shù)為2,如圖中兩個(gè)菱形的藍(lán)色圖例所示。

最后環(huán)復(fù)雜度為3 – 2 + 2 = 3.

統(tǒng)計(jì)表明,代碼的高環(huán)復(fù)雜度和高故障率之間存在很強(qiáng)的正相關(guān)性,這不難理解,代碼的環(huán)復(fù)雜度越高,意味著里面嵌套的IF-ELSE,SWITCH等邏輯越多,無(wú)論是代碼原來(lái)的開(kāi)發(fā)人員,還是后來(lái)接手的維護(hù)人員,讀起來(lái)都會(huì)覺(jué)得頭昏腦脹。

因此大家可以多用ABAP Code Inspector的這個(gè)掃描選項(xiàng),隨時(shí)監(jiān)控您代碼的環(huán)復(fù)雜度。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

Search DB Operations

把您關(guān)注的在代碼中出現(xiàn)的SQL操作關(guān)鍵字全部羅列出來(lái)。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

Search ABAP Statement Patterns

這個(gè)選項(xiàng)也很有用,能根據(jù)您指定的正則表達(dá)式掃描ABAP代碼。

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

例如,您希望找出代碼里所有出現(xiàn)了READ TABLE XXX WITH KEY X = X的地方,只需要在上圖的輸入框里填入對(duì)應(yīng)的正則表達(dá)式,即用*代表任意字符串:
READ TABLE * WITH KEY * = *

然后ABAP Code Inspector就會(huì)按照我們期望的行為去掃描代碼:

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

ABAP報(bào)表RS_ABAP_SOURCE_SCAN也能實(shí)現(xiàn)完全一致的功能:

ABAP Code Inspector那些隱藏的功能,您都知道嗎?

ABAP Code Inspector的隱藏功能就介紹到這里,希望大家能夠好好利用它們,提高您的工作效率和代碼質(zhì)量,感謝閱讀。

要獲取更多Jerry的原創(chuàng)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙":

ABAP Code Inspector那些隱藏的功能,您都知道嗎?
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI