2008-10-20 6 views
5

Cách tốt nhất để định dạng tính năng này là dễ đọc?Định dạng câu lệnh if để có thể đọc được

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"); 
} 

Trả lời

17

Tôi muốn trích xuất logic "là hình ảnh" thành chức năng của riêng nó, làm cho số if dễ đọc hơn và cũng cho phép bạn tập trung vào logic.

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

Trên và vượt ra ngoài những gì tôi đã hỏi, cảm ơn sự giúp đỡ! – PHLAK

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

là có một lý do cụ thể để đưa || OR vào cuối dòng và && ANDs khi bắt đầu? – nickf

+0

@nickf: Nếu tôi phải đoán, nó phải làm với việc không trộn lẫn các parens, nhưng chắc chắn có hại nhiều hơn là tốt. – eyelidlessness

1

tôi sẽ phá vỡ nó lên như thế này, đặt sang một bên những vấn đề dư thừa:

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 câu trả lời giải quyết các dự phòng tốt.

+0

+1 cho câu trả lời đơn giản mà tôi đã tìm kiếm ban đầu. – PHLAK

2

Các file_exists kiểm tra dường như là không đổi cho mỗi loại tập tin, do đó, không so sánh chúng trừ khi việc kiểm tra file_exists đã được thông qua.

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

Bạn sẽ không muốn làm điều đó theo cách khác bởi vì file_exists sẽ đắt hơn? –

+0

@Neil: Tùy thuộc vào tần suất kiểm tra thất bại. Tôi nghi ngờ các bài kiểm tra strpos() sẽ thất bại thường xuyên, vì vậy họ sẽ không cắt giảm số lượng các bài kiểm tra đối với file_exists(). Tuy nhiên, kiểm tra file_exists() sẽ thất bại khi một hình thu nhỏ đã được tạo ra, bỏ qua các kiểm tra tên tệp. –

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"); 
} 

Sau khi giải nén logic để một chức năng riêng biệt, bạn có thể làm giảm sự trùng lặp:

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

check_thumbnail không phải là một cái tên tốt - một giá trị trả về có nghĩa là nó tồn tại hay không tồn tại? Có lẽ is_existing_thumbnail() hoặc non_existent_thumbnail() sẽ là một tên tốt hơn - trước đây yêu cầu đảo ngược logic, tất nhiên. –

2

tôi sẽ tách các IFS là có một số mã lặp lại trong đó. Ngoài ra, tôi cố gắng thoát khỏi một thói quen càng sớm càng tốt:

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"); 
+0

Tôi đồng ý với việc thoát khỏi ASAP thường lệ, tôi nghĩ tôi sẽ làm điều đó. – PHLAK

1

Tôi tìm những thứ sau để dễ đọc hơn bằng cách sử dụng getimagesize(). Tôi đang viết điều này ra khỏi đầu của tôi vì vậy nó có thể yêu cầu một số gỡ lỗi.

Mã dọc có thể đọc được nhiều hơn ngang, 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(...); 

    } 

} 

Hòa bình + hacking hạnh phúc.

1

Cũng có thể ném hai xu của tôi trong.

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"); 
}