項目 | 內容 |
---|---|
課程 | 軟件工程(羅傑) |
做業要求 | 結對項目-單詞最長鏈 |
本次做業的目的 | 體驗結對編程 |
本次做業對個人鍛鍊 | 熟悉結對編程,瞭解結對編程的優勢和缺點 |
項目github地址 | 項目地址 |
項目地址git
PSP | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 60(1h) | |
· Estimate | · 估計這個任務須要多少時間 | 60(1h) | |
Development | 開發 | 1500(25h) | |
· Analysis | · 需求分析 (包括學習新技術) | 120(2h) | |
· Design Spec | · 生成設計文檔 | 120(2h) | |
· Design Review | · 設計複審 (和同事審覈設計文檔) | 60(1h) | |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 60(1h) | |
· Design | · 具體設計 | 120(2h) | |
· Coding | · 具體編碼 | 600(10h) | |
· Code Review | · 代碼複審 | 240(4) | |
· Test | · 測試(自我測試,修改代碼,提交修改) | 180(3h) | |
Reporting | 報告 | 240(4h) | |
· Test Report | · 測試報告 | 120(2h) | |
· Size Measurement | · 計算工做量 | 60(1h) | |
· Postmortem & Process Improvement Plan | · 過後總結, 並提出過程改進計劃 | 60(1h) | |
合計 | 1800(30h) |
Information Hiding(信息隱藏)github
信息隱藏是指在設計和肯定模塊時,使得一個模塊內包含的特定信息(過程或數據),對於不須要這些信息的其餘模塊來講,是不可訪問的。這個體如今類的私有屬性和函數上。算法
Interface Design(接口設計)編程
接口設計是對程序的進一步封裝,主要依賴的原則有:單一職責原則、里氏替換原則、依賴倒置原則、接口隔離原則、開閉原則等。本次項目中的程序並未用到類的繼承,除了里氏替換原則以外,其餘的幾個接口原則基本都知足了。數組
Loose Coupling(鬆散耦合)函數
模塊間的耦合度是指模塊之間的依賴關係,包括控制關係、調用關係、數據傳遞關係。模塊間聯繫越多,其耦合性越強,同時代表其獨立性越差( 下降耦合性,能夠提升其獨立性)。本項目分爲兩個模塊,輸入模塊和計算模塊,基本實現了高內聚低耦合的要求。oop
void Get_num(char* word[], int len, bool Weight);
// 構造圖的模塊
void topologicalSort();
// 拓撲排序模塊
void longestPath(int start, char* word[], bool begin_end, bool Weight);
// 從點start找出最長鏈的模塊
void Every_Path(int chose, char* word[], char end_letter, char start_letter, bool Weight);
// 根據處理輸入的結果,以及接口實現找word list中的最長鏈性能
int getWord(char *words[], string path); // 根據路徑path,從文件中讀出 *word[] void paraAnalysis(int argc, char * argv[], char opt[][5], int & flag_wc, char & head, char & tail, bool & para_loop, string &filePath); // 根據argc,agrv[], 處理參數,得出輸入參數的類型, int gen_chain_word(char* words[], int lens, char* result[], char head, char tail, bool enable_loop); // 處理單詞個數最長的單詞鏈 int gen_chain_char(char* words[], int lens, char* result[], char head, char tail, bool enable_loop); // 處理字母個數最多的單詞鏈的長度
計算的核心部分咱們採用的是拓撲排序加動態規劃的算法。比暴力搜索比起來下降了計算的複雜性。在拓撲排序階段,算法的採用的是類DFS的算法。在動態規劃階段,時間複雜度是O(n)。咱們沒進入下一個點就會存儲到這一點的最長路徑。在考慮有環的算法的時候,咱們想的是對於環,能夠將環切出來,也就是將環的入口鏈與出口鏈分出來,這樣的話在環內計算環的最長鏈,在環外面加上入口最長鏈與出口最長鏈便可。不幸的是,咱們並無實現,還不如直接和其它同窗同樣使用暴力搜索。花了一些時間實現,可是沒有成功。單元測試
契約式設計就是按照某種規定對一些數據等作出約定,若是超出約定,程序將再也不運行,例如要求輸入的參數必須知足某種條件。學習
優勢:
缺點:太過繁瑣,使用起來比較費時費力。
咱們的項目並未嚴格按照契約式編程,可是對於非預期的狀況作了輸出提醒處理,而且終結程序。
因爲用VS的單元測試出現了一些問題,一直都沒法運行測試程序。因此咱們就採用了運行測試的方法,構造好測試樣例後,不斷重複運行程序,與預期效果比對,從而達到測試效果,下面是部分測試的截圖和樣例:
命令行模塊採用argc, char *argv[]兩個參數做爲命令行輸入的接受單元,其中argc代表輸入參數的個數(包括程序名),argv是一個字符型的指針數組,存儲具體輸入的參數。
爲了便於調試,最初採用的是控制檯輸入,即利用控制檯模仿命令行輸入。首先設置int 類型的變量argc, 字符指針數組argv[], 經過控制檯將這兩個數據補齊,從而達到模擬命令行的功能,這樣就將命令行和其餘模塊分離開來。
命令行模塊有兩個參數做爲接口,計算模塊有相應的參數來接受命令行輸入的參數,從而實現對接。
下課後在空教室內進行結對編程。
結對編程能夠很大程度上減小BUG的數量,而且將編程這一過程變得相對輕鬆,簡單,在肯定了詳細設計以後,能夠很大程度上提升編程的速度和效率,可是,結對編程也確實是須要兩人的默契配合,起初的磨合階段其實效率仍是比較低的,而且對於過於簡單的程序編寫,不如兩人分開的效率高。總的來講結對編程仍是有其獨特的優點的,值得體驗和學習。
成員 | 優勢 | 缺點 |
---|---|---|
吳光輝 | 認真仔細;總結能力強;果斷 | 急躁,強勢 |
吳楓 | 脾氣好;認真負責;樂觀向上;有探索精神;堅持不懈 | 執行力稍欠缺 |
PSP | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 60(1h) | 60(1h) |
· Estimate | · 估計這個任務須要多少時間 | 60(1h) | 60(1h) |
Development | 開發 | 1500(25h) | 1950 |
· Analysis | · 需求分析 (包括學習新技術) | 120(2h) | 120(2h) |
· Design Spec | · 生成設計文檔 | 120(2h) | 60(1h) |
· Design Review | · 設計複審 (和同事審覈設計文檔) | 60(1h) | 60(1h) |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 60(1h) | 30(0.5h) |
· Design | · 具體設計 | 120(2h) | 200 |
· Coding | · 具體編碼 | 600(10h) | 1200 |
· Code Review | · 代碼複審 | 240(4) | 200 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 180(3h) | 80 |
Reporting | 報告 | 240(4h) | 240(4h) |
· Test Report | · 測試報告 | 120(2h) | 120(2h) |
· Size Measurement | · 計算工做量 | 60(1h) | 60(1h) |
· Postmortem & Process Improvement Plan | · 過後總結, 並提出過程改進計劃 | 60(1h) | 60(1h) |
合計 | 1800(30h) | 2250 |