我忙于重构一个类,现在怀疑如何重构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)
{
...
...
}
这是一个好方法吗?如果不是,为什么?
答案 0 :(得分:2)
我想你可能想要保持目前的结构。方法应该真正设计为做一件事。您的_validateXml方法检查该方案是否存在,这听起来像XML验证方法应该做的事情。检查方案不一定是转换方法需要做的事情,因为方案是可选的。
答案 1 :(得分:2)
如果你考虑每种方法的责任,就应该更容易理解这一点。
转换函数执行转换,并将验证委托给另一个方法。 Transform只知道它需要将文件的名称传递给验证器函数 - 它并不关心验证器函数对它的作用。
因此,在我看来,将文件相关的检查等保留在验证功能中是有意义的。或者,如果您想进一步进行重构,可以将文件加载和文件检查拆分为另一种方法,或者创建一个完全独立的类来执行验证。