2017-10-10 60 views
-1

我想知道什麼是最好的做法/建議在這裏。假設我有一個提供操縱XMLElement的函數的類。應該在哪裏參數驗證發生,以避免重複代碼

class Foo 
{ 
    private $data; 

    public function setData(\SimpleXMLElement $data): void 
    { 
     $this->data = $data; 
    } 

    public function getElement():string 
    { 
     return $this->data->element; 
    } 
} 

類是在其他類中使用像這樣:

class Bar 
{ 
    public function fooBar(string $data) 
    { 
     $xml = new \SimpleXMLElement($data); 
     $foo = new Foo(); 

     $foo->setData($xml); 
     echo $foo->getElement(); 
    } 
} 

都應該setData()fooBar()驗證其參數?

還是確定如果只fooBar()驗證它的參數?

還是應該調用foobar()功能驗證其參數?

回答

1

它實際上取決於你的架構的細節。最近我已經開始有利於做法,看起來像這樣:

class User { 
    // some code 
    public function setEmail(EmailAddress $email) { .... 
} 

這基本上是用作:

$bob = new User; 
$bob->setEmail(new EmailAddress($param)); 

在這種情況下,確認實際發生的EmailAddress類的構造函數,會拋出一個例外,如果您試圖用非有效電子郵件地址進行實例化。

我認爲它的總稱是「價值對象」,但不要在此引用我的意思。儘管我對DDD作爲一個整體有着嚴重的懷疑(我覺得這有點矯枉過正,同時引入了一些「跨層次的混淆」),但我一直在向借用DDD方法進行編程的人們借鑑這一點。

+0

,使用戶類將完全依賴EmailAddress的類做驗證? – dev0

+0

這個想法是,你只能創建一個有效的'EmailAddress'實體。如果您嘗試製作無效的文件,則會引發異常。歸結起來就是:驗證電子郵件地址不是**用戶實體的責任。這是和外部*問題域*。 –