---
# System prepended metadata

title: 資料結構與錯誤處理
tags: [CleanCode]

---

###### tags: `CleanCode`
<STYLE>
p,li,oi,h3{
font-family:"微軟正黑體";
}
</STYLE>
# 資料結構與錯誤處理
### 5️⃣物件及資料結構
**物件**：隱藏內部資料，將使用資料的函式曝露在外。易添加新類型的物件；不易於添加新行為。
**資料結構**：曝露其資料，也不會有顯著行為。易於添加新行為，卻難以在現有函式中添加新資料結構。

#### 德摩特爾法則或迪米特法則(The Law of Demeter)
:::info
    一個類別C內的方法f不該呼叫由其他函式所回傳之物件，只能呼叫下列：
    1. C
    2. 由f產生的任何物件
    3. 被當作參數傳遞給f的物件
    4. C類別裡的實體變數所持有之物件
:::
---

### 6️⃣ 錯誤處理(try-catch-finally)

當處理許多例外事件，且處理方式皆相同時，可以將第三方API包裹(wrap)後，使其回傳共同的例外型態。
![](https://i.imgur.com/9nKS33w.png)

**Special Case Pattern[Fowler](特殊情況模式)**：建立一個class或設定一個物件，專門用來處理特殊情況。*
![](https://i.imgur.com/tVg9mWc.png)

####	不要回傳null值
> if(item!=null)如此當漏掉檢查時，容易出bug。
改以**例外事件**或是**回傳一個Special Case物件**的方式來取代。
####	不要傳遞null值
> 當參數被輸入一個null值時，容易造成NullPointerException例外。
> 此時可以建立一個新的例外型態去捕捉null被傳遞的事件。
> if(item == null){
> 　throw InvalidArgumentException("參數輸入錯誤");
> }
---