我正在努力学习设计模式,最佳实践等。有一个特别的问题总让我感到困惑。 抽象更重要或KISS(保持简单和愚蠢)。 假设我需要构造一个具有多个属性的对象。有两种方式:
1)实例化对象并将属性传递给构造函数。
$user = new user($user_detail_array); // one line code is enough
此方法的好处:
否定:
2)实例化对象并单独设置每个属性。
$user = new user();
$user->setName($name);
$user->setEmail($email);
$user->setGender($gender);
so on....
优点:
否定:
总的来说,更好的方法是什么?如果取决于情况,第一种方法何时优于第二种?为什么?我发现这两种方法都会引起问题。第一种方法使代码过于抽象。第二种方法使代码太长且无法管理。
答案 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);