2013-02-26 75 views
0

我應該避免在我的代碼中有很長的序列化IF語句列表嗎?有時似乎不可避免,但我想知道這是否是我的缺乏經驗。我應該避免一長串IF聲明嗎?

例如,如果你正在處理圖像的用戶上傳了 - 你想給的任何錯誤,準確的反饋 - 你可能會碰到這樣的:

if($file["size"] == 0) { 
    throw new Exception("ERROR: File was empty"); 
} 

if (($file["type"] != "image/gif") 
|| ($file["type"] != "image/jpeg") 
|| ($file["type"] != "image/pjpeg") 
|| ($file["type"] != "image/png")) { 
    throw new Exception("ERROR: Image must be either GIF, PNG or JPEG!"); 
} 

if ($file["size"] > 2000000) { 
    throw new Exception("ERROR: Image must be than less 2MB!"); 
} 

    if ($file["error"] > 0) { 
    throw new Exception("UNKNOWN ERROR: ".$file['error']); 
} 

$imgDetails = getimagesize($file["tmp_name"]); 

if($imgDetails['channels'] != 3){ 
    throw new Exception("ERROR: Image must be RGB.)"; 
} 

if($imgDetails['0'] < 50 && $imgDetails['1'] < 50) { 
    throw new Exception("ERROR: Image must be larger then 50 x 50.)";   
} 

等等,等等等等直到最終文件通過所有測試並被處理。

這是「壞習慣」嗎?

回答

1

您可以使用in_array來縮短類型檢查,但通常這是一種很好的形式,除了將輸出直接從該函數中輸出外。如果使用類完成此操作,則可能需要使用異常而不是直接推送錯誤輸出。

迴歸早,迴歸常。

+0

這聽起來很明智! :)雖然我正在閱讀Exceptions,但這個博客讓我感到困惑。以上哪種類型的例外...? http://blogs.msdn.com/b/kcwalina/archive/2007/01/30/exceptionhierarchies.aspx – 2013-02-26 19:14:04

+0

這取決於你想走多遠。如果你想做的只是傳遞一個消息,你可以放棄使用基本的異常類。設置異常類允許您以不同的方式處理每種類型的異常,這可能不是必需的。 – datasage 2013-02-26 19:17:42

+0

謝謝,我已經更新了現在的問題 - 只是爲了好的措施:) – 2013-02-26 20:29:45

0

我發現平時的那種,如果您鏈​​正在談論罐頭變成一個函數的散列圖,用一些選擇器作爲它們的關鍵。

如果你有一個散列圖,就像$processImage = { "image/gif" => function processGIF(){blah} }你可以訪問O(1)中的每個函數而不是O(n/2)的平均值(假設調用的正態分佈也是不準確的)。你知道,哪些事情無關緊要,除非事情發生很多。

然後就可以調用使用$processImage["image/gif"]();該功能(我認爲這是有效的語法,我已經做了比PHP多很多JS在最近幾年。)

我確實覺得HashMap的做法是相當擴展性和雖然可以閱讀,所以它有這樣做。

有重構這些的好處,當然..但在很多情況下,這樣做的好處是最小/情況。