2009-10-30 66 views
6

我有一些我經常在網站上看到的代碼示例,我想改進它,並希望得到一些幫助。通常,我會在page_load方法中看到5-10個嵌套的if語句,旨在消除無效的用戶輸入,但這看起來很難看,很難讀取和維護。如何整理太多的if語句以提高可讀性

您會如何建議清理以下代碼示例?我試圖消除的主要事情是嵌套的if語句。

string userid = Request.QueryString["userid"]; 

if (userid != ""){ 
    user = new user(userid); 

    if (user != null){ 
     if (user.hasAccess){ 
      //etc. 
     } 
     else{ 
      denyAccess(INVALID_ACCESS); 
     } 
    } 
    else{ 
     denyAccess(INVALID_USER); 
    } 
} 
else{ 
    denyAccess(INVALID_PARAMETER); 
} 

正如你所看到的,這很快就會變得非常混亂!在這種情況下,我應該遵循哪些模式或做法?

回答

20

通過使用Guard Clauses先生

string userid = Reuest.QueryString["userid"]; 

if(userid==null) 
return denyAccess(INVALID_PARAMETER); 

user = new user(userid); 
if(user==null) 
return denyAccess(INVALID_USER); 

if (!user.hasAccess) 
return denyAccess(INVALID_ACCESS); 

//do stuff 

PS。用返還或通過否定的條件拋出一個錯誤

+0

慣於到達那種情況下,因爲有一個用戶==空的情況下,先生 – lemon 2009-10-30 11:35:00

+0

案件用戶== null已被選中。報表寫入的順序非常重要。你必須從檢查對象爲空,然後非法值等開始。 – 2009-10-30 11:35:54

+0

我想我喜歡這種方法,感謝您的建議。 – NickGPS 2009-10-30 11:35:56

3

可以清理嵌套了一下,寫的if-else鏈:

string userid = Reuest.QueryString["userid"]; 

if (userid == "") { 
    denyAccess(INVALID_PARAMETER); 

} else if (null == (user = new user(userid))){ 
    denyAccess(INVALID_USER); 

} else if (!user.hasAccess){ 
    denyAccess(INVALID_ACCESS); 

} else { 
    //etc. 
} 
+0

實際上這是一個有趣的方法。我喜歡它,因爲你不需要多個返回語句。謝謝! – NickGPS 2009-10-30 11:52:31

1

最好將其拆分成多個方法(函數)。它會很容易understand.If一些新的人讀他/她理解的邏輯的代碼只是讀取的方法名稱本身(注:方法的名稱應該表達它做什麼測試)。樣品代碼:

string userid = Request.QueryString["userid"]; 

if(isValidParameter(userId)){ 
    User user=new User(userId); 
    if(isValidUser(user)&&isUserHasAccess(user)){ 
     //Do whatever you want 
    } 
} 

private boolean isUserHasAccess(User user){ 
    if (user.hasAccess){ 
     return true; 
    }else{ 
     denyAccess(INVALID_ACCESS); 
     return false; 
    } 
} 

private boolean isValidUser(User user){ 
    if(user !=null){ 
     return true; 
    }else{ 
    denyAccess(INVALID_USER); 
    return false; 
    } 
} 


private boolean isValidParameter(String userId){ 
    if(userid !=""){ 
     return true; 
    }else{ 
denyAccess(INVALID_PARAMETER); 
    return false; 
    } 
} 
+0

我覺得好主意。你有沒有一個例子說明這可能有助於結束當前方法的執行? – NickGPS 2009-10-30 13:19:55

+0

+1,這是最好的解決方案恕我直言 – rcampbell 2009-10-30 18:07:04