軟件工程第二次結對編程作業
題目要求
本次作業要求兩個人合作完成,駕駛員和導航員角色自定,鼓勵大家在工作期間角色隨時互換,這裏會布置兩個題目,請各組成員根據自己的愛好任選一題。我們小隊選擇的是題目1:
我們在剛開始上課的時候介紹過一個小學四則運算自動生成程序的例子,請實現它,要求:
能夠自動生成四則運算練習題
可以定制題目數量
用戶可以選擇運算符
用戶設置最大數(如十以內、百以內等)
用戶選擇是否有括號、是否有小數
用戶選擇輸出方式(如輸出到文件、打印機等)
最好能提供圖形用戶界面(根據自己能力選做,以完成上述功能為主)
角色分配
本次編程任務需要兩個角色:
駕駛員
能夠完成全部代碼工作,程序基本實現全部要求功能,並將代碼上傳至coding.net或者GitHub代碼托管系統中
能夠對導航員在本次編程工作中起到的作用給出客觀評價,並完成500字以上的總結
領航員
能夠輔助駕駛員完成全部代碼工作,並且為關鍵函數選用合適的覆蓋標準設計測試用例,並編寫代碼進行單元自動測試
能夠根據上次作業的代碼檢查表對駕駛員的本次工作進行評價
能夠對本次工作完成500字以上的總結
我與郭靖同學結成小隊,經過討論其中角色分配為:
駕駛員:郭靖
領航員:常遠
代碼地址:https://coding.net/u/q842774912/p/Groupwork_2/git/blob/master/Lab2.java?public=true
代碼用例:
以下是幾個代碼覆蓋樣例:
整數括號加法運算:
整數無括號減法運算:
整數有括號混合運算:
小數無括號混合運算:
小數有括號混合運算:
至於編寫代碼進行單元自動測試,對我來說如何自動測試隨機的數據還是很難的,雖然做出了一些努力,但是很遺憾沒有完成,這是我自己的不足,在之後的學習中我會努力彌補在這次作業中的知識漏洞。
設計代碼審查表:
重要性 | 激活 | 級別 | 檢查項 |
---|---|---|---|
總計 | |||
命名 | |||
重要 | Y | 20 | 命名規則是否與所采用的規範保持一致? |
N | 20 | 是否遵循了最小長度最多信息原則? | |
重要 | N | 50 | has/can/is前綴的函數是否返回布爾型? |
註釋 | |||
重要 | Y | 10 | 註釋是否較清晰且必要? |
重要 | Y | 10 | 復雜的分支流程是否已經被註釋? |
N | 10 | 距離較遠的}是否已經被註釋? | |
N | 10 | 非通用變量是否全部被註釋? | |
重要 | N | 50 | 函數是否已經有文檔註釋?(功能、輸入、返回及其他可選) |
Y | 10 | 特殊用法是否被註釋? | |
聲明、空白、縮進 | |||
N | 20 | 每行是否只聲明了一個變量?(特別是那些可能出錯的類型) | |
重要 | N | 40 | 變量是否已經在定義的同時初始化? |
重要 | N | 40 | 類屬性是否都執行了初始化? |
Y | 20 | 代碼段落是否被合適地以空行分隔? | |
Y | 20 | 是否合理地使用了空格使程序更清晰? | |
Y | 20 | 代碼行長度是否在要求之內? | |
Y | 20 | 折行是否恰當? | |
語句/功能分布/規模 | |||
Y | 20 | 包含復合語句的{}是否成對出現並符合規範? | |
Y | 20 | 是否給單個的循環、條件語句也加了{}? | |
Y | 20 | if/if-else/if-else if-else/do-while/switch-case語句的格式是否符合規範? | |
Y | 40 | 單個變量是否只做單個用途? | |
重要 | Y | 20 | 單行是否只有單個功能?(不要使用;進行多行合並) |
重要 | Y | 40 | 單個函數是否執行了單個功能並與其命名相符? |
Y | 20 | 操作符++和— —操作符的應用是否復合規範? | |
規模 | |||
重要 | N | 20 | 單個函數不超過規定行數? |
重要 | Y | 100 | 縮進層數是否不超過規定? |
重要 | Y | 100 | 是否已經消除了所有警告? |
重要 | N | 40 | 常數變量是否聲明為final? |
重要 | N | 80 | 對象使用前是否進行了檢查? |
重要 | N | 80 | 局部對象變量使用後是否被復位為NULL? |
重要 | N | 70 | 對數組的訪問是否是安全的?(合法的index取值為[0, MAX_SIZE-1])。 |
重要 | Y | 20 | 是否確認沒有同名變量局部重復定義問題? |
N | 20 | 程序中是否只使用了簡單的表達式? | |
重要 | Y | 20 | 是否已經用()使操作符優先級明確化? |
重要 | Y | 20 | 所有判斷是否都使用了(常量==變量)的形式? |
N | 80 | 是否消除了流程懸掛? | |
重要 | N | 80 | 是否每個if-else if-else語句都有最後一個else以確保處理了全集? |
重要 | Y | 80 | 是否每個switch-case語句都有最後一個default以確保處理了全集? |
N | 80 | for循環是否都使用了包含下限不包含上限的形式?(k=0; k< MAX) | |
重要 | Y | 40 | XML標記書寫是否完整,字符串的拼寫是否正確? |
N | 40 | 對於流操作代碼的異常捕獲是否有finally操作以關閉流對象? | |
N | 20 | 退出代碼段時是否對臨時對象做了釋放處理? | |
重要 | Y | 40 | 對浮點數值的相等判斷是否是恰當的?(嚴禁使用==直接判斷) |
可靠性(函數) | |||
重要 | N | 60 | 入口對象是否都被進行了判斷不為空? |
重要 | N | 60 | 入口數據的合法範圍是否都被進行了判斷?(尤其是數組) |
重要 | N | 20 | 是否對有異常拋出的方法都執行了try...catch保護? |
重要 | Y | 80 | 是否函數的所有分支都有返回值? |
重要 | Y | 50 | int的返回值是否合理?(負值為失敗,非負值成功) |
Y | 20 | 對於反復進行了int返回值判斷是否定義了函數來處理? | |
N | 60 | 關鍵代碼是否做了捕獲異常處理? | |
重要 | N | 60 | 是否確保函數返回CORBA對象的任何一個屬性都不能為null? |
重要 | N | 60 | 是否對方法返回值對象做了null檢查,該返回值定義時是否被初始化? |
重要 | N | 60 | 是否對同步對象的遍歷訪問做了代碼同步? |
重要 | N | 80 | 是否確認在對Map對象使用叠代遍歷過程中沒有做增減元素操作? |
重要 | N | 60 | 線程處理函數循環內部是否有異常捕獲處理,防止線程拋出異常而退出? |
N | 20 | 原子操作代碼異常中斷,使用的相關外部變量是否恢復先前狀態? | |
重要 | Y | 100 | 函數對錯誤的處理是恰當的? |
可維護性 | |||
重要 | N | 100 | 實現代碼中是否消除了直接常量?(用於計數起點的簡單常數例外) |
Y | 20 | 是否消除了導致結構模糊的連續賦值?(如a= (b=d+c )) | |
N | 20 | 是否每個return前都要有日誌記錄? | |
N | 20 | 是否有冗余判斷語句?(如:if (b) return true; else return false;) | |
N | 20 | 是否把方法中的重復代碼抽象成私有函數? |
對駕駛員的評價
在這次編程任務中,駕駛員郭靖同學的表現可以說是十分積極。任務剛剛布置下來的時候,他就自告奮勇想要擔任駕駛員的角色,並且在編程過程中,主動完成了全部的代碼工作。代碼工作時,基本上都沒有需要我進行幫助的地方,這點讓我十分的佩服。如果角色互換的話,面對這種題目,我免不了要對隊友和其他同學進行求助的。當然啦,也不是說自己一個人在那裏悶著代碼就會自己弄懂,但是我的編程能力的確不如人家,他這種獨立自主,自我學習的能力值得我學習,想來,這就是他有信心去做駕駛員這個角色的原因吧。優點固然很多,但是代碼對我來說還是有缺點的,最主要的就是沒有細致的函數劃分,如果有細致的函數劃分的話,可能測試方面還會容易一些。當然啦,駕駛員的的確確是完成了自己的任務,這次作業還是我的不足多一些。
總結
對於這次編程任務,最開始在知道隊員想要當駕駛員的時候,其實心裏還是蠻輕松的吧,因為我的編程能力確實沒有對方出色,並且我還認為,領航員也就是在對方寫代碼的時候輔助輔助人家,然後再簡單的編寫一下測試數據就可以了,這不比人家直接寫代碼還要輕松的多嗎。然而,事實上領航員的工作並沒有我想象的那麽輕松。首先,你作為一個程序代碼的測試者,是需要理解這個代碼的每一個函數,每一個變量,每一個條件的;只有這樣,你才能選擇合適的數據去覆蓋所有的函數。並且,這次的作業測試還有一個讓我比較吃力的地方:以往程序的測試都是具體數值,但是這次,確實隨機生成的運算。老實說,這個可真的讓我這個還不怎麽了解測試過程的菜鳥糾結了好半天,最開始的時候想通過自己來解決問題,但是網絡上的材料自己理解起來比較困難,最後只能去麻煩別的同學,但是最後還是沒有完成自動測試程序的編寫,看到其他的一些同學只是去自動測試某些函數,但是我們隊伍的這個程序並沒有劃分出各個函數,而我又實在不知道該怎麽做到隨機數的測試。。說起來真的很慚愧,郭靖同學在扮演他駕駛員的角色時扮演的很好,但是我作為領航員,但是卻沒少麻煩他這個駕駛員。雖然經常告誡自己,求助於別的同學沒什麽不好意思的,但是真的去麻煩人家的時候,還是覺得很慚愧,但是只有這樣,我才會有進步,相信以後我也可以去幫助別人,而不是像現在這樣,只能一味地去麻煩別的同學。
最後附上合作時的照片
合作照片:
軟件工程第二次結對編程作業