前言:想要寫出一篇引人入勝的文章?我們特意為您整理了談軟件系統模塊間循環依賴識別范文,希望能給你帶來靈感和參考,敬請閱讀。
摘要:軟件系統中各平臺多模塊開發過程中,若開發人員對自己模塊扇入、扇出盲目增刪,導致模塊間依賴變更,容易產生系統級循環依賴。如果模塊間產生循環依賴環,代碼在編譯時若不清除中間生成文件,編譯生成的產品有極大的風險或者采用2次編譯的方法解決。通過進行循環依賴分析找出所有依賴環的解決辦法。
關鍵詞:循環依賴;非法依賴;多模塊;軟件工程;識別
引言
隨著當前軟件系統越來越復雜,平臺越來越多,平臺包含的模塊也越來越多,開發人員在開發代碼的時候如果對模塊的依賴未按照設計要求隨意增加,容易導致平臺級或系統級別產生循環依賴。賈利敏等提出通過程序執行軌跡,確定數據依賴結點、控制依賴結點和結點可到達語句來計算變量切片[1];不過此檢測方式粒度太細,不利于軟件模塊級識別。劉杰等提出基于歸納變量的循環依賴分析方法[2],識別變量級別的循環依賴;劉鵬遠等提出采用提取公共部分方法消除包級別循環依賴[3],若模塊粒度更細、數量更大的話,不易實現;丁麗麗等基于GCC5.1針對分支嵌套循環的依賴提出計算依賴距離方法能夠快速地分析出該類循環潛在的并行性[4],但此計算類似C語言某幾條語句循環依賴,不適用于系統內模塊查找循環依賴。
1依賴概述
在架構設計合理,各平臺的依賴關系應該是上層平臺依賴下層平臺,各模塊的扇入、扇出設計合理的前提下,整個系統所有模塊的依賴關系不應該存在循環依賴。正常情況下平臺或模塊間的依賴關系應該是上層平臺依賴下層平臺:①上層依賴下層。②上層對下層一對一或一對多。③最下層不對本平臺依賴,但可能會對下層級平臺有依賴。④最上層不會被本平臺依賴,但會被上層平臺依賴。⑤存在上層跨層依賴下層。⑥所有模塊都會被依賴。⑦所有模塊對外不重復。
2循環依賴分析與解決方案
2.1分析根因
由于平臺級的循環依賴根因也是由于各平臺對應的模塊產生的模塊級循環依賴導致,所以可以把平臺級循環依賴和模塊級循環依賴看作相同的問題。循環依賴的根因是縱向依賴鏈上出現了環:如A依賴B、B依賴C、C依賴A或D依賴E、E依賴F、F依賴G、G依賴D,這樣就出現依賴環,當然這個是比較簡單的環示例,在實際情況中,有的環路節點有很多個可以達到10多個模塊,如果靠人工計算,一是計算工作量比較大,另一個是容易遺漏。
2.1.1數學模型假設數學模型如下。1)假定我們當前有一個平臺(多個平臺檢測方法類似)。2)假定這一個平臺一共有n個模塊{M1,M2,M3,…,Mn}。3)第k個模塊扇入ik個。4)第k個模塊扇出ok個。
2.1.2計算方法1)把這n個模塊所有扇出o1,o2,o3,…,on合并起來,記為AllOutputList[]。2)把這n個模塊遍歷,扇入不在AllOutputList中的刪除,因為這些刪除的依賴是從其他平臺引入的依賴,此步處理完后,所有模塊的扇入只來源此平臺的扇出,這樣在后續計算時,減少冗余的計算。3)選擇任意模塊作為當前計算模塊,并檢查此模塊是否有扇入,如果有扇入則把所有扇入的父節點進行統計并去重,并把此模塊記錄到ParentsList數組,如某模塊一共有20個扇入,其中5個扇入來源于A模塊、10個扇入來源于B模塊、另外5個扇入來源于C模塊,則此模塊的Parents數據包含A、B、C三個模塊,此時Parents里存放A、B、C;如果沒有扇入,則不計算。4)遍歷Parents數組所有成員,如A,則先把A與Par-entsList中所有元素進行比較,檢查是否有重復,若有重復,則發現環,并打印環,然后出棧;若無重復,則把A模塊視為當前計算模塊,把A模塊進行壓棧,并返回到步驟3;等數組的第一個成員完成遍歷后,繼續搜索Parents第二個成員B,并返回到步驟3,把B模塊視作模塊1進行遞歸;如果沒有重復,則把A壓棧到ParentsList;并返回到步驟3,把A模塊視作模塊1進行遞歸,依此類推。5)在檢查的過程中如果發現當前計算模塊沒有扇入,則不計算,直接返回。通過不斷查詢數組中成員數據是否包含新模塊名,再對數組進行壓棧、出棧,再對比,這樣最終可遍歷到整個系統所有循環依賴環。經過3、4、5這3步能把所有模塊所有依賴環找出來。但還有另一個問題:多個依賴環有重復的情形,假設4個模塊依賴環為:A依賴B,B依賴C,C依賴D,D依賴A,則搜索出來的結果可能出現環的4種情況分別為:A,B,C,D;B,C,D,A;C,D,A,B;D,A,B,C。碰到這種情形需要對這幾種環進行去重操作,詳細處理辦法是把生成環的所有結點分別存放到二維數組以模塊名為單位排序后進行比較,如果相同,則表示環相同,反之則不相同。像首尾相同的模塊:[A—B—C—D—A],這樣的環取[A—B—C—D],此去重方法較簡單,不再贅述。
2.2測試數據來源
來源于XX產品XX平臺,測試模塊220個,扇入、扇出共計2000多個。
3實驗結果與分析
通過對數據進行計算后展示的結果如下(只展示部分數據,實際發現環個數72個)。從上述結果可以看出:①單模塊可能會存在于多個環。②可發現被其他多次循環依賴模塊。
4結語
本文通過把軟件系統中模塊名視為樹節點,通過深度遍歷優先算法進行查找模塊間依賴環,不斷對縱向依賴鏈進行先判斷再壓棧,若對下層無依賴則出棧,遞歸查詢所有依賴環,并且給出多種依賴環去重的方法,最終發現所有模塊所有依賴環。不過還有一個問題,當前方法查找出來的依賴環不具備給架構師詳細依賴接口的能力,需要在代碼實現的時候壓棧、出棧時把父子節點之間的接口關系也添加上,這個難度也不大,不再贅述。
參考文獻:
[1]賈利敏,張忠林.一種簡化依賴關系的動態程序切片算法[J].鄭州大學學報,2009,30(2):84-87.
[2]劉杰,曹琰,魏強,等.符號執行中的循環依賴分析方法[J].計算機工程,2012,38(22):24-33.
[3]劉鵬遠,鄧沌華,李祥.不同粒度循環依賴的消去方法[J].信息通信,2013(6):9-10.
[4]丁麗麗,李雁冰,張素平,等.分支嵌套循環的自動并行化研究[J].計算機科學,2017,44(5):14-52.
作者:任啟紅 黃輝 周鋒 王永亮 單位:三江學院計算機科學與工程學院