Альтернатива многим параметрам в методе?

Я думаю, что я передаю слишком много параметров в методе

Когда пользователь отправляет форму, например:

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

Решит ли это передача объекта (объекта)?

1

Решение

Посмотрите на образец строителя:

намерение шаблона построения состоит в том, чтобы найти решение для анти-шаблона телескопического конструктора. Анти-шаблон телескопического конструктора возникает, когда увеличение комбинации параметров конструктора объекта приводит к экспоненциальному списку конструкторов. Вместо использования многочисленных конструкторов в шаблоне компоновщика используется другой объект — компоновщик, который шаг за шагом получает каждый параметр инициализации, а затем сразу возвращает полученный построенный объект.

В основном с помощью шаблона компоновщика вы гарантируете, что ваш объект всегда инициализируется правильно, с дополнительными свойствами или без них.

Вы бы создали дополнительный ServerBuilder класс, который будет иметь установщик для каждого свойства / параметра для сервера и 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();
3

Другие решения

  1. Вы можете передать $request переменная к Server->create, или же Sever->createFromObject, что вы хотите. CreateRequestили другой объект может содержать любые данные, которые вам нужны, а затем вы проверяете, например, null, какие параметры не были переданы.

  2. Создайте больше методов для каждой разделяемой части. Например. createServer($name, $location, $plan), setBackup(bool), setMysql($dbName), и так далее. И вы звоните только тем, кто вам нужен, когда вы создаете сервер.

0

По вопросам рекламы [email protected]