簡體   English   中英

將設置傳遞給對象時,哪種方法更好?

[英]Which approach is better when passing settings to an object?

我想使用$ config設置對象中字段的初始值。 就更簡潔,更可維護的代碼而言,哪種方法更好? 另外,我想補充一點,該對象將在工廠中初始化,而不是直接由客戶端初始化。

1.我將$ config傳遞給對象

<?php
class UserGreeting {
  private $config;
  public function __construct($config){
      $this->config=$config;
  }

  public function greetings(){
    echo 'Hello, '.$this->config->get('username');
  }
}
?>

優點:

  • 容易傳遞多個參數

缺點:

  • 該類與$ config耦合(是嗎?)。 我的意思是,除了特定的$ config接口和參數命名約定外,我不能在不引入$ config的情況下將此類插入另一個程序
  • 客戶端代碼不必知道
    對象,但這是更普遍的想法

2.我在對象外部手動設置字段

<?php
class UserGreetingFactory{
   public function __construct($config){
     $this->config=$config;
   }
   public function getUserGreeting(){
     $userGreeting=new UserGreeting();
     $userGreeting->setUserName='John Doe';
     return $userGreeing;
   }
} 

class UserGreeting {
   private userName;
   public function setUserName($userName){
     $this->userName=$userName;
   }
   public function greetings(){
     echo "Hello, {$this->userName}";
   }
  }
?>

優點:

  • 該類不在乎他的參數來自哪里

  • 可以輕松重復使用

  • 更容易測試(是嗎?)。 我的意思是我不必處理$ config

缺點:

  • Factory \\ Builder必須知道要傳遞哪些參數

  • 設置程序和傳遞參數的大量額外代碼

用ctor注入的第一種解決方案。 但是我可以通過實際的對象來代替特殊的配置。 在您的情況下為User對象。

<?php
class UserGreeting
{
    private $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function greet()
    {
        printf('Hello, %s!',  $this->user->getName());
    }
}

考慮到您的想法,我會堅持一個變量。 如果您想按方法傳遞變量,則會有很多多余的代碼。

從OOP的角度來看,不應將其放在單個變量中。 對象具有屬性。 用戶名實際上是一個屬性,因此您應該將其用作屬性。 這意味着在PHP類中,需要在創建對象時將其設為公共變量並設置變量。

由於依賴項注入,第一種方法更好。 此代碼將更易於測試和維護。 第三種方法是使用“訪問者”模式來注入依賴項。

您可以將靜態類與靜態方法一起使用。 實際上,它們就像CONSTS,但是您可以在靜態config類中強制執行各種規則-例如,它們符合接口。

Config::getUserName();

這樣,如果您要面對一整套配置對象,則可以確保它們對於每個期望值都至少具有一個條目-否則將發出警告。

當然,這可能取決於您的情況,我希望在很多情況下您都不願意這樣做-但我會全力以赴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM