2013-04-12 63 views
1

我忙於重構一個類,現在懷疑如何重構2個方法。在這裏,他們是:如何重構方法並保持一個方法的分割驗證?

public function transform($transformXml, $importXml, $xsdScheme = '') 
{ 
    ... 
    if (!empty($xsdScheme)) { 
     $this->_validateXml($exportDoc, $xsdScheme); 
    } 
    ... 
} 

protected function _validateXml(DOMDocument $xml, $xsdScheme) 
{ 
    ... 
    if (!file_exists($xsdScheme)) { 
     throw new Exception('XSD file was not found in ' . $xsdScheme); 
    } 
    ... 
} 

參數$xsdScheme的方法transform是可選的,如果它是空的,比我們不會採用XSD驗證。之後我們調用方法_validateXml,我們正在檢查是否file_exists。這個驗證分爲兩部分,我不喜歡它,我更喜歡它在一個地方。所以,我會寫這樣的東西:

public function transform($transformXml, $importXml, $xsdScheme = '') 
{ 
    ... 
    if (!empty($xsdScheme)) { 
     if (!file_exists($xsdScheme)) { 
      throw new Exception('XSD file was not found in ' . $xsdScheme); 
     } 

     $this->_validateXml($exportDoc, $xsdScheme); 
    } 
    ... 
} 

protected function _validateXml(DOMDocument $xml, $xsdScheme) 
{ 
    ... 

    ... 
} 

這是一個很好的方法嗎?如果不是,爲什麼?

回答

2

我在想你可能想保留你目前的結構。方法應該被設計爲做一件事。您的_validateXml方法檢查該方案是否存在,這聽起來像XML驗證方法應該做的事情。檢查方案不一定是轉換方法需要做的事情,因爲方案是可選的。

+1

我同意這一點。另外,如果從其他函數調用'_validateXml',則必須在所有這些函數中執行驗證檢查。不是很乾。 –

2

如果您考慮每種方法的責任,應該更容易理解這一點。

轉換函數進行轉換,並將驗證委託給其他方法。轉換隻知道它需要將文件的名稱傳遞給驗證器函數 - 它並不關心驗證器函數如何處理它。

因此,在我看來,在驗證功能中保留文件相關檢查等是有意義的。或者,如果您想進行重構,可能會將文件加載和文件檢查拆分爲另一種方法,或者創建一個完全獨立的類來執行驗證。