# Teddy refactoring-CA 1.設計有兩種方式 >由下至上 >由上至下 2. 重構是 >由下至上 >在家裡打掃乾淨,整個台北市依然是中華民國美學 4. 課程目的 > 重構為 CA 有什麼流程 > CA 的重點是什麼 > Pattern-based 解決問題的方式 5. 身上有thread的物件叫Active Object 6. Characterization Test / Golden Master Test > 不斷的測試 out put 捕捉系統的行為 商業邏輯有兩種 7. Entities 邏輯 > 存款不能為負, 所有邏輯都要Follow 這一層 > 可以從這一層看到系統『是什麼』 > what the system is 9. Use Case 邏輯 > 借貸可以為負, 個別應用調整 > 可以從這一層看到系統『做什麼』 > what the system does 10. 壞味道 ``` public final class TaskList implements Runnable { Map<String, List<Task>> map; ... } ``` 基本型別,看不出業務 可以拉出座艙升等為『物件』 ``` public class Task { Map<String, List<Task>> map; } ``` 接著是 String, 這個 String 其實是 Project Name 可以繼續用 VO 包裝改為下方: ``` public class Task { Map<ProjectName, List<Task>> map; } ``` 接著下一步把 Map改成 toDoList ``` ``` 一個代辦清單TODOLIST可以有很多專案PROJECT 每個代辦專案PROJECT中可以有很多個工作TASK 經過分析 Domain Model 逐漸成形 ![image](https://hackmd.io/_uploads/rk8HibkVR.png) 畫Aggregate ![image](https://hackmd.io/_uploads/S1f0oZ1NA.png) Aggrugate Root -> ToDoList 1. 先把基本型別變成物件 2. 再把私有方法變成Class 3. 把不是entity的拿到usecase 4. 開始在usecase內區分command, query --usecase, (command) addProject, addTask ![image](https://hackmd.io/_uploads/rkdkAveN0.png) 1. 呼叫repository 向 aggrugate 用id取到 物件 2. 改變狀態 3. 存檔 4. 回傳 狀態 (Success/Failed) ![image](https://hackmd.io/_uploads/B194upgEC.png) 每個 input 都很像 ![image](https://hackmd.io/_uploads/Hkz7aDl4A.png) ![image](https://hackmd.io/_uploads/HJD7dalNA.png)