从布尔值到异常

本文转载自【何以解耦】: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
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1
随波逐流

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

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

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