提问人:NameX 提问时间:5/24/2023 最后编辑:marc_sNameX 更新时间:9/1/2023 访问量:33
当我们使用类方法作为 setter 来输入对象时
When we use class methods as setter to input object
问:
如果我们使用一种方法来更新输入对象的字段,我们违反了什么原则?
举个例子:
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);
我认为,调试太难了
答:
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,请问问自己,当遇到不可预测的数据时应该怎么做,之后应该执行多少次检查,或者是否最好限制对数据的操作。
评论