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;
}
}
Дальнейшее чтение: