2009-10-30 9 views
6

Geliştirmek istediğim web sitelerinde sıkça görebildiğim ve bazı yardımlardan memnun kalacağım bir kod örneği var. Çoğunlukla geçersiz kullanıcı girdisini ortadan kaldırmayı amaçlayan bir page_load yönteminde 5-10 iç içe if ifadeleri görüyorum, ancak bu çirkin görünüyor ve okumak ve korumak zordur.Okunabilirlik ifadeleri varsa çok fazla sayı nasıl toplanır

Aşağıdaki kod örneğini temizlemenizi nasıl öneriyorsunuz? Ortadan kaldırmaya çalışıyorum ana şey ifadeler iç içe.

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

Gördüğünüz gibi, bu çok hızlı bir şekilde oldukça dağınıklaşır! Bu durumda takip etmem gereken herhangi bir desen veya uygulama var mı? Guard Clauses efendim

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 kullanarak

cevap

20

. kullanmak Geri dönüş ya da koşulların olumsuzlaştırılmasıyla Sen iç içe biraz temizleyebilir bir hata

+0

alışkanlık ulaşmak: sadece yöntem adı kendisi (yöntem adı ne yaptığını testi ifade etmelidir Not) okuyarak bazı yeni kişi o/o mantığı anlayan kodunu okur understand.If kolay olacak bu durumda bir kullanıcı var == null üstünde bir dava var efendim – lemon

+0

Dava == null kullanıcısı zaten kontrol edildi. İfadelerin yazıldığı sıra önemlidir. Null, sonra yasadışı değerler vb. Için nesneleri kontrol ederek başlamalısınız. –

+0

Sanırım bu yaklaşımı beğendim, tavsiye için teşekkürler. – NickGPS

3

atmak ve bir if-else zinciri yazma:

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

Bu aslında ilginç bir yaklaşım. Bunu beğendim çünkü çok sayıda iade beyanı ihtiyacını ortadan kaldırıyorsunuz. Teşekkürler! – NickGPS

1

Daha iyi çoklu yöntemleri (işlevler) bölmek .Bu .Sample kodu:

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

İyi bir fikir bence. Bunun mevcut yöntemin yürütülmesine nasıl yardımcı olabileceğine dair bir örnek var mı? – NickGPS

+0

+1, bu en iyi çözüm IMHO – rcampbell