从验证到不变性保护机制的测试演变demo
php  /  管理员 发布于 3年前   557
在应用程序中,无效状态是造成 Bug 出现的主要原因之一。
特别是在像 PHP 这样的动态语言中,应用程序中尤其容易出现无效状态的对象。
举个例子
我们有创建了一个 EmailService 类,它可以发送邮件 EmailService::send():
class EmailService {
public function send(string $email)
{
// 发送邮件逻辑
}
}
以上代码有一个很大的隐患:
它没有处理 $email 的无效的情况;
$email 可能为 null,空或者无效的邮箱格式;
验证
处理类似问题的常见方案是采用验证,我们创建一个 EmailValidator 类:
class EmailValidator {
public function isValid(string $email)
{
// 验证逻辑
}
}
在使用 $email 之间,我们对其进行验证,
比如:
在 EmailService 中,我们首先验证 $email,只有在它有效的情况下才发送邮件:
class EmailService {
public function send(string $email)
{
if (!$this->emailValidator->isValid($email)){
return;
}
// 发送邮件逻辑
}
}
以上代码仍然有一个隐患:
在代码层面,
我们无法保证其他协同开发者会使用 EmailValidator 来验证 $email。
不用提其他开发者,可能作者本人在过段时间后也可能疏忽大意。
不变性保护机制
与其在程序运行中对变量进行验证,为什么不在变量创建时保证其状态的有效性?
这种模式便是不变性保护机制。
验证是第三方行为,而保护不变性是变量自身的机制。
使用不变性保护机制重构以上代码:
class Email
{
private string $stringVal;
public function __construct(string $stringVal)
{
if (!$this->isValid($stringVal)) {
throw new \DomainException('Invalid email address');
}
$this->stringVal = $stringVal;
}
public function toString()
{
return $this->stringVal;
}
}
class EmailService {
public function send(Email $email)
{
// 发送邮件逻辑
}
}
使用不变性保护机制不仅解决了上述已有问题,
整体代码的重复使用性也得到了提高,
同时 Email 类还提供了一个统一位置来管理邮箱地址,
更不用提这种模式如何改善了单元测试的质量。
转:
https://codedecoupled.com/invariant.html
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号