gpt4 book ai didi

oop - 这个简单的建模示例是否违反了 SOLID 原则以及如何对其进行单元测试

转载 作者:行者123 更新时间:2023-12-02 09:39:27 25 4
gpt4 key购买 nike

我正在尝试实现一个简单的验证器类系统,该系统尊重 SOLID 原则并用于单元测试目的。

假设我有一些简单的验证器(强制、整数、大于...),现在我想实现一个更复杂的验证器,它调用几个简单的验证器(使用一些验证器的示例表单验证器)

这非常受 Zend 和其他框架的启发。

问题是,这里如何应用或违反 SOLID 原则,以及如何对该模型进行单元测试?

我认为我可以轻松地对每个简单的验证器进行单元测试,但不能对复杂的 FormValidator 进行单元测试

interface ICheckable
{
public function check($data);
}

class MandatoryValidator implements ICheckable
{
private $_property;

public function __construct($property)
{
$this->_property = $property;
}

public function check($data)
{
return isset($data[$property]);
}
}

class IntegerValidator implements ICheckable
{
...
}

class FormValidator implements ICheckable
{
public function check($data)
{
$mandatoryValidator = new MandatoryValidator(array('LOGIN'));

if ($mandatoryValidator->check($data) == false)
{
return false;
}

$integerValidator = new IntegerValidator();

if ($integerValidator->check($data['AMOUNT']) == false)
{
return false;
}

...
return true;
}
}

最佳答案

首先 - ICheckable 接口(interface)做得很好。这是一个好的开始。

让我们解决 S. 单一职责原则:

这就是“一个类应该只有一个改变的理由”的原则S.在所有类(class)中都受到尊重吗?(简单的责任。)

当前的两个验证者都尊重这一点。

FormValidator 是否只有一项职责?我可以看到它做了三件事:

  1. 创建验证器。
  2. 调用 2 个验证器。
  3. 检查验证器结果。

这种设计的问题在于,每次你有一个新的验证器时,你都必须创建它、调用它并检查它的返回值。这违反了 SOLID 原则中的 O。 (打开/关闭)

表单验证器应接收“自定义”ICheckable 列表。这个“自定义”列表还应该实现 ICheckable,这样您就可以调用它。此“自定义”列表将迭代其 ICheckable 列表。这将是它唯一的责任。

然后,必须评估结果。当函数返回一个值时,您必须对其进行处理。一般来说,这意味着更多的代码、额外的 IF 语句。这两个应该给你一个提示:责任太大。

因此,为了使其可靠,您应该向验证器传递一个回调接口(interface),该接口(interface)将用于处理验证器输出。您的示例非常简单,验证器返回 true 或 false。可以用两个“输出”方法来表示 - Validated() 或 ValidationFailed()。 O_o,这看起来像是验证器的一个非常好的“输出”接口(interface),并且可以由 FormValidator 实现。此设计将遵守 S.O.L.I.D. 原则。

请记住,当您第一次创建 FormValidator 时,您必须创建两个验证器、自定义列表并将所有内容连接在一起。

然后您将能够非常快速地对所有非常简单的类进行单元测试。 (尝试先开始编写测试)

注意:一般来说,如果你正确地处理了 S,其他原则很容易实现。

希望这有帮助。如果您需要更多信息,请告诉我。

关于oop - 这个简单的建模示例是否违反了 SOLID 原则以及如何对其进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com