1

我正在尝试学习设计模式、最佳实践等。有一个特定的问题总是让我感到困惑。 抽象或 KISS 更重要(保持简单和愚蠢)。 假设我需要构造一个包含多个属性的对象。有2种方式:

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

4 回答 4

2

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

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

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

于 2013-06-06T09:11:39.640 回答
1
$userBuilder = new UserBuilder();
$userBuilder.name = $name;
// and so on
$user = $userBuilder -> build();

它是抽象的,不重复任何内容,并且添加了另一种模式(Builder)。

于 2013-06-06T08:13:53.783 回答
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实体的每个属性都会=>在程序中的某个点出现在(分配)旁边。无论是在数组键、构建器对象的属性中,还是直接在实体本身上——它们都必须分配一段时间。

我认为在这种情况下最好的做法是让分配 ( =>) 尽可能靠近实体,因此最清楚分配的内容和分配的位置。

于 2013-06-06T15:21:02.513 回答
0

关于抽象的另一件事是您不需要分别设置姓名、电子邮件和性别。

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

$user->setUserDetail($userDetailArray);
于 2013-10-02T11:20:02.623 回答