合作者:201631062114,201631062602
代碼地址:https://gitee.com/Changyu-Guo/pairing_project
作業鏈接:http://www.cnblogs.com/guochangyu/p/9804719.html
?
一、PSP表格
PSP2.1 | PSP階段 | 預估耗時 結對子幫扶內容怎么寫,(分鐘) | 實際耗時 (分鐘) |
Planning | 計劃 | 小學生項目式作業,100 | 120 |
· Estimate | · 估計這個任務需要多少時間 | 100 | 結對子幫扶計劃、120 |
Development | 開發 | 1520 | 1830 |
建筑工程項目管理作業1答案?· Analysis | · 需求分析 (包括學習新技術) | 20 | 15 |
· Design Spec | 手拉手幫扶活動。· 生成設計文檔 | 30 | 35 |
· Design Review | · 設計復審 (和同事審核設計文檔) | 結對助學?20 | 20 |
· Coding Standard | · 代碼規范 (為目前的開發制定合適的規范) | 50 | 作業幫收費嗎、60 |
· Design | · 具體設計 | 100 | 150 |
· Coding | · 具體編碼 | 1000 | 約1300 |
· Code Review | · 代碼復審 | 200 | 140 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 100 | 110 |
Reporting | 報告 | 220 | 250 |
· Test Report | · 測試報告 | 100 | 85 |
· Size Measurement | · 計算工作量 | 20 | 15 |
· Postmortem & Process Improvement Plan | · 事后總結, 并提出過程改進計劃 | 100 | 150 |
? | 合計 | 1840 | 2200 |
?
二、代碼規范
? 經過討論,我們的項目主要是使用C/C++結合node.js進行開發,因此我們從網絡上查找了相關的編碼規范:
? C/C++:C/C++編碼規范
? Node.js:JavaScript 風格指南/編碼規范(Airbnb公司版)
三、代碼自審和互審
?
? ??制定了相關的代碼規范后,就按照代碼規范對自己的代碼進行審查,由于自己很早之前就對代碼規范進行過了解,因此在審查過程中并沒有發現太多的問題。
? ? 進行過代碼自審過后,接下來就是代碼互審,由于第一作業的代碼比較簡單,經雙方商議后我們決定對命令處理模塊、字符統計模塊、單詞統計模塊、行數統計模塊進行代碼互審,過程中出現的問題如下:
- 我的代碼問題:代碼在基本的風格比如縮進,變量命名上面并沒有太大問題,主要就是代碼的耦合性太高,各個功能模塊代碼相互關聯,并且出現多個邏輯功能出現在同一函數里面的情況,不利于接下來的結對合作,需要對相應的模塊進行抽離。?
- partner代碼問題:代碼同樣出現了耦合性過高的問題,其實就是變量及函數的命名有的不符合駝峰命名法,其他的都比較好(畢竟編譯器自帶代碼格式化);
四、設計過程
? ? 經過雙方的商討和對原始代碼的分析過后,并考慮到要使用圖形界面,決定用node.js搭建一個后端服務器,如果命令里面存在-x選項,則啟動服務器,并打開相應的頁面,由用戶發送ajax數據,后端接受后拼接成相應的字符串后,調用wc.exe并傳入命令字符串即可得到結果,如果沒有,則不用打開服務器和網頁,直接調用wc.exe得到相應結果即可。代碼的具體流程如下:
?
wc模塊的流程為:
?
五、關鍵代碼分析
首先是node處理代碼:
1 // 判斷是否存在-x選項 2 if (process.argv.indexOf('-x') === -1) { 3 // 如果不存在,就拼接命令字符串并執行 4 process.argv.shift(); 5 process.argv.shift(); 6 process.argv.forEach(val => { 7 cmdStr += ' '; 8 cmdStr += val; 9 }); 10 exec(cmdStr, function (err, stdout, stderr) { 11 if (err) { 12 console.log("執行錯誤,請檢查命令是否合法"); 13 return; 14 } 15 }); 16 } else { 17 // 如果存在-x指令,就啟動服務器,并打開網頁 18 app.listen(3000, function () { 19 console.log('app is running at port 3000.'); 20 }); 21 open('http://127.0.0.1:3000'); 22 }
?
? ? 這段代碼是入口程序代碼,首先要做的是判斷是否有-x指令,如果沒有,就遍歷指令數組,將指令拼接成字符串,然后調用C++程序并將字符串作為參數傳進去。如果有-x指令,就啟動服務器,并用瀏覽器打開網頁。網頁的效果如下:
?
用戶通過圖形化的界面輸入相關參數,然后后臺獲取數據后拼接成字符串,調用C++程序進行處理,后臺代碼如下:
1 app.get('/', function (req, res) { 2 res.type('html'); 3 res.render('index.html'); 4 }); 5 6 app.post('/data', function (req, res) { 7 // 拼接選項 8 for (var i = 0; i < req.body['options[]'].length; i++) { 9 cmdStr += ' '; 10 cmdStr += req.body['options[]'][i]; 11 } 12 // 拼接輸入文件 13 cmdStr += ' '; 14 cmdStr += req.body.filepath; 15 cmdStr += ' '; 16 cmdStr += '-o'; 17 cmdStr += ' '; 18 cmdStr += path.dirname(req.body.filepath); 19 cmdStr += '\\'; 20 cmdStr += req.body.outfile; 21 if (req.body.isStop !== '') { 22 cmdStr += ' '; 23 cmdStr += '-e'; 24 cmdStr += ' '; 25 cmdStr += req.body.stopPath; 26 } 27 exec(__dirname + cmdStr, function (err, stdout, stderr) { 28 cmdStr = '.\\wc.exe'; 29 if (err) { 30 console.log('err'); 31 return res.status(500).json({ 32 message: '服務器錯誤' 33 }); 34 } 35 return res.status(200).json({ 36 message: '成功' 37 }); 38 }); 39 });
?
C++程序主函數代碼:
1 int main(int argc, char *argv[]) { 2 3 char commandStr[MAX_COM_LENGTH] = ""; 4 for(int i=1;i<argc;i++){ //將用戶輸入的指令拼接成一個完整的字符串傳給程序 5 strcat(commandStr, argv[i]); 6 strcat(commandStr, " "); 7 } 8 9 Command command; 10 analyseCommand(commandStr, command); //解析用戶指令 11 12 SourceFile *head = new SourceFile(); 13 if (command._s) getFileName(command.filePath, head); //遞歸尋找目錄下的文件 14 else { //否則直接利用相對路徑查找文件 15 SourceFile *p = new SourceFile(); 16 p->next = head->next; 17 head->next = p; 18 strcpy(p->fileName, command.filePath); 19 strcpy(p->filePath, command.filePath); 20 } 21 22 wordCount(head, command.stopFile); //統計單詞數 23 24 outPut(head, command); //結果輸出到文件 25 26 delete head; 27 return 0; 28 }
?
? ? main函數是邏輯處理的核心,node程序調用C++程序后,首先進入main函數,然后main函數將傳進來的參數拼接成字符串,將字符串傳入相關函數進行解析,解析后會得到一個鏈表,這個鏈表存儲了所有文件的相關信息,最后將鏈表傳入統計函數和輸出函數進行相應的處理。
六、總結
? ? 這是我人生中第一做結對項目,有很多收獲,自己一個人寫代碼的時候,有很多考慮不周全的地方,但是有了partner的提醒和幫助,就能夠設計出更加有邏輯和更加規范的代碼結構,而且在編碼的過程中,有很多問題比如某個功能不知道怎么寫,但是和partner商討過后就能很容易的解決。總體上來說,我覺得結對編程還是很大程度上提高了編碼效率。