作業資訊 | 瀋陽航空航天大學計算機學院2024軟體工程作業 |
---|---|
課程目標 | 熟悉一個“高質量”軟體的開發過程 |
作業目標 | 熟悉程式碼規範及結對互審 |
一、結對夥伴資訊
專業 | 學號 | 班級 | 姓名 |
---|---|---|---|
物聯網工程 | 213428010108 | 物聯網2101 | 李赫 |
夥伴Github地址:雙人五子棋
本人Github地址:現代網際網路通訊工具設計與實現
二、程式碼審查表
序號 | 重要性 | 審查項 | 結論 |
---|---|---|---|
1 | 不重要 | 標頭檔案和定義檔案的名稱是否合理? | 是 |
2 | 不重要 | 標頭檔案和定義檔案的目錄結構是否合理? | 是 |
3 | 不重要 | 版權和版本宣告是否完整? | 無 |
4 | 重要 | 標頭檔案是否使用了 ifndef/define/endif 預處理塊? | 無 |
5 | 不重要 | 標頭檔案中是否只存放“宣告”而不存放“定義” | 是 |
6 | 不重要 | 空行是否得體 | 是 |
7 | 不重要 | 程式碼行內的空格是否得體? | 是 |
8 | 不重要 | 長行拆分是否得體? | 無 |
9 | 不重要 | “{” 和 “}” 是否各佔一行並且對齊於同一列? | 是 |
10 | 重要 | 一行程式碼是否只做一件事?如只定義一個變數,只寫一條語句 | 是 |
11 | 重要 | If、for、while、do等語句自佔一行,不論執行語句多少都要加 “{}”。 | 是 |
12 | 重要 | 在定義變數(或引數)時,是否將修飾符 * 和 & 緊靠變數名?註釋是否清晰並且必要? | 是 |
13 | 重要 | 註釋是否有錯誤或者可能導致誤解? | 是 |
14 | 重要 | 類結構的public, protected, private順序是否在所有的程式中保持一致? | 是 |
15 | 重要 | 命名規則是否與所採用的作業系統或開發工具的風格保持一致? | 是 |
16 | 不重要 | 識別符號是否直觀且可以拼讀? | 是 |
17 | 不重要 | 識別符號的長度應當符合“min-length && max-information”原則? | 是 |
18 | 重要 | 程式中是否出現相同的區域性變數和全部變數? | 是 |
19 | 不重要 | 類名、函式名、變數和引數、常量的書寫格式是否遵循一定的規則? | 是 |
20 | 不重要 | 靜態變數、全域性變數、類的成員變數是否加字首? | 否 |
21 | 重要 | 如果程式碼行中的運算子比較多,是否已經用括號清楚地確定表示式的操作順序? | 無 |
22 | 不重要 | 是否編寫太複雜或者多用途的複合表示式? | 否 |
23 | 重要 | 是否將複合表示式與“真正的數學表示式”混淆? | 否 |
24 | 重要 | 是否用隱含錯誤的方式寫if語句? | 是 |
25 | 重要 | Case語句的結尾是否忘了加break? | 是 |
26 | 重要 | 是否忘記寫switch的default分支? | 是 |
27 | 重要 | 使用goto 語句時是否留下隱患? 例如跳過了某些物件的構造、變數的初始化、重要的計算等。 | 無 |
28 | 不重要 | 是否使用含義直觀的常量來表示那些將在程式中多次出現的數字或字串? | 是 |
29 | 不重要 | 在C++ 程式中,是否用const常量取代宏常量? | 無 |
30 | 重要 | 如果某一常量與其它常量密切相關,是否在定義中包含了這種關係? | 是 |
31 | 不重要 | 是否誤解了類中的const資料成員? | 無 |
32 | 不重要 | 引數的書寫是否完整?不要貪圖省事只寫引數的型別而省略引數名字。 | 是 |
33 | 不重要 | 引數命名、順序是否合理? | 是 |
34 | 不重要 | 引數的個數是否太多? | 是 |
35 | 不重要 | 是否使用型別和數目不確定的引數? | 是 |
36 | 不重要 | 是否省略了函式返回值的型別? | 是 |
37 | 不重要 | 函式名字與返回值型別在語義上是否衝突? | 是 |
38 | 重要 | 是否將正常值和錯誤標誌混在一起返回?正常值應當用輸出引數獲得,而錯誤標誌用return語句返回。 | 否 |
39 | 重要 | 在函式體的“入口處”,是否用assert對引數的有效性進行檢查? | 否 |
40 | 重要 | 使用濫用了assert? 例如混淆非法情況與錯誤情況,後者是必然存在的並且是一定要作出處理的。 | 無 |
41 | 重要 | return語句是否返回指向“棧記憶體”的“指標”或者“引用”? | 是 |
42 | 不重要 | 是否使用const提高函式的健壯性 | 否 |
43 | 重要 | 用malloc或new申請記憶體之後,是否立即檢查指標值是否為NULL?(防止使用指標值為NULL的記憶體) | 無 |
44 | 重要 | 是否忘記為陣列和動態記憶體賦初值?(防止將未被初始化的記憶體作為右值使用) | 是 |
45 | 重要 | 陣列或指標的下標是否越界? | 是 |
46 | 重要 | 動態記憶體的申請與釋放是否配對?(防止記憶體洩漏) | 無 |
47 | 重要 | 是否有效地處理了“記憶體耗盡”問題? | 無 |
48 | 重要 | 是否修改“指向常量的指標”的內容? | 無 |
49 | 重要 | 是否出現野指標? | 無 |
50 | 重要 | 是否將malloc/free 和 new/delete 混淆使用? | 無 |
51 | 重要 | malloc語句是否正確無誤?例如位元組數是否正確?型別轉換是否正確? | 無 |
52 | 重要 | 在建立與釋放動態物件陣列時,new/delete的語句是否正確無誤? | 無 |
53 | 不重要 | 過載函式是否有二義性? | 無 |
54 | 重要 | 是否混淆了成員函式的過載、覆蓋與隱藏? | 無 |
55 | 不重要 | 運算子的過載是否符合制定的程式設計規範? | 是 |
56 | 不重要 | 是否濫用行內函數?例如函式體內的程式碼比較長,函式體內出現迴圈。 | 是 |
57 | 重要 | 是否用行內函數取代了宏程式碼? | 無 |
58 | 重要 | 是否違背程式設計規範而讓C++ 編譯器自動為類產生四個預設的函式: | 無 |
59 | 重要 | 建構函式中是否遺漏了某些初始化工作? | 無 |
60 | 重要 | 是否正確地使用建構函式的初始化表? | 無 |
61 | 重要 | 解構函式中是否遺漏了某些清除工作? | 無 |
62 | 不重要 | 是否錯寫、錯用了複製建構函式和賦值函式? | 無 |
63 | 重要 | 賦值函式一般分四個步驟,是否遺漏了重要步驟 | 無 |
三、評價
程式碼實現了一個簡單的雙人五子棋遊戲。從整體上看,該程式碼的結構清晰,採用了物件導向的方法,定義了棋盤Panel和玩家Player類,模組化設計使得程式碼可讀性強,便於維護。Panel類負責棋盤的初始化和列印,而Player類則負責設定棋子和判斷勝負,這樣的設計使得程式碼邏輯更加清晰。在遊戲的主函式中,透過迴圈實現了玩家輪流下棋,並且能判斷勝負,基本實現了遊戲的核心功能。
然而,該程式碼也存在一些不足之處。首先,在判斷勝負的方法中,使用了八方向遍歷,雖然實現了功能,但演算法複雜度較高。可以考慮最佳化演算法,比如使用回溯法或動態規劃等更高效的演算法。
其次,程式碼在處理非法座標輸入時,使用了死迴圈,這並不是一個好的設計。當輸入非法座標時,應該給出提示,並允許玩家重新輸入,而不是一直迴圈下去。此外,程式碼沒有實現悔棋功能,這在實際遊戲中是比較重要的一個功能。
總的來說,這段程式碼作為五子棋的基礎實現是可行的,基本實現了遊戲的核心功能。然而,為了提供更好的使用者體驗,還有許多改進的空間,比如最佳化演算法、實現悔棋功能、設計更友好的使用者互動介面等。此外,為了適應更復雜的遊戲場景,可以考慮引入網路程式設計,實現多人線上對戰,或者加入AI玩家,增加遊戲的趣味性和挑戰性。
李赫同學平時學習認真,勤奮刻苦,儲備大量的知識,做事有自己的思路不隨波逐流,不破防擺爛,遇到難啃的骨頭會隨時啃,不停啃,不捨晝夜直到完成該項工作,缺點則是:總想著創新而消耗了自己的時間,不愛惜自己的身體。但是不得不說,能和李赫搭檔是我的榮幸。