我正在创建一个User类,它应该是一个Entity类。在DataBase中,我创建了User表,它有20个字段。
我的问题是:用20个参数创建一个“__construct()”还是应该用户setter / getter?
我最近阅读了一些关于依赖注入的文章,以及它如何使代码更易于维护,但我对自己的代码感到困惑。 这是我的__construct函数:
class User{
private $userName;
private $userLastName;
...//Other users fields
public function __construct($name,$lastname,$phone,...){
$this->userName = $name;
$this->userLastName = $lastname;
...
}
}
我正在寻找最佳实践来编写一些可读,干净和可维护的代码。
此致
答案 0 :(得分:1)
这与依赖注入无关。在这里,您不会注入依赖项,而只是注入值。
所以真正的问题是:你应该在构造函数中获取这些值,还是通过getter / setter获取这些值?
我会说使用你的构造函数是一件好事,因为它可以防止你的模型以无效状态存在。例如,如果您的用户需要收到电子邮件,那么通过将其放入构造函数中,您可以确保所有用户都有电子邮件。
所以我建议你在构造函数中放入需要定义的所有属性(非null),并为所有其他属性使用setter(这将有助于避免使用20个参数构造函数)。
答案 1 :(得分:1)
通过使用20个参数,您的课程很可能违反Single Responsibility Principle并形成某种单一类而没有正确委派,编写功能。
确保你的班级具有低耦合和高凝聚力。
由于我们未在此处进行完整的代码审核(请转至https://codereview.stackexchange.com/)
我怀疑你传递的是国家,拉链,电话号码等所有参数。 问问自己构建有效对象绝对需要哪些数据。
如果你有一个类Person
需要一个名为Name
的属性,那么拥有Name
但不是ctor参数的setter可以创建不完整的类。这会将保持一致性的负担转移到每个方法,因为您无法确定Name
已设置。这样的代码很糟糕,通常会导致携带一些“初始化”标志或函数,并使用支票使代码混乱。
您的ctor应包含最少的参数集。其他一切都可以通过属性完成或进一步组合,例如一个Address
类消除了在父母ctor中传递zip,state,street等的复杂性。
您可以创建一个存储电子邮件和电话号码的“联系”类
答案 2 :(得分:0)
最好使用getter和setter。具有20个参数的__construct方法是巨大的。如果没有getter,您希望如何访问您的私人用户属性?