2017-01-15 4 views
1

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

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

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

https://refactoring.com/catalog/introduceParameterObject.html – David

ответ

3

Посмотрите на builder pattern:

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

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

Вы бы создать дополнительный 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(); 
+0

строитель модель интересна. Каждый поставщик сервера имеет разные требования к свойствам. Я мог бы использовать оператор switch (имя поставщика) в методе 'build()'. –

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

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

Смежные вопросы