从布尔值到异常

本文转载自【何以解耦】: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.
xuding
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 1
随波逐流

如果加验证的话,那么就必须严谨. 因为php本身默认是弱语言,对数据类型的验证需要多判断. 上述情况,建议先验证数据类型在做逻辑处理.

// 在没有开启严格模式的情况下
[1,2,3,4] > 0 // 结果为 true
// 建议先验证数据数据类型,在做逻辑处理
if(is_int($number) && $number > 0){
  // todo
}
3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!