軟工結對第一次做業

[BUAA軟工]結對做業

本次做業所屬課程: 2019BUAA軟件工程
本次做業要求: 結對項目
我在本課程的目標: 熟悉結對合做,爲團隊合做打下基礎
本次做業的幫助:理解一個c++ 項目的開發歷程html

【1】[項目github]

https://github.com/butub1/WordList

Pre

【2】pre -1. PSP 表格

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 50 80
· Estimate · 估計這個任務須要多少時間 14天 14天
Development 開發 6天 9天
· Analysis · 需求分析 (包括學習新技術) 1天 0.7天
· Design Spec · 生成設計文檔 180 150
· Design Review · 設計複審 (和同事審覈設計文檔) 60 60
· Coding Standard · 代碼規範 (爲目前的開發制定合適的規範) 20 50
· Design · 具體設計 1天 1天
· Coding · 具體編碼 5天 5天
· Code Review · 代碼複審 1天 1.5天
· Test · 測試(自我測試,修改代碼,提交修改) 1天 1天
Reporting 報告 1天 1天
· Test Report · 測試報告 5小時 4小時
· Size Measurement · 計算工做量 1小時 1小時
· Postmortem & Process Improvement Plan · 過後總結, 並提出過程改進計劃 0.5天 0.5天
合計 14天 13天

【3】pre-2 學習接口設計

看教科書和其它資料中關於Information Hiding, Interface Design, Loose Coupling的章節,說明大家在結對編程中是如何利用這些方法對接口進行設計的前端

(1)Information Hiding:

        採用了Interface這個類來對數據進行封裝。

    (2)Interface Design
        接口的要求與做業一隻

(3)Loose Couplingc++

鬆耦合,與別的小組互換core、gui和test, 對方封裝得足夠好,調用起來就很是方便,咱們本身的模塊封裝性很差,技術上還須要提高。git

具體設計

1. Core模塊設計

【4】計算模塊接口的設計與實現過程。

設計包括代碼如何組織,好比會有幾個類,幾個函數,他們之間關係如何,關鍵函數是否須要畫出流程圖?說明你的算法的關鍵(沒必要列出源代碼),以及獨到之處
有三個類,word類負責保存單詞的基本屬性,wordlist類則負責保存單詞鏈,maxtrix的主要做用是用來計算相應的最長單詞鏈。計算最長單詞鏈的算法是用到了拓撲排序,首先將全部單詞中的沒有辦法和其它單詞練成鏈的單詞去除。而後構建鄰接矩陣。以後經過拓撲排序以及動態規劃找出最長的單詞鏈和最多字母的單詞鏈。github

【5】畫UML

2.首個版本性能測試

【6】計算模塊接口部分的性能改進。

記錄在改進計算模塊性能上所花費的時間,描述你改進的思路,並展現一張性能分析圖(由VS 2015/2017的性能分析工具自動生成),並展現你程序中消耗最大的函數
一開始我採用的算法是,再把全部的單詞進行拓撲排序以後,找出全部的鏈,而後對全部的鏈進行統計,找出其中最多字母的鏈。可是當單詞數多起來好比達到了9000個單詞以後速度特別慢。很長時間都跑不出來結果。
後來我修改了算法,再計算字母最多鏈的時候,引入了動態規劃算法,算出了起始點到終點的最長距離,而且記錄了其前驅節點。改進完畢以後速度快了不少,能夠正常跑完9000個無環的測試樣例。
算法

【7】看Design by Contract, Code Contract的內容:

http://en.wikipedia.org/wiki/Design_by_contract> http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx
描述這些作法的優缺點, 說明你是如何把它們融入結對做業中的
契約式設計的優勢在於可以明確每一個類的功能,以及類之間的聯繫。每一個類負責固定的幾個功能,而後將其結果供以後的類使用。這樣方便了代碼的測試,重構,由於每段代碼的「合同」都已經完整記錄。
在個人設計當中,好比個人一個函數爲topuSort,它可以將單詞鏈的圖全部的節點進行拓撲排序,而後將這個排序以後的列表返回出來。這個函數指望獲得一個圖,可以保證將其進行拓撲排序,而後將其結果維持而且返回出來。編程

3. 測試用例及結果

【8】計算模塊部分單元測試展現。

展現出項目部分單元測試代碼,並說明測試的函數,構造測試數據的思路。並將單元測試獲得的測試覆蓋率截圖,發表在博客中。要求整體覆蓋率到90%以上,不然單元測試部分視做無效。windows

用例:數組

TEST_METHOD(testWord)
        {   Word* w = new Word();
            w->setWordName("abc");
            w->setIndegree(0);
            w->setMaxLength(strlen("abc"));
            w->setSearched(true);
            w->setTopuLevel(3);
            Assert::AreEqual(w->getFirstAlp(), 'a');
            Assert::AreEqual(w->getLastAlp(), 'c');
            Assert::AreEqual(w->getWordLength(), 3);
            free(w);

結果:正確,構造這條數據驗證Word類的正常功能,這是整個程序中最小最基本的數據抽象封裝。ide

用例:

TEST_METHOD(testWordlist) 
        {   Wordlist *wl = new Wordlist();
            char* set[] = { "hello","on","next","take","err" };
            for (int i = 0; i < 5; i++) {
                wl->add(set[i]);
            }
            Assert::AreEqual(wl->getAlpNum(),18);
            Assert::AreEqual(wl->getFirstLetter(), 'h');
            Assert::AreEqual(wl->getLastLetter(), 'r');
            free(wl);
        }

結果:正確, 測試wordlist類的正常功能,這個類用來表示計算獲得的最長鏈

用例:

TEST_METHOD(testMaxtrix) {
            Maxtrix m //= new Maxtrix();
            char* set[] = { "hello","on","next","take","aaa" ,"abbc","dd" };
            char* result[] = { "hello","on","next","take" };
            for (int i = 0; i < 7; i++) {
                m->setWord(set[i], i);
            }
            m.deleteOutlier();
            m.initialMatrix();
            m.createMatrix();
            m.topuSort();
            m.findInMaxtrix();
            m.findMaxLengthChain();
            for (int i = 0; i < m->wordChain.wordNum; i++) {
                Assert::AreEqual(m->wordChain.wordList[i], result[i]);
            }
        }

結果1:錯誤,須要注意的問題是,在main.cpp中聲明瞭一個全局的Maxtrix對象matrix,可是Maxtrix.h中設定max_word_num = 10005;並且有一個屬性int maxtrix[max_word_num][max_word_num];做爲鄰接矩陣, 這麼大的二維數組放在全局空間是沒有問題的, 可是在測試的時候,聲明一個maxtrix是會爆棧的,Exception Code: C00000FD, 仍是用new 或者malloc來管理內存吧。

在默認狀況下,棧只能獲得1M大小的內存,全局靜態儲存能夠獲得2G,而在32位和64位下的堆則能夠獲得2G和無限內存(通常不會用到16T)。

結果2:

結果 StackTrace:  
        at strcpy_s<1000>() in c:\program files (x86)\windows kits\10\include\10.0.17763.0\ucrt\string.h:line 124
    at Wordlist::add() in c:\users\xxx\desktop\worldlist(4)\worldlist(4)\worldlist\worldlist\wordlist.cpp:line 11
    at Maxtrix::findMaxLengthChain() in c:\users\xxx\desktop\worldlist(4)\worldlist(4)\worldlist\worldlist\maxtrix.cpp:line 168
    at UnitTest1::UnitTest1::testMaxtrix() in c:\users\xxx\desktop\worldlist(4)\worldlist(4)\worldlist\unittest1\unittest1.cpp:line 59
結果 消息:  Invalid parameter detected in function common_tcscpy_s, minkernel\crts\ucrt\inc\corecrt_internal_string_templates.h line 81. Expression: (L"Buffer is too small" && 0)

用例:

TEST_METHOD(testMaxtrix) {
            Maxtrix* m = new Maxtrix();
            char* set[] = { "Algebra","Apple","Zoo","Elephant","Under","Fox",
                                "Dog","Moon","Leaf","Trick","Pseudopseudohypoparathyroidism" };
            char* result[] = { "Algebra","Apple","Elephant" };
            Assert::AreEqual(1, 1);
            for (int i = 0; i < 7; i++) {
                m->setWord(set[i], i);
            }
            m->deleteOutlier();
            m->initialMatrix();
            m->createMatrix();
            m->topuSort();
            m->findInMaxtrix();
            m->findDesignatedChain('a', 't', 2);
            for (int i = 0; i < m->wordChain.wordNum; i++) {
                Assert::AreEqual(m->wordChain.wordList[i], result[i]);
            }

結果:正確,測試固定頭尾的功能函數的正確性。

覆蓋率截圖

覆蓋率截圖

4.【9】異常處理

【9】計算模塊部分異常處理說明。

在博客中詳細介紹每種異常的設計目標。每種異常都要選擇一個單元測試樣例發佈在博客中,並指明錯誤對應的場景。

異常:
1,指令錯誤
2,不是-r的指令也出現了環
3,文件不存在
4,獲得的結果中只有一個單詞,沒法構成環

目標:
1,輸出Instruction error!
2,輸出There are one or more circles
3,輸出file is not existed!
4,輸出Only one word in the chain
單元測試樣例:
1,Wordlist.exe -h p -t z F:\VS2017\Worldlist\Debug\test.txt
2,Wordlist.exe -h p -t z -w F:\VS2017\Worldlist\Debug\test.txt,在test.txt裏頭出現了帶環的鏈
3,Wordlist.exe -h e -t t -c F:\VS2017\Worldlist\Debug\tet.txt
4,Wordlist.exe -h e -t t -c F:\VS2017\Worldlist\Debug\test.txt
此時test裏頭除了惟一一個以e開頭以t結尾的單詞以外沒有另外的單詞

在博客中詳細介紹界面模塊是如何設計的,並寫一些必要的代碼說明解釋實現過程。

gui使用QT實現,用qt creater這個ide來設計前端的界面,很是方便,能夠經過拖拉放置來構建組件,而代碼邏輯則能夠經過綁定槽來將clicked這種動做連接到這個組件對應的一個函數中去,在函數中寫組件須要的功能便可。

界面:

【11】界面模塊與計算模塊的對接。

詳細地描述UI模塊的設計與兩個模塊的對接,並在博客中截圖實現的功能。

這一部分沒能成功對接上,主要是生成dll後,在qt creater中導入dll失敗了不少次。最後反卻是嘗試結對解耦合時,改使用visual studio 2017 加上qt的插件,讓界面模塊能夠和計算模塊連接起來。

【12】描述結對的過程

提供非擺拍的兩人在討論的結對照片。

我以爲和個人夥伴一塊兒合做還算很愉快,你們都願意爲了完成項目而付出熱情和汗水,很棒的一次體驗。

6.鬆耦合

在博客中指明合做小組兩位同窗的學號,分析兩組不一樣的模塊合併以後出現的問題,爲什麼會出現這樣的問題,以及是如何根據反饋改進本身模塊的。

合做小組:牛雅哲16131059

本組GUI+對方的核心模塊Core

問題:核心Core的接口不一樣,合併須要修改一些邏輯,Core中自定義了參數類型和錯誤類型,接口爲se_errcode Calculate(const string& input_text, string& output_text, LongestWordChainType& longest_type, const char& head, const char& tail, bool enable_circle); 按照這個接口寫了一個版本,後來合做小組改爲做業要求的標準接口了int gen_chain_word(char* words[], int len, char* result[], char head, char tail, bool enable_loop)int gen_chain_char(char* words[], int len, char* result[], char head, char tail, bool enable_loop)

處理:修改GUI調用接口的邏輯,匹配核心Core的接口

結果:可以正常運行

7.【13】

【13】看教科書和其它參考書,網站中關於結對編程的章節,

例如:
http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html
說明結對編程的優勢和缺點。
結對的每個人的優勢和缺點在哪裏 (要列出至少三個優勢和一個缺點)。
結對編程的好處在於,兩我的在一塊兒開發,測試,兩人合做寫出的代碼質量取決於水平高的那我的。結對時處於不斷複審的過程,所以可以節省不少修改測試的時間。缺點在於兩我的的溝通和磨合須要較長的時間,若是不可以好好的溝通和反饋,結對編程反而會影響效率。在結對中,個人優勢在於善於溝通,思考全面,編碼風格較好,缺點在於算法能力較差,須要花費大量的時間在研究實現的算法上。個人同伴的優勢在於編碼能力強,測試時思考的很全面,善於學習新的東西,缺點在於溝通和反饋,有時候我不太能理解它所說的。總的來講咱們都很是願意爲共同的項目付出熱情和汗水,這是很是可貴的。

【14】在你實現完程序以後,在附錄提供的PSP表格記錄下你在程序的各個模塊上實際花費的時間。

實際時間見【2】。
相關文章
相關標籤/搜索