如何重构方法并在一种方法中保持拆分验证?

时间:2013-04-12 16:36:32

标签: php refactoring

我忙于重构一个类,现在怀疑如何重构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 个答案:

答案 0 :(得分:2)

我想你可能想要保持目前的结构。方法应该真正设计为做一件事。您的_validateXml方法检查该方案是否存在,这听起来像XML验证方法应该做的事情。检查方案不一定是转换方法需要做的事情,因为方案是可选的。

答案 1 :(得分:2)

如果你考虑每种方法的责任,就应该更容易理解这一点。

转换函数执行转换,并将验证委托给另一个方法。 Transform只知道它需要将文件的名称传递给验证器函数 - 它并不关心验证器函数对它的作用。

因此,在我看来,将文件相关的检查等保留在验证功能中是有意义的。或者,如果您想进一步进行重构,可以将文件加载和文件检查拆分为另一种方法,或者创建一个完全独立的类来执行验证。