2015-07-14 7 views
0

Я начал разрабатывать библиотеку обработки изображений и решил пойти с Scrutinizer для тестирования и проверки в одном прохладном пакете, но я не уверен, как оптимизировать мой код, чтобы ограничить некоторые статистические данные, которые ухудшают общий Гол.Оптимизация оценки Scrutinizer

Код, который я показываю ниже, имеет «Условия: 6», что подталкивает его к значению «В». Существует нет ничего особенного в коде, он проверяет наличие потенциальных отсутствующих разрешений или нетрудоспособных каталогов и бросать исключения соответственно, таким образом понижая счет есть довольно трудно без кода реагировать совершенно по-разному:

/** 
* Writes the image to a writable source 
* 
* @param int $compression Compression level 0-9, defaults to 9 
* 
* @throws \StandardExceptions\IOExceptions\FileNotWritableException 
* @throws \StandardExceptions\IOExceptions\DirectoryNotFoundException 
* @throws \StandardExceptions\IOExceptions\DirectoryNotWritableException 
*/ 
public function write($compression = 9) 
{ 
    $path = $this->getPath(); 
    $directory = $path->getPathInfo(); 
    if (file_exists($path->getPathname()) && !$path->isWritable()) { 
     throw new FileNotWritableException(); 
    } elseif (!is_dir($directory->getPathname())) { 
     throw new DirectoryNotFoundException(); 
    } elseif (is_dir($directory->getPathname()) && !$directory->isWritable()) { 
     throw new DirectoryNotWritableException(); 
    } 
    $options = [ 
     'png_compression_level' => $compression, 
     'resolution-x' => $this->getDensity()->getDensity(), 
     'resolution-y' => $this->getDensity()->getDensity(), 
     'resolution-units' => $this->mapDensity($this->getDensity()), 
    ]; 
    $this->getImage()->save($path, $options); 
} 

Я не» я понимаю, почему у меня 6 условий, в то время как там есть только 3 условия. И я не понимаю, как я мог это понизить!

ответ

0

Я попытался разбить мой код на еще больше функций, которые теперь делают код менее читаемым ИМО и создает много бесполезных функций в классе, но по крайней мере он работает, и я смог уменьшить условия до 1 или 2 в каждом блок кода эффективно выводит мой код на «А» повсюду.

/** 
* Writes the image to a writable source 
* 
* @param int $compression Compression level 0-9, defaults to 9 
*/ 
public function write($compression = 9) 
{ 
    $this->checkFileIsWritable(); 
    $this->checkDirectoryExists(); 
    $this->checkDirectoryIsWritable(); 
    $options = [ 
     'png_compression_level' => $compression, 
     'resolution-x' => $this->getDensity()->getDensity(), 
     'resolution-y' => $this->getDensity()->getDensity(), 
     'resolution-units' => $this->mapDensity($this->getDensity()), 
    ]; 
    $this->getImage()->save($this->getPath(), $options); 
} 

/** 
* Checks that the path is valid and throws exceptions 
* if there is something wrong 
* 
* @throws \StandardExceptions\IOExceptions\FileNotWritableException 
*/ 
public function checkFileIsWritable() 
{ 
    $path = $this->getPath(); 
    if (file_exists($path->getPathname()) && !$path->isWritable()) { 
     throw new FileNotWritableException(); 
    } 
} 

/** 
* Checks that the path is valid and throws exceptions 
* if there is something wrong 
* 
* @throws \StandardExceptions\IOExceptions\DirectoryNotFoundException 
*/ 
public function checkDirectoryExists() 
{ 
    $path = $this->getPath(); 
    $directory = $path->getPathInfo(); 
    if (!is_dir($directory->getPathname())) { 
     throw new DirectoryNotFoundException(); 
    } 
} 

/** 
* Checks that the is writable 
* 
* @throws \StandardExceptions\IOExceptions\DirectoryNotWritableException 
*/ 
public function checkDirectoryIsWritable() 
{ 
    $path = $this->getPath(); 
    $directory = $path->getPathInfo(); 
    if (is_dir($directory->getPathname()) && !$directory->isWritable()) { 
     throw new DirectoryNotWritableException(); 
    } 
} 
+1

Три строки, которые у вас есть сейчас, являются предложениями охраны - и вы всегда можете разделить три на новую функцию - возможно, что-то вроде 'isFileWritable()'. Даже с линиями, все еще там - это более читаемо, но это потому, что вам не нужно читать три новые функции. –