第二次結隊作業
一.題目介紹
此次我和隊友(李卓儒)選擇的題目是第一道題目,我在這次作業中擔任的角色是領航員。
1.題目:
我們在剛開始上課的時候介紹過一個小學四則運算自動生成程序的例子,請實現它,要求:
- 能夠自動生成四則運算練習題
- 可以定制題目數量
- 用戶可以選擇運算符
- 用戶設置最大數(如十以內、百以內等)
- 用戶選擇是否有括號、是否有小數
- 用戶選擇輸出方式(如輸出到文件、打印機等)
- 最好能提供圖形用戶界面(根據自己能力選做,以完成上述功能為主)
2.需求分析
看到題目,我們都不會陌生,或許我們都給小孩出過這樣的習題,有時候老師在學校也會留這樣的作業給家長,讓家長給孩子出多少道混合運算題目,由於人工出題,若是量大,寫起來很麻煩,而且不保證會出重復的題目。通過編寫的自動生成四則運算題目,可以很快又不會重復的出題,很具有實用性。
二.代碼
1.代碼地址
2.測試代碼部分截圖
3.運行的圖形界面
三.代碼審查表
java代碼審查檢查表
重要性 | 激活 | 級別 | 檢查項 |
總計 | |||
命名 | |||
重要 | Y | 20 | 命名規則是否與所采用的規範保持一致? |
Y | 20 | 是否遵循了最小長度最多信息原則? | |
重要 | N | 50 | has/can/is前綴的函數是否返回布爾型? |
註釋 | |||
重要 | Y | 10 | 註釋是否較清晰且必要? |
重要 | Y | 10 | 復雜的分支流程是否已經被註釋? |
Y | 10 | 距離較遠的}是否已經被註釋? | |
N | 10 | 非通用變量是否全部被註釋? | |
重要 | Y | 50 | 函數是否已經有文檔註釋?(功能、輸入、返回及其他可選) |
Y | 10 | 特殊用法是否被註釋? | |
聲明、空白、縮進 | |||
Y | 20 | 每行是否只聲明了一個變量?(特別是那些可能出錯的類型) | |
重要 | Y | 40 | 變量是否已經在定義的同時初始化? |
重要 | Y | 40 | 類屬性是否都執行了初始化? |
Y | 20 | 代碼段落是否被合適地以空行分隔? | |
Y | 20 | 是否合理地使用了空格使程序更清晰? | |
Y | 20 | 代碼行長度是否在要求之內? | |
Y | 20 | 折行是否恰當? | |
語句/功能分布/規模 | |||
Y | 20 | 包含復合語句的{}是否成對出現並符合規範? | |
N | 20 | 是否給單個的循環、條件語句也加了{}? | |
Y | 20 | if/if-else/if-else if-else/do-while/switch-case語句的格式是否符合規範? | |
N | 40 | 單個變量是否只做單個用途? | |
重要 | N | 20 | 單行是否只有單個功能?(不要使用;進行多行合並) |
重要 | Y | 40 | 單個函數是否執行了單個功能並與其命名相符? |
Y | 20 | 操作符++和— —操作符的應用是否復合規範? | |
規模 | |||
重要 | N | 20 | 單個函數不超過規定行數? |
重要 | N | 100 | 縮進層數是否不超過規定? |
重要 | N | 100 | 是否已經消除了所有警告? |
重要 | Y | 40 | 常數變量是否聲明為final? |
重要 | N | 80 | 對象使用前是否進行了檢查? |
重要 | N | 80 | 局部對象變量使用後是否被復位為NULL? |
重要 | Y | 70 | 對數組的訪問是否是安全的?(合法的index取值為[0, MAX_SIZE-1])。 |
重要 | Y | 20 | 是否確認沒有同名變量局部重復定義問題? |
Y | 20 | 程序中是否只使用了簡單的表達式? | |
重要 | Y | 20 | 是否已經用()使操作符優先級明確化? |
重要 | Y | 20 | 所有判斷是否都使用了(常量==變量)的形式? |
Y | 80 | 是否消除了流程懸掛? | |
重要 | Y | 80 | 是否每個if-else if-else語句都有最後一個else以確保處理了全集? |
重要 | 無該語句 | 80 | 是否每個switch-case語句都有最後一個default以確保處理了全集? |
N | 80 | for循環是否都使用了包含下限不包含上限的形式?(k=0; k<MAX) | |
重要 | N | 40 | XML標記書寫是否完整,字符串的拼寫是否正確? |
無該語句 | 40 | 對於流操作代碼的異常捕獲是否有finally操作以關閉流對象? | |
N | 20 | 退出代碼段時是否對臨時對象做了釋放處理? | |
重要 | Y | 40 | 對浮點數值的相等判斷是否是恰當的?(嚴禁使用==直接判斷) |
可靠性(函數) | |||
重要 | N | 60 | 入口對象是否都被進行了判斷不為空? |
重要 | Y | 60 | 入口數據的合法範圍是否都被進行了判斷?(尤其是數組) |
重要 | Y | 20 | 是否對有異常拋出的方法都執行了try...catch保護? |
重要 | Y | 80 | 是否函數的所有分支都有返回值? |
重要 | Y | 50 | int的返回值是否合理?(負值為失敗,非負值成功) |
N | 20 | 對於反復進行了int返回值判斷是否定義了函數來處理? | |
Y | 60 | 關鍵代碼是否做了捕獲異常處理? | |
重要 | N | 60 | 是否確保函數返回CORBA對象的任何一個屬性都不能為null? |
重要 | N | 60 | 是否對方法返回值對象做了null檢查,該返回值定義時是否被初始化? |
重要 | N | 60 | 是否對同步對象的遍歷訪問做了代碼同步? |
重要 | N | 80 | 是否確認在對Map對象使用叠代遍歷過程中沒有做增減元素操作? |
重要 | Y | 60 | 線程處理函數循環內部是否有異常捕獲處理,防止線程拋出異常而退出? |
N | 20 | 原子操作代碼異常中斷,使用的相關外部變量是否恢復先前狀態? | |
重要 | Y | 100 | 函數對錯誤的處理是恰當的? |
可維護性 | |||
重要 | Y | 100 | 實現代碼中是否消除了直接常量?(用於計數起點的簡單常數例外) |
Y | 20 | 是否消除了導致結構模糊的連續賦值?(如a= (b=d+c )) | |
N | 20 | 是否每個return前都要有日誌記錄? | |
N | 20 | 是否有冗余判斷語句?(如:if (b) return true; else return false;) | |
Y | 20 | 是否把方法中的重復代碼抽象成私有函數? |
四.任務評價
到了結對作業的第二次作業,其中隊友負責全部代碼的工作,這次作業是用java編寫的,由於自身對java了解不多,作業出來後,我也是惡補了一些java的知識,與其說是完成作業,更多的是其中的學習,和隊友一起思考,一起進步。起初我對於這些代碼很是頭疼,很容易就看不懂其中的意思,通過翻書等了解了語句的意思,進而懂得了要實現的東西,懂得了之後再去找可能出現的問題,編寫單元測試檢查代碼的可實用性。
平時我是一個有點拖延癥的人,幾乎作業發布出來後,我都得拖個幾天再去寫作業。但是由於這次作業的特殊性和我的隊友的積極性,我也很快的就投入到了作業中去,在這期間,隊友不斷地修改代碼,我們還去圖書館借了有關圖形界面的書(Qt),他還添加了許多作業沒有要求的東西,在我看來,他並不是要完成作業,而是要把事情做得漂亮,我覺得這對於以後的工作很有幫助,他對待事情的認真性,讓我受益頗多。隊友的編程能力很強,但是他也會問我需要加什麽東西進來,讓結果看起來更好,對比上次作業,我們之間的交流多了許多,讓我了解到自己的不足,更加努力的學習。
編寫單元測試時,由於基礎薄弱,隊友在一旁很是耐心仔細的幫助我,一些遺漏的東西與不懂的問題,他都能給我很好的指點,讓我很快認識到錯誤,了解自己將要完成什麽。測試代碼主要是先測試生成的式子是否合法,然後對產生的式子進行運算,看是否與理論值相符。開始編寫的時候沒有考慮到0,後來發覺除法是0作為除數的不合法性,我們又進行了一些修改,使這次的作業完成的很是完美。至此,最是感謝我的隊友給予的幫助。
最後附上我們工作的照片
第二次結隊作業