2008-10-20 6 views
5

Каков наилучший способ форматирования для удобства чтения?Форматирование инструкции if для удобочитаемости

if (strpos($file, '.jpg',1) && file_exists("$thumbsdir/$file") == false || strpos($file, '.gif',1) && file_exists("$thumbsdir/$file") == false || strpos($file, '.png',1) && file_exists("$thumbsdir/$file") == false) { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 

ответ

17

Я бы извлек логику «является изображением» в свою собственную функцию, что делает читаемым if, а также позволяет централизовать логику.

function is_image($filename) { 
    $image_extensions = array('png', 'gif', 'jpg'); 

    foreach ($image_extensions as $extension) 
     if (strrpos($filename, ".$extension") !== FALSE) 
      return true; 

    return false; 
} 

if (is_image($file) && !file_exists("$thumbsdir/$file")) { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 
+0

Выше того, что я просил, спасибо за помощь! – PHLAK 2008-10-20 08:27:46

4
if ((strpos($file, '.jpg',1) || 
    strpos($file, '.gif',1) || 
    strpos($file, '.png',1)) 
    && file_exists("$thumbsdir/$file") == false) 
{ 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 
+1

есть конкретная причина, чтобы положить || ORs на конце строки и && AND в начале? – nickf 2008-10-20 13:12:38

+0

@nickf: Если бы я должен был догадаться, это связано с тем, чтобы не смешивать парнеры, но определенно приносит больше вреда, чем пользы. – eyelidlessness 2008-10-25 08:52:26

1

Я бы разбить его, как это, отложив вопрос избыточности:

if (strpos($file, '.jpg',1) && file_exists("$thumbsdir/$file") == false 
|| strpos($file, '.gif',1) && file_exists("$thumbsdir/$file") == false 
|| strpos($file, '.png',1) && file_exists("$thumbsdir/$file") == false) { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 

@Fire Lancer's ответ устраняет избыточность хорошо.

+0

+1 для простого ответа, который я изначально искал. – PHLAK 2008-10-20 08:26:47

2

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

if (file_exists("$thumbsdir/$file") == false) 
{ 
    if(strpos($file, '.jpg',1) || 
    strpos($file, '.gif',1) || 
    strpos($file, '.png',1) 
    { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
    } 
} 
+0

Не хотите ли вы сделать это наоборот, потому что file_exists будет дороже? – 2008-10-20 07:30:02

+0

@Neil: Это будет зависеть от того, как часто тесты не удались. Я сомневаюсь, что тесты strpos() будут неактивными, поэтому они не будут сокращать количество тестов против file_exists(). Тем не менее, тест file_exists() завершится неудачно, когда миниатюра уже сгенерирована, пропуская тесты имени файла. – 2008-10-20 07:34:01

2
function check_thumbnail($file) 
{ 
    return (strpos($file, '.jpg',1) && file_exists("$thumbsdir/$file") == false || 
      strpos($file, '.gif',1) && file_exists("$thumbsdir/$file") == false || 
      strpos($file, '.png',1) && file_exists("$thumbsdir/$file") == false); 
} 

if (check_thumbnail ($file)) { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 

После извлечения логики в отдельную функцию, вы можете уменьшить дублирование:

function check_thumbnail($file) 
{ 
    return (strpos($file, '.jpg',1) || 
      strpos($file, '.gif',1) || 
      strpos($file, '.png',1)) && 
      (file_exists("$thumbsdir/$file") == false); 
} 
2

Я бы отделите сослагательное наклонение, поскольку есть некоторые повторяющиеся коды там. Также я стараюсь как можно скорее выйти из программы:

if (!strpos($file, '.jpg',1) && !strpos($file, '.gif',1) && !strpos($file, '.png',1)) 
{ 
    return; 
} 

if(file_exists("$thumbsdir/$file")) 
{ 
    return; 
} 

createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
1

Я считаю следующее, чтобы читать больше, используя getimagesize(). Я пишу это с головы, так что может потребоваться некоторая отладка.

Вертикальный код более читабельен, чем горизонтальный, imho.

// Extract image info if possible 
    // Note: Error suppression is for missing file or non-image 
if (@$imageInfo = getimagesize("{$thumbsdir}/{$file}")) { 

    // Accept the following image types 
    $acceptTypes = array(
     IMAGETYPE_JPEG, 
     IMAGETYPE_GIF, 
     IMAGETYPE_PNG, 
    ); 

    // Proceed if image format is acceptable 
    if (in_array($imageInfo[2], $acceptTypes)) { 

     //createThumb(...); 
     //fwrite(...); 

    } 

} 

Мир + счастливый взлом.

1

Может также бросить свои два цента.

if(!file_exists($thumbsdir . '/' . $file) && preg_match('/\.(?:jpe?g|png|gif)$/', $file)) { 
    createThumb($gallerydir . '/' . $file, $thumbsdir . '/' . $file, $thumbsize); 
    fwrite($log, date('Y-m-d @ H:i:s') . ' CREATED: ' . $thumbsdir . '/' . $file . "\n"); 
} 

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

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