###### 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("參數輸入錯誤"); > } ---