[英]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');
}
}
?>
優點:
缺點:
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.