我想我在方法中传递了太多参数
当用户提交表单时,例如:
public function addServer(CreateRequest $request)
{
$created = $this->server->create(
$request->name,
$request->location,
$request->plan,
$request->php_version,
$request->install_mysql,
$request->database_name,
$request->do_backup,
);
}
有时我不需要上面的所有参数,只有几个。
在服务器类中:
class Server {
public function create($name, $location, $plan, $phpVersion, $installMysql, $databaseName, $doBackup) {
$server = $this->create($name, $location, $plan);
if ($server) {
}
}
}
传递一个对象(实体)会解决这个问题吗?
答案 0 :(得分:3)
构建器模式的目的是找到伸缩构造器反模式的解决方案[需要引证]。当对象构造函数参数组合的增加导致构造函数的指数列表时,发生伸缩构造函数反模式。构建器模式不是使用大量构造函数,而是使用另一个对象(构建器),它逐步接收每个初始化参数,然后立即返回生成的构造对象。
基本上使用构建器模式,您可以保证您的对象始终正确初始化,包含或不包含可选属性。
您将创建一个额外的ServerBuilder
类,其中包含服务器的每个属性/参数的setter,以及返回build()
实例的Server
方法。
class ServerBuilder {
private $name = "";
private $location = null;
public function name($name) {
$this->name = $name;
return $this;
}
public function location($location) {
$this->location = $location;
return $this;
}
/* add other setters here .. */
public function build() {
// here you ensure all properties have sane values
// if no php_version then set default etc
return new Server($name, $location, ..., ..., etc);
}
}
您可以使用它:
$builder = new ServerBuilder();
$server = $builder
->name("foo")
->location("bar")
->build();
答案 1 :(得分:0)
您可以将$request
变量传递给Server->create
或Sever->createFromObject
,无论您想要什么。 CreateRequest
或其他对象可以保存您需要的任何数据,稍后您可以检查例如。 null
,这些参数没有通过。
为每个可分离的部分创建更多方法。例如。 createServer($name, $location, $plan), setBackup(bool), setMysql($dbName)
,等等。并且只在创建服务器时调用所需的那些。