当我们使用类方法作为 setter 来输入对象时

When we use class methods as setter to input object

提问人:NameX 提问时间:5/24/2023 最后编辑:marc_sNameX 更新时间:9/1/2023 访问量:33

问:

如果我们使用一种方法来更新输入对象的字段,我们违反了什么原则?

举个例子:

class Data {
   public int $someField = 0; // it's private with setSomeField method

   public int $anotherField = 0;
}

class SomeUseCase
{
   // ... some DI
   public function updateData(Data $data): void
   {
       // ... some business logic
       $data->someField += 5;
       // ... anotherField wouldn't update here 
   }
}

$data = new Data();
$data->anotherField = 42;

$someUseCase = new SameUseCase();
$someUseCase->updateData($data);

我认为,调试太难了

PHP 编码风格的 固体 设计原则

评论

0赞 Markus Zeller 5/24/2023
当您拥有不可变数据时,您无法确保对象与创建对象时相同。您应该使用 setter 方法,并在更改时设置脏标志。

答:

1赞 Timur 5/24/2023 #1

使用 setter,根据业务规则确保数据的一致性变得更加困难。让我们考虑一下你的例子:.我可以假设业务需求是“将实体的'someField'增加 5”。有了这个要求,使用 setter 是一个坏主意。任何用户都可以编写类似甚至的代码,从而违反业务需求。$data->setSomeField($data->someField + 5);$data->setSomeField(10);$data->setSomeField(-100);

更好的方法是创建一个名为 的方法,用户别无选择,只能调用此方法。$data->incrementFive()

另一方面,如果业务规则只是“someField”字段必须存储任何数字,那么创建像 这样的 setter 就没有问题了。$data->setSomeField()

要决定是否创建 setter,请问问自己,当遇到不可预测的数据时应该怎么做,之后应该执行多少次检查,或者是否最好限制对数据的操作。