Jaein&&Lee結對項目程序員
合做編程剪影正則表達式
我=。=在實現功能模塊的封裝,而jaein 在進行UI的設計(^.^)算法
軟工這周的項目又告一段落啦~ 在此對個人Partner ---> jaein表示深深的感謝!感謝她在這一週的時間裏,督促我,理解我,同時也能包容我。express
結對編程收穫編程
結對編程收穫頗多,歸納起來有以下三點:ide
結對編程不足函數
結對編程的缺點主要是以下的一個方面:測試
在代碼風格不一樣這一問題互不相讓,發生矛盾,進而影響工做情緒。優化
隊友優勢編碼
隊友不足
她有時候會陷入莫名其妙的糾結當中,而在我看來這些糾結是徹底沒有必要的... (=.=)
設計方法
Information Hiding, interface design, loose coupling
Information Hiding這一設計思想體如今以下幾個方面:
Interface design主要體如今計算模塊與界面模塊的交互上面
考慮到效率的緣故,咱們的軟件核心的計算功能是用C實現的,而界面是用C#實現的,將核心的計算功能封裝成DLL,而且在界面模塊中調用相應的計算功能。針對這個項目設計了以下的6個接口:
interface design主要爲接口設計
各個接口含義以下:
loose coupling設計思想主要體如今界面模塊,測試模塊和核心模塊的鬆耦合。
結對編程方法
含義:
摘自維基百科。
優勢:
契約式編程在必定程度上減輕了編碼負擔和測試負擔,由於當使用契約編程時,程序員不須要對契約條件是否知足進行校驗,而是由代碼的調用者來保證前置條件的自動知足,而且只有在前置條件獲得知足的狀況下程序的執行纔是有意義的,而不知足前置條件代碼的執行狀況未知,這種未知不須要由程序員來定義。
不足:
當程序的調用者在調用的過程當中因爲偶然的失誤致使程序的前置條件沒能知足,這時程序頗有可能出現未定義的情況,好比死循環,或者崩潰的錯誤。
應用:
在這個項目中,須要實現契約編程的模塊是:表達式的計算模塊。
爲了保證前置條件獲得知足,在表達式計算模塊調用以前使用正則表達式對於輸入的合法性進行驗證。
Unit test
第一次測試發現代碼的覆蓋率爲78.35%,分析結果顯示generateExpression()的代碼覆蓋率較差,因爲TestGenerateExp()測試中只測試了生成一個表達式,可能形成代碼分支覆蓋不徹底,故而設置循環,隨機生成100000個表達式,測試代碼以下:
1 [TestMethod] 2 void TestGenerateExp() 3 { 4 for (int i = 0; i < 100000; i++) 5 { 6 generateExpression(); 7 } 8 };
改進的代碼覆蓋率以下圖:
第二次測試發現代碼的覆蓋率爲79.93%,個人心是崩潰的。。怎麼會這樣。。代碼覆蓋率竟然幾乎沒有提升?!難道是我打開VS的姿式不對?!仔細想想我使用setting()來設置隨機生成表達式的參數,在未設置的狀況下爲默認的,而在默認狀況下四則運算表達式的長度是3,長度有限,因此遍歷的可能性有侷限,setting()函數的參數以及含義寫在前面API中,第一個參數爲operatorNum,默認爲3,在這裏設置爲25。
1 [TestMethod] 2 void TestGenerateExp() 3 { 4 5 for (int i = 0; i < 100000; i++) 6 { 7 setting(25, 120, 150, 1, 1, 0, 1); 8 generateExpression(); 9 } 10 11 };
改進的代碼覆蓋率以下:
個人心獲得了些許的慰藉,果真代碼覆蓋率提升了很多。然而還不是特別理想,進一步考慮,generateExpression()中有許多參數的分支判斷,而使用setting(25, 120, 150, 1, 1, 0, 1)來設置參數限制了分支的執行種類,故而測試代碼改進爲以下:
1 [TestMethod] 2 void TestGenerateExp() 3 { 4 srand((unsigned)time(NULL)); 5 for (int i = 0; i < 100000; i++) 6 { 7 setting(rand() % 20 + 1, rand() % 20 + 1, rand() % 20 + 1, rand() % 2, rand() % 2, rand() % 2, rand() % 2); 8 generateExpression(); 9 } 10 11 };
改進的代碼覆蓋率以下:
代碼覆蓋率提升到了91.15%,較爲滿意,然而generateExpression()仍是存在有未覆蓋到的代碼,還能夠繼續優化.......
UML圖
因爲用C實現的基本功能,不存在類的概念,對於dll僅生成的相應的代碼函數關係圖以下:
界面的UML序列圖以下:
界面的代碼函數關係圖以下:
算法核心
針對計算功能,首先根據正則表達式來過濾不合法的輸入狀況,而後經過接口調用C實現的計算模塊。計算模塊的實現主要是將兩個數統一轉換爲分子/分母的形式,再進行運算。