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