# C2 Boss: 369 ## 基本要求 (打勾 ✓ 代表有做到) - [x] Card (suit/rank): Card 類別應妥善封裝好 (suit/rank) 概念作為屬性。 - [ ] Card (ordering): Card 類別應決定自己該如何「與其他 Card」比大小。 - [x] Deck (stack/deal): Deck 牌堆應有「先進後出」的堆疊行為,並支援發牌行為。 - [x] Player (name, hand):Player 應有 name, hand 等屬性。 - [x] CardPattern (cards):每個 CardPattern 為多個 Card 的組合。 - [x] CardPattern (ordering):CardPattern 類別應決定自己該如何與其他「CardPattern」比大小,而不同 CardPattern 實作(如:Pair, FullHouse) 會有不同的比大小行為。 - [ ] OCP: 擴充/支援新的 Card Pattern 時無須改變既有程式碼;反之,刪除/取消支援既有 CardPattern 時,無須改變既有程式碼。 ## 細部 Review > 以下部分為 細部 Review 的參考註釋,詳讀了解之後,請在最後批改完成後將註釋刪除。 > 1. 如果上述基本要求有沒做到的項目,在細部 Review 中首先說明清楚該要求的判定緣由。為什麼說他沒有做到這個項目? > 2. 接著,你可以開始審查/review 他的 OOAD 圖片。 > a. 在 OOA 中,仔細看清楚他的 Forces/Problem 分析是否正確,好比大老二這一題至少一定要有一組 Force BV x Force OCP。然後審查他 Force 的用字是否有「精準定位性」和「衝突感」。好比 OCP 要說清楚 Open for CardPattern, Close for 整個 Big2。而 BV 要說清楚是 Big2 在辨識一組牌的實際牌型時,會隨著牌的組成不同而判定為不同的實際牌型,也就是`BV(arguments)`。 > b. 在 OOA 時,要確認他有確切捕捉到 Single / Pair / FullHouse 等 CardPattern 子類別。在物件導向分析中,當閱讀到「在大老二中,有以下幾種牌型」時,就可以把 Single/Pair/FullHouse/Straight 等 CardPattern 子類別捕捉起來。若未捕捉它們,可能代表著學員的分析中仍然混合著一些「設計」和「實作」的不同關注點。 > c. 在 OOD 中,仔細檢查他設計模式套用上的 Form 是否精準無誤,好比責任鏈模式的 Form 中,`CardPatternHandler` 一定為抽象類別,然後有一條遞迴關聯,遞迴關聯指著 `next handler`,並且參與者數量一定為 0..1,0 是不能省略的。 > d. 在 OOD 中,還有一項設計要點:跟牌型相關的類別一定有兩組,一組是 OOA 分析出來的基本牌型類別:CardPattern, Single, Pair, Straight, FullHouse,一組是 OOD 時套用責任鏈後迭代出來的 CardPatternHandler, SingleHandler, PairHandler, StraightHandler, FullHouseHandler。很多學員會擔心開出太多類別,而將兩組合併為一組,這會導致責任鏈 Handler 的責任過多,不但要判定牌型、還要排序牌型,違反單一職責原則。 > e. 如果這一題除了牌型的責任鏈和人類/AI 玩家的策略模式 (or 樣板)之外,還在其他地方也套了模式,則代表有「過度設計」,請看懂它過度設計的部分、揣測他的動機,並回饋給他。 > 3. 針對 Coding-Style、程式碼可讀性、維護性等等面相來給予建議。 > 原則:上述可能都是指出缺點,但無論如何,細部 Review 中都至少要含有 1~2 項誇獎,截圖或展示一部分他做得最好的地方,不吝誇獎。 --- > Card 類別應決定自己該如何「與其他 Card」比大小。 如果能把在 CardPattern 取得 Rank & Suit 去比大小的 compareTo 包裝起來會更好! > OCP: 擴充/支援新的 Card Pattern 時無須改變既有程式碼;反之,刪除/取消支援既有 CardPattern 時,無須改變既有程式碼。 在 OCP 部分有點可惜,以下程式碼有直接使用到對應 CardPattern,會導致在刪除或是新增 Card Pattern 時,需要讓這些程式碼進行修改。但在 main.java 的部分做得很好,有用到依賴注入的方式去完成 CoR! ![](https://hackmd.io/_uploads/HyE4RFWep.png) # 細部 Review 1. OOAD 的 Hand 對到 Card 的部分,記得它是實線 Association 的關係唷! ![](https://hackmd.io/_uploads/B1JDEcWla.png) 2. 我有注意到你的 CardPattern 是繼承 CardPatternHandler 去實作的,但這邊需要注意單一職責問題。從你的程式碼和 OOD 中可以得知 Game 會使用到 CardPatternHandler 以及 CardPattern,然後你讓 CardPattern 繼承 CardPatternHandler,這部分會存在職責混淆。 3. OOA 的部分很不錯,有保持以往水準。接著可以更近一步訓練捕捉並描述 force 的能力,下次在 OOA 的時候,明確的把 Force 寫下來吧! 4. OOAD 都有 follow 到整體需求一致性,非常 OK!