PHP Mess Detector дает ложные срабатывания

Я работаю с проектом с открытым исходным кодом и подумал, что было бы неплохо внедрить автоматические исправления кода с помощью 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 говорит, что остальное никогда не нужно

... Выражение if с ветвью else никогда не требуется. Вы можете переписать условия так, чтобы остальное не было необходимо, и код стал проще для чтения....

is_dir будет возвращать false всякий раз, когда данный путь является файлом или просто не существует, так что, на мой взгляд, этот тест вообще не действителен.

Есть ли способ исправить это или просто игнорировать подобные случаи?

2 ответа

Решение

Альтернативой структуре является что-то вроде этого:

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 состояние. Остальные условия могут усложнить процесс чтения кода, а разрешение функции "течь" без каких-либо условий может сделать их более читабельными.

Я не пользуюсь 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;
    }
}

Дальнейшее чтение:

Другие вопросы по тегам