---
# System prepended metadata

title: 'C2 Boss: 369'

---

# 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！