---
# System prepended metadata

title: Teddy refactoring-CA

---

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

