2017-01-15 30 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類,該類將爲服務器的每個屬性/參數設置一個setter,並返回Server實例的build()方法。

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

生成器模式是有趣的。每個服務器提供者都有不同的屬性要求我可以在'build()'方法中使用switch語句(提供者名稱)。 –

0
  1. 您可以將$request變量傳遞給Server->create,或Sever->createFromObject,任何你想要的。 CreateRequest,或其他對象可以容納您需要的任何數據,稍後您會檢查哪些是例如。 null,哪些paramteres沒有通過。

  2. 爲每個可分離部件創建更多方法。例如。 createServer($name, $location, $plan), setBackup(bool), setMysql($dbName)等等。你只需要在創建服務器時調用你需要的那些。