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

1

Другие решения

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

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

2