2

我正在使用一个开源项目,并认为使用phpmd实现自动代码修订是个好主意。

它向我展示了许多我已经修复的编码错误。但是其中一个让我很好奇。

考虑以下方法:

/**
 * 
 * @param string $pluginName
 */
public static function loadPlugin($pluginName){
    $path = self::getPath()."plugins/$pluginName/";
    $bootPath = $path.'boot.php';
    if(\is_dir($path)){

        //Autoload classes
        self::$classloader->add("", $path);

        //If theres a "boot.php", run it
        if(is_file($bootPath)){
            require $bootPath;
        }

    }else{
        throw new \Exception("Plugin not found: $pluginName");
    }
}

在这里,phpmd 说Else 从来没有必要

...永远不需要带有 else 分支的 if 表达式。您可以以不需要 else 的方式重写条件,并且代码变得更易于阅读。...

is_dir只要给定路径是文件或根本不存在,就会返回 false,因此,在我看来,此测试根本无效。

有没有办法解决它,或者可能只是忽略这样的情况?

4

2 回答 2

2

我不使用phpmd,但很明显你的if陈述是一个保护条款。保护子句不需要else分支,你可以像这样安全地重构你的代码:

/**
 * @param string $pluginName
 * @throws \Exception if plugin cannot be found
 */
public static function loadPlugin($pluginName)
{
    $path = self::getPath() . "plugins/$pluginName/";
    if (!\is_dir($path)) {
        throw new \Exception("Plugin not found: $pluginName");
    }

    // Autoload classes
    self::$classloader->add("", $path);

    // If there is a "boot.php", run it
    $bootPath = $path . 'boot.php';
    if (is_file($bootPath)) {
        require $bootPath;
    }
}

进一步阅读:

于 2016-03-06T06:03:02.527 回答
1

该结构的替代方案是这样的:

public static function loadPlugin( $pluginName ) {
    $path = self::getPath() . "plugins/$pluginName/";
    $bootPath = $path . 'boot.php';
    if( \is_dir( $path ) ) {
        // Autoload classes
        self::$classloader->add( "", $path );
        // If theres a "boot.php", run it
        if ( is_file( $bootPath ) ) {
            require $bootPath;
        }
        // A return here gets us out of the function, removing the need for an "else" statement
        return;
    }

    throw new \Exception( "Plugin not found: $pluginName" );
}

虽然我不确定它是否是解决方案,但它是一种避免这种else情况的技术。在尝试阅读代码时,其他条件会增加复杂性,并且允许函数在没有其他条件的情况下“流动”可以使它们更具可读性。

于 2016-02-25T01:58:07.637 回答