從布林值到異常

xuding發表於2021-09-22

本文轉載自【何以解耦】:codedecoupled.com/exception.html

在實現業務邏輯之前,我們通常需要檢查一些前提條件,比如實現庫存管理系統中的庫存增加邏輯:

class ProductSku
{
    public function addStock($number): void
    {

    }
}

在實現 addStock 時,我們需要確定 $number 的值為正。因為負數在這裡是沒有意義的,邏輯上無法處理,為了防止 Bug,我們需要對其進行檢測。

顯而易見的操作是寫一個返回布林值的檢測函式:

class ProductSku
{
    public function addStock($number): void
    {
        if (!$this->isValid($number)) {
            return;
        }

        $this->increment('stock', $number);
    }

    private function isValid($number): bool
    {
        return $number > 0;
    }
}

類方法 isValid 充當了一個檢測函式,當 $number 為負時,addStock 直接返回。

讓我們再仔細分析一下以上程式碼。當 $number 為負時,實際上程式已經出現了此段程式碼無法處理的情況,只是 addStock 直接返回將這個情況隱藏了,理論上我們應該將這種情況暴露出來以便除錯(Debug)。

處理檢測前提條件更健康的做法是使用異常(Exception),使用異常重構以下程式碼:

class ProductSku
{

    public function addStock($number): void
    {
        $this->guard($number);

        $this->increment('stock', $number);
    }

    private function guard($number)
    {
        if ($number > 0) {
            throw new \DomainException('Invalid number to add '.$number);
        }
    }
}

丟擲異常來處理程式碼中無法處理的情況,這樣子便於除錯,程式碼的質量也能得到相應的提高。

本文轉載自【何以解耦】:codedecoupled.com/exception.html ,如果你也對 TDD,DDD 以及簡潔程式碼感興趣,歡迎關注公眾號【何以解耦】,一起探索軟體開發之道。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Know how, know why meanwhile.

相關文章