2014-03-03 56 views
0

我正在创建一个User类,它应该是一个Entity类。在DataBase中我创建了用户表,它有20个字段。将参数传递给具有依赖注入的__construct

我的问题是:用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; 
      ... 
    } 

} 

我正在寻找最好的做法是写一些可读性,干净,维护的代码。

Regards

回答

1

这与依赖注入无关。在这里你不会注入依赖关系,但只是值。

所以真正的问题是:你应该在构造函数中还是通过getters/setters获取这些值?

而且我会说使用你的构造函数是件好事,因为它可以防止你的模型以无效状态存在。例如,如果用户需要有电子邮件,那么通过将其放入构造函数中,可以保证所有用户都会收到电子邮件。所以我建议你在你的构造函数中加入所有需要定义的属性(不为空),并为所有其他属性使用setter(这将有助于避免使用20个参数构造函数)。

+0

谢谢,它帮助了很多:) –

0

最好使用getter和setter。具有20个参数的__construct方法非常庞大。没有getter你想如何访问你的私人用户属性?

1

通过使用20个参数,您的班级很有可能违反了Single Responsibility Principle,并且在没有正确授权的情况下形成某种整体课程,从而构成功能。

确保你的班级有一个低耦合和高凝聚力。

http://500internalservererror.wordpress.com/2009/02/23/what-do-low-coupling-and-high-cohesion-mean-what-does-the-principle-of-encapsulation-mean/

,因为我们没有在这里做全面的代码审查(去https://codereview.stackexchange.com/代替)

我怀疑你是路过喜欢乡村,邮政编码,电话号码等所有的东西作为参数。 问问自己,构建一个有效的对象绝对需要哪些数据。

如果你有一个类Person需要一个名为Name的属性,然后有一个设置为Name而不是ctor参数的setter允许你创建不完整的类。这会将维护一致性的负担转移到每种方法,因为您无法确定已设置了Name。这样的代码很糟糕,通常会导致携带一些“初始化”标志或函数,并用检查混乱你的代码。

你的ctor应该包含最少的一组参数。其他一切都可以通过属性完成或者进一步组合,例如一个Address类去除了在父ctor中传递zip,state,street等所有东西的复杂性。 您可以创建一个存储电子邮件和电话号码等的“联系人”类。