iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
Software Development

程式淨化計畫:痛苦是重構的起源!系列 第 14

Replace Error Code with Exception 的重構

  • 分享至 

  • xImage
  •  

Replace Error Code with Exception

簡介

假如有個函數, 它回傳特殊值來代表某種錯誤...?

重構前範例

假設有個購物車系統, 結帳時扣除商品的數量:

class ShoppingCart
{
    private int Checkout(int orderProductAmount)
    {
        if(orderProductAmount > _inventoryAmount)
        {
            return -1;
        }
        else
        {
            _inventoryAmount -= orderProductAmount;
            return 0;
        }
    }
}

重構後範例

這種用int或其他enum等的錯誤碼, 改成用throw Exception:


public class CheckoutAmountException : Exception
{

}
class ShoppingCart
{
    
    private void Checkout(int orderProductAmount)
    {
        if(orderProductAmount > _inventoryAmount)
        {
            throw new CheckoutAmountException()
        }
        
        _inventoryAmount -= orderProductAmount;
    }
}

我們將原本的回傳類型int改成void, 並建立CheckoutAmountException來拋出檢查的例外狀況

重構的好處

  1. 可以將原本一堆條件判斷錯誤碼的程式碼做縮減. 例外狀況的處理程式碼比起錯誤碼的程式碼簡潔許多, 尤其是閱讀容易區分正常與不正常的流程.
  2. 例外狀況的類別可以實作自己的方法, 比如自定義的訊息、後續錯誤訊息傳遞的logging等.
  3. 錯誤碼(int, enum之類)不能使用在建構函數. 物件的建立生命週期無法回傳錯誤碼.

重構的壞處

例外狀況的處理不要演變像goto的設計, 以例外狀況主導程式碼的執行. 例外狀況應該用在通知有嚴重的異常發生!


上一篇
Replace Exception with Test 的重構
下一篇
使用 nameof 的重構
系列文
程式淨化計畫:痛苦是重構的起源!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言