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

yyhrrdl8  于 2023-05-27  发布在  PHP
关注(0)|答案(1)|浏览(117)

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

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 bussiness logic
       $data->someField += 5;
       // ... anotherField wouldn't update here 
   }
}

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

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

我觉得…调试起来太难了

qnyhuwrf

qnyhuwrf1#

使用setter使得根据业务规则确保数据的一致性更加困难。让我们考虑您的示例:我可以假设业务需求是“将实体的'someField'增加5”。对于这个需求,使用setter是一个坏主意。任何用户都可以编写类似$data->setSomeField(10);甚至$data->setSomeField(-100);的代码,从而违反业务需求。
更好的方法是创建一个名为$data->incrementFive()的方法,用户除了调用此方法之外别无选择。
另一方面,如果业务规则只是“someField”字段必须存储任何数字,那么创建像$data->setSomeField()这样的setter就没有问题。
要决定是否创建setter,请问问自己,当遇到不可预测的数据时应该怎么做,之后应该执行多少次检查,或者限制对数据的操作是否更好。

相关问题