假设您有一个通用验证函数,并且必须对输入进行多次子检查。每个子检查也返回布尔值。请看这个虚构的:
private function hasValidContent(string $content) : bool
{
$isValid = false;
$isValid = $this->hasMoreThanOneChar($content);
$isValid = $this->hasValidCharacters($content);
$isValid = $this->hasCapitalLetters($content);
...
return $isValid;
}
当然,上面的代码不会工作,因为接下来的每一次检查都会覆盖前一次的评估。
但是,当第一次检查导致 时,如何才能停止进一步的检查呢false?例如,如果其内容不超过一个字符,那么它应该在函数之后停止hasMoreThanOneChar并立即将方法返回hasValidContent为 false。
是的,当然,您可以在每次方法调用后检查表达式是否变为 false,但这很尴尬,而且开销很大且重复。
||如果有数千个或&&类似的东西在一个单一的中做这件事感觉真的很难看
return $this->checkA($content)
&& $this->checkB($content)
&& $this->checkC($content)
...;
表达式多了之后,可读性就会受到影响。
另一种经常提到的方法可能是使用异常
private function hasValidContent(string $content) : bool
{
try {
$this->hasMoreThanOneChar($content);
$this->hasValidCharacters($content);
$this->hasCapitalLetters($content);
...
}
catch {
return false;
}
return true;
}
private function hasMoreThanOneChar(string $string) : void {
if(count($string) < 2 ) {
throw new HasNotMoreThanOneCharException(...)
}
}
但我也认为这不是一个优雅的解决方案,因为验证内容并不例外。
所以我的问题是:
有什么优雅的模式吗?有什么关键词可以搜索吗?
蝴蝶不菲
幕布斯6054654
动漫人物