Mendel:基於遺傳隱喻的源代碼推薦

Mendel:基於遺傳隱喻的源代碼推薦

1 引用

Angela Lozano and Andy Kellens and Kim Mens. Mendel: Source Code Recommendation based on a Genetic Metaphor. In Proceedings of the 26th IEEE/ACM International Conference on Automated Software Engineering, 2011, 384-387.

2 摘要

在開發軟件系統時,開發人員會花費大量時間來了解現有源代碼。為了成功實現新的行為或改變現有行為,開發人員需要回答以下問題:“我可以使用哪種類型和方法來解決此任務?”或“我的實現應遵循哪些特定的命名或結構約定?”。在本文中,我們介紹了 Mendel,這是一個源代碼推薦工具,可幫助開發人員回答此類問題。該工具根據開發人員當前瀏覽的實體,採用遺傳學啟發隱喻的方法來分析與當前工作環境相關的源代碼實體,並向其用戶提供許多當前正在處理的源代碼相關的建議的屬性(如命名約定,使用類型,調用消息等等)。在初步的驗證中我們的方法 Mendel 有一定的潛力。

3 技術介紹

諸如命名約定、編程習慣用語、代碼模板和設計模式這類的源代碼規則在提高程序的可理解性中起著重要的作用。開發人員通常會使用這類規則讓自己的代碼邏輯清晰、設計易於理解。例如,當實現代表各種用戶界面操作的類層次結構時,在該層次結構中所有類的名稱添加後綴“Action”是很常見的實現方式。

在本文中,我們提出了針對面向對象系統的名為 Mendel 的一種代碼助手算法。算法把開發人員當前正在處理的源代碼實體作為輸入,輸出是有關該實體可能缺少哪些特徵的建議。該算法假定以某種方式相關的源代碼實體(例如,按類層次結構)通常由相同的規則控制。如果特定源代碼實體中缺少其大多數親戚共有的特定特徵,則我們認為該特徵是一個候選推薦。Mendel 旨在通過分析源代碼實體與附近的源代碼實體之間的區別來檢測源代碼實體中的缺失特徵。我們的方法包括瞭如下所示的 5 個步驟。

3.1 檢索被分析實體的家族

作為算法的第一步,我們首先檢索與當前正在處理的實體 e 相關的源代碼實體集,得到家族成員集合 family(e)。我們假設可以基於緊密相關的源代碼實體提供有用的建議。由於我們分析了面向對象的系統,因此我們規定一個類的族包括同一層次結構中的所有類。可以通過獲取所選類的直接超類並返回所有該超類的直接子類以及這些直接子類的子類來表示這組家庭成員。此外,在確定類的家族時,要區分所分析的類是具體有限的還是抽象的。如果開發人員正在研究抽象類,那麼通過分析相關抽象類獲得的建議將比具體類的建議更具相關性。因此,我們將抽象類的族限制為也是抽象的類,而具體類的族將僅包含具體類。當所分析的類不屬於任何類層次結構時(直接從 Object 繼承),那麼其族為空。

方法族定義為該方法的實現類的族中所有具有相同簽名方法的集合。例如,圖 1 顯示了類 RemoveAction 的 performPerformance 方法族。在該圖中,所選實體的族成員以黑色顯示, performAction 方法的所有實現均被視為實體的家族成員。

Mendel:基於遺傳隱喻的源代碼推薦

圖 1. performAction 的家族成員

3.2 查找所分析的源代碼實體及其家族成員的性狀

我們算法的第二步包括確定所分析的源代碼實體 e 及其實體的家族成員的性狀 trait(e)。對於一個類,我們考慮以下屬性:1)組成類名稱的關鍵字。對於 ApplicationAction 類,則包含“Application”和“Action”;2)類的所有祖先;3)該類實現的所有方法的簽名;4)類引用的所有類型。對於方法,我們考慮以下屬性:1)方法的廣義分析樹,提供了方法結構的抽象表示;2)該方法使用的所有類型;3)從方法內部調用的所有方法的簽名;4)方法協議的分類表示;4)方法內部的所有父類調用。

如下圖 2 所示,展示了 RemoveAction.performAction 的家族成員 perfromAction 的性狀 trait(e)。

Mendel:基於遺傳隱喻的源代碼推薦

圖 2. performAction 的家族成員的性狀

3.3 查找家族中的顯性性狀

Mendel:基於遺傳隱喻的源代碼推薦

Mendel:基於遺傳隱喻的源代碼推薦

圖 3. performAction 的家族成員的顯性性狀

3.4 查找家族中的隱性性狀

Mendel:基於遺傳隱喻的源代碼推薦

對於一個類,如果至少有三分之二的家庭成員都認為該性狀是隱性的,則認為該性狀是隱性的。由於某個方法的家族成員的數量往往比一個類的家族成員少得多,因此,我們認為一種方法特性一旦被其中兩個方法的家族成員所共有,便是隱性的。如圖 4 所示為該實體 performActtion 方法的隱形性狀,其中 ActionStack 類型標識和調用方法 updateParent 和 add 符合隱形性狀的條件。

Mendel:基於遺傳隱喻的源代碼推薦

圖 3. performAction 的家族成員的隱形性狀

3.5 為所分析的源代碼實體提供建議性狀

建議性狀是指對所分析的源代碼實體提出的更改或添加的建議。如前所述,我們區分了兩種性狀:被分析實體應該表現出的性狀和實體可能想要表現出的性狀。

Mendel:基於遺傳隱喻的源代碼推薦

4 本文主要貢獻

本文作者提出了一種面向對象系統的名為 Mendel 的新穎代碼助手算法。作者察覺到用戶在編程過程中會遵守命名規範,設計規範,使用代碼模板的現象。基於此,作者開發了一個工具,它根據開發人員當前瀏覽的實體,採用遺傳學啟發隱喻的方法來分析與當前工作環境相關的源代碼實體,並向其用戶提供許多當前正在處理的源代碼相關的建議的屬性(命名約定,使用類型,調用消息等等)。

致謝

感謝國家重點研發計劃課題:基於協同編程現場的智能實時質量提升方法與技術(2018YFB1003901)和國家自然科學基金項目:基於可理解信息融合的人機協同移動應用測試研究(61802171)支持!

本文由南京大學軟件學院 2018 級碩士生門鐸翻譯轉述。


分享到:


相關文章: