头图

从布尔值到异常

XuDing

本文转载自【何以解耦】:https://codedecoupled.com/exc...

在实现业务逻辑之前,我们通常需要检查一些前提条件,比如实现库存管理系统中的库存增加逻辑:

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);
        }
    }
}

抛出异常来处理代码中无法处理的情况,这样子便于调试,代码的质量也能得到相应的提高。

本文转载自【何以解耦】:https://codedecoupled.com/exc...,如果你也对 TDD,DDD以及简洁代码感兴趣,欢迎关注公众号【何以解耦】,一起探索软件开发之道。

阅读 70

全职编程,兼职跑步,临时健身。

7 声望
0 粉丝
0 条评论
你知道吗?

全职编程,兼职跑步,临时健身。

7 声望
0 粉丝
文章目录
宣传栏