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

# 細部 Review
1. OOAD 的 Hand 對到 Card 的部分,記得它是實線 Association 的關係唷!

2. 我有注意到你的 CardPattern 是繼承 CardPatternHandler 去實作的,但這邊需要注意單一職責問題。從你的程式碼和 OOD 中可以得知 Game 會使用到 CardPatternHandler 以及 CardPattern,然後你讓 CardPattern 繼承 CardPatternHandler,這部分會存在職責混淆。
3. OOA 的部分很不錯,有保持以往水準。接著可以更近一步訓練捕捉並描述 force 的能力,下次在 OOA 的時候,明確的把 Force 寫下來吧!
4. OOAD 都有 follow 到整體需求一致性,非常 OK!