2016-02-25 9 views
2

Я работаю с проектом с открытым исходным кодом и думал, что было бы неплохо реализовать автоматические изменения кода с phpmd.PHP Mess Detector дает ложные срабатывания

Это показало мне много ошибок в кодировании, которые я уже исправил. Но один из них сделал мне любопытным.

Рассмотрим следующий метод:

/** 
* 
* @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 is never necessary

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

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

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

+1

Только наконечник. В CodeSniffer есть альтернатива Sniff: https://github.com/object-calisthenics/phpcs-calisthenics-rules#1-only-x-level-of-indentation-per-method –

ответ

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

+0

Это хорошее решение, предупреждение не появляется. Но мне пришлось переместить 'return' за пределы этого, если, поскольку этот файл является необязательным в структуре плагина. – CarlosCarucce

+1

В любом случае, я не думаю, что просто удаление всех предложений _else_ является хорошей идеей, поскольку ее базовое заявление о признаке присутствует во всех языках программирования. Вы знаете, есть ли способ отключить этот тест в PHPMd? – CarlosCarucce

+1

Я лично не использую PHPMd. Я вырос до абсолютно ** любви ** PHPStorm (это IDE). Это так хорошо, и он предоставляет инструменты для форматирования кода, подсказки, предложения и т. Д. Мой код намного лучше, чем использовать его. –

2

Я не использую phpmd, но ясно, что ваш оператор if является предложением охраны. Guard пункты не нужны 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; 
    } 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^