項目 | 內容 |
---|---|
本次做業所屬課程 | 2019BUAA軟件工程 |
本次做業要求 | 結對編程做業 |
我在本課程的目標 | 完成該完成的任務,加強團隊協做能力,熟悉軟件開發 |
本次做業的幫助 | 切身體會結對編程,深刻了解其優缺點,增強與他人合做能力 |
項目地址html
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 10 | 10 |
· Estimate | · 估計這個任務須要多少時間 | 10 | 10 |
Development | 開發 | 1480 | 2430 |
· Analysis | · 需求分析 (包括學習新技術) | 200 | 360 |
· Design Spec | · 生成設計文檔 | 60 | 60 |
· Design Review | · 設計複審 (和同事審覈設計文檔) | 20 | 10 |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 20 | 20 |
· Design | · 具體設計 | 360 | 480 |
· Coding | · 具體編碼 | 500 | 900 |
· Code Review | · 代碼複審 | 120 | 240 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 200 | 360 |
Reporting | 報告 | 110 | 130 |
· Test Report | · 測試報告 | 60 | 60 |
· Size Measurement | · 計算工做量 | 20 | 10 |
· Postmortem & Process Improvement Plan | · 過後總結, 並提出過程改進計劃 | 30 | 60 |
合計 | 1600 | 2570 |
即信息隱藏原則
David Parnas在1972年最先提出信息隱藏的觀點。他在其論文中指出:代碼模塊應該採用定義良好的接口來封裝,這些模塊的內部結構應該是程序員的私有財產,外部是不可見的。
參照此原則,在本次項目中,諸如咱們的input類中的屬性是私有的,全部的訪問都是經過成員函數來實現。git
接口設計有六大原則,即單一職責原則、裏式替換原則、依賴倒置原則、接口隔離原則、迪米特法則、開閉原則。本次項目的接口按照給定的要求實現,而且進行了封裝,各個函數的功能也比較單一,接口的實現基本符合上述原則。程序員
鬆耦合,即函數功能儘可能單一,儘可能避免修改底層函數,功能相近的函數,能夠設計兩個以上,不要爲了減小代碼量,把一個函數的功能設計太多。github
本次項目中,每一個類都有相應的職責,如input類用於處理輸入參數的處理,類的成員函數也有不一樣的功能,提取參數,返回屬性等。words類負責處理文件,提取單詞。保證了每一個模塊的功能獨立性。算法
本次項目中計算模塊用了面向對象類的方式進行封裝。計算模塊涉及到兩個類,結點類Node和計算和接口在Core類中。經過Core的接口,傳入接口規定的各種參數,構造單詞相應結點對象,將結點對象存起來,對其進行拓補排序和動態規劃計算。下面是幾個函數的關係。編程
算法的關鍵在於怎麼採用怎樣的數據結構來存儲數據。本次項目咱們用了26個vector來存儲構造的結點對象,每一個vector中的結點對象都是相同字母開頭的,並分別用一個二維數組和一位數組來存儲結點間的邊關係和相應字母開頭的結點的入度。根據拓補排序再對26個vector進行排序,並用排好的序列進行動態規劃求出最長鏈。對於有-r的狀況,咱們決定用枚舉的方式強行找出,可是還沒來得及實現。數組
獨到之處就在於用的數據結構不一樣,這種存儲方法能夠節省內存,不用爲每一個結點建一個相連的結點vector,而且使用二維數組表示兩類結點的邊關係更能容易判斷出有沒有環。數據結構
以前用的是每一個結點有一個vector來存儲與其相連的結點的形式來實現接口,這樣拓補排序的實現會相對較慢,採用上面第4點的結構進行接口實現的優化以後,性能獲得了改進,下面是改進以後的效能分析圖:函數
Design by Contract即契約編程,是設計軟件的一種方法。它規定軟件設計者應爲軟件組件定義正式,精確和可驗證的接口規範,這些規範擴展了具備前置條件,後置條件和不變量的抽象數據類型的普通定義。而Code Contract規定了接口的數據類型,接口執行以前的條件和接口執行以後的條件。oop
我認爲契約編程的好處是在於因爲契約的存在,至關於給代碼進行了嚴格的約束,必定程度上保證了代碼的功能。相對的缺點是比較繁瑣,增長工做量。
本次項目並未嚴格按照契約式編程規定前置條件,後置條件以及不變量,咱們是按照給定的接口格式和文件格式來實現
計算模塊的單元測試覆蓋率達到了93%,以下圖所示:
單元測試測試了正常狀況(前兩個)和異常狀況(後一個)。第一個測試的是get_chain_word的狀況,第二個測試的是get_chain_char的狀況,異常狀況測試了不存在-r參數時輸入有環的異常狀況。以下:
沒有-r參數時有環的異常狀況;設計目標是發現輸入中沒有-r參數進行「輸入文件中存在環」的提示並退出程序。
對於輸入文件不存在的異常狀況;設計目標是給出提示「Error opening file",並結束程序。
對於輸入中諸如同時出現-w -c的異常狀況,設計目標是給出提示「para error",並結束程序。
咱們只實現了命令行模塊。
本次項目專門設計了一個Input類來實現命令行輸入地處理,其中類中的屬性有is_w、is_c、is_r、filePath等,都是私有屬性,必須經過相應的成員函數訪問。主要用類中的spilt方法來分割各個參數。
spilt方法根據傳入的命令行參數,辨識出具體是那個參數,而且出現一次後進行標記,相同參數再出現則報錯,-w -c亦是如此。提取出相應參數後給相應屬性賦值。
咱們將計算模塊暴露出來兩個接口,命令行在處理完並構造出單詞表以後可使用這兩個接口和計算模塊進行鏈接。
static int gen_chain_word(char* words[], int len, char* result[], char head, char tail, bool enable_loop); // 計算最多單詞數量 static int gen_chain_char(char* words[], int len, char* result[], char head, char tail, bool enable_loop); // 計算最多字母數量
駕駛員和領航員,一個在寫代碼,一個在旁邊看
結對編程的好處
1. 多雙眼睛,少點 bug:兩人互相監督工做,能夠加強代碼和產品質量,並有效的減小 BUG
2. 互相學習編程技巧:在編程中,相互討論,能夠更快更有效地解決問題,互相請教對方,能夠獲得能力上的互補
3. 互相監督,不容易偷懶:兩我的一塊兒工做須要互相配合,若是想偷懶去幹別的,就會拖延工做進度
結對編程的壞處
1. 開發人員可能會在工做時交談一些與工做無關的事,分散注意力,形成效率低下
2. 須要高強度下編程時效率會低
成員的優缺點
成員 | 優勢 | 缺點 |
---|---|---|
曾林思 | 工做積極、 對算法進行改進、 更好地提出思路 | 不夠細心 |
張峻槐 | 細心、 對搭檔友好、 能提出不少好建議 | 對算法不敏感 |
見第2條