方法中许多参数的替代方法?

时间:2017-01-15 13:45:09

标签: php software-design

我想我在方法中传递了太多参数

当用户提交表单时,例如:

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) { 
        }   
   } 
}

传递一个对象(实体)会解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

查看builder pattern

  

构建器模式的目的是找到伸缩构造器反模式的解决方案[需要引证]。当对象构造函数参数组合的增加导致构造函数的指数列表时,发生伸缩构造函数反模式。构建器模式不是使用大量构造函数,而是使用另一个对象(构建器),它逐步接收每个初始化参数,然后立即返回生成的构造对象。

基本上使用构建器模式,您可以保证您的对象始终正确初始化,包含或不包含可选属性。

您将创建一个额外的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)

  1. 您可以将$request变量传递给Server->createSever->createFromObject,无论您想要什么。 CreateRequest或其他对象可以保存您需要的任何数据,稍后您可以检查例如。 null,这些参数没有通过。

  2. 为每个可分离的部分创建更多方法。例如。 createServer($name, $location, $plan), setBackup(bool), setMysql($dbName),等等。并且只在创建服务器时调用所需的那些。