哪种构造对象更易于维护?

时间:2013-06-06 08:07:27

标签: oop design-patterns constructor

我正在努力学习设计模式,最佳实践等。有一个特别的问题总让我感到困惑。 抽象更重要或KISS(保持简单和愚蠢)。 假设我需要构造一个具有多个属性的对象。有两种方式:

1)实例化对象并将属性传递给构造函数。

$user = new user($user_detail_array); // one line code is enough

此方法的好处:

  • 代码很小。
  • 非常好的抽象。
  • 短代码,易于管理。

否定:

  • 添加新代码会导致问题,
  • 难以遵循DRY(不要自己重复)。
  • 违反单一责任规则

2)实例化对象并单独设置每个属性。

$user = new user();
$user->setName($name);
$user->setEmail($email);
$user->setGender($gender);
so on....

优点:

  • 它很容易理解。
  • 易于更换。
  • 看起来更好。

否定:

  • 它不是很好的抽象。
  • 所有方法都可见。
  • 要编写的长代码。试图过度追随KISS本身变得困难。
  • 课堂之间的沟通变得艰难。要沟通的课程太多了。这么多的公共职能。
  • 就像程序代码一样。

总的来说,更好的方法是什么?如果取决于情况,第一种方法何时优于第二种?为什么?我发现这两种方法都会引起问题。第一种方法使代码过于抽象。第二种方法使代码太长且无法管理。

4 个答案:

答案 0 :(得分:2)

我认为你只是误解了一些概念。首先,KISS并不意味着你应该在不使用抽象的情况下编写错误的代码。实际上,抽象是帮助程序员编写简单代码的最强大的东西之一。

您设计程序的方式总是取决于具体情况。如果您正在编写应该只运行一次的脚本,那么甚至不要考虑抽象。这将是一种矫枉过正。但是,如果程序的生命周期很长,请尝试使用抽象并为您的user类的客户端提供直观和简单的界面。想象一下,使用user的代码想要改变它的名字。在第一种方式中,他们应该为user提供全新的数组。在第二种方式中,您只需调用方法setName。就是这样。

总结一下:在设计类时,不要考虑编写此代码的简单性。您应该考虑使用当前正在编写的类的简单性。

答案 1 :(得分:1)

$userBuilder = new UserBuilder();
$userBuilder.name = $name;
// and so on
$user = $userBuilder -> build();

它是抽象的,不重复任何东西,它增加了另一种模式(Builder)。

答案 2 :(得分:0)

现实情况是,我认为你的两个例子之间并没有多大区别。

拿第一个例子$user = new user($user_detail_array);。是的,这似乎更短,但实际上,我们通常会在这一行之前看到什么?

$user_detail_array = {
    "name" => "Bill",
    "email" => "billg@microsoft.com",
    "gender" => "male"
};
$user = new user($user_detail_array);
哇,现在它与第二种方法看起来并没有那么不同......

$user = new user();
$user->name = "Bill";
$user->email = "billg@microsoft.com";
$user->gender = "male";

我的观点是,user实体的每个属性都会出现在程序中某个位置的=>(赋值)旁边。无论是数组键,构建器对象的属性,还是直接在实体本身 - 都必须分配一些时间。

我认为在这种情况下最好的做法是让作业(=>)尽可能靠近实体,因此最明确的是分配的内容以及分配给它的位置。

答案 3 :(得分:0)

抽象的另一个问题是你不需要单独设置名称,电子邮件和性别。

您可以简单地将它们抽象到数组中并创建一个新的setter:

$user->setUserDetail($userDetailArray);