2011-10-27 118 views
-1

我有一種情況,我調用層疊樣式的函數/方法。請參閱以下示例以瞭解說明和問題。我希望我知道這種情況的一些技術詞彙。人們會更容易理解我在說什麼。調用層次結構問題

public static class test 
{ 
    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     if (Login("johndoe","password")) 
     { 
      if(checkForSomething("johndoe")) 
      { 
       DoOpenDashboard(); 

       // Now it opens dashboard, it has several buttons. 
       // Each button does several different things 
       // On this example I am just giving you two level of hierarchy 
       // but in my actual program, there are 7 levels. 
      } 
     } 
    } 

    public static bool Login(string userid, string password) 
    { 
     //valid user 
     return true; 
    } 

    public static bool checkForSomething(string userid) 
    { 
     return true; 
    } 

如果child方法運行成功,我該如何避免進程返回到上一個調用方法/函數?

例如,登錄方法正在調用checkForSomething("johndoe")。如果通過checkForSomething("johndoe"),則它將通過調用DoOpenDashboard打開儀表板窗口。此時我的流程不應該返回到checkforsoemthing,然後登錄。我希望這是有道理的。

+0

你不能有一個包含它的類的名字相同的方法。 –

+0

你的問題很難理解。你能不能僅僅爲你的類添加一個靜態變量或者實例成員來指示你的用戶是否已經登錄了,如果這個布爾值的值是false,你只能調用'Login()'? –

+0

請在代碼塊外面移動問題......現在不可能讀取它。 –

回答

0

對此問題不太清楚。你的僞代碼顯示你的類的構造函數中調用的Login()方法。如果這真的是你的代碼的工作方式,那麼爲了防止再次調用Login,你需要避免創建這個類的新實例。

不過,我覺得你真的問的是箭反模式:

http://codinghorror.com/blog/2006/01/flattening-arrow-code.html

編輯

我試圖避免複製&粘貼,但由於原來的職位似乎沒有足夠清楚,這是從上面鏈接的編碼恐怖的選擇:

在適當的情況下,我通過執行以下步驟將箭頭代碼弄平:

  1. 用guard子句替換條件。此代碼..

    如果(SomeNecessaryCondition){// 函數體代碼 }

    ..效果更好的保護條款:(!SomeNecessaryCondition)

    如果 { 拋出新RequiredConditionMissingException; } // 函數體代碼

(請注意,還有其他技術也上市,但我認爲,這第一個就足夠了現在)

這樣,每個額外的檢查沒有按不會導致另一個嵌套if - 一旦檢查失敗,方法調用失敗。

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    if (AllSystemsGo()) 
    { 
     DoOpenDashboard(); 
    } 
} 

private bool AllSystemsGo() 
{ 
    if (!Login("johndoe","password")) 
     return false; 

    if (checkForSomethingEvil("johndoe")) 
     return false; 

    if (!checkForSomethingImportant()) 
     return false; 

    return true; 
} 
+1

它不是一個構造函數,它只是一個與類相同名稱的方法(注意它有一個返回類型)。 – R0MANARMY

+0

這顯然不是一個或另一個。顯然這不是編譯代碼,而且你的猜測和我的一樣好,無論返回值是錯誤還是方法名稱都是錯誤的。 – sq33G

+0

我正在使用「扁平化箭頭代碼」中所述的確認檢查,只要有可能。我從代碼vb6代碼中提取業務邏輯。由於我正在提取和理解業務邏輯,因此我陷入了可怕的境地。 – Shai

0

你是否努力確保:這也可以不具有的button1_Click調用返回一個布爾值(真成功的,虛假的失敗),並立即在故障狀態返回假的函數拋出異常完成你的方法只被檢查一次?也許你需要多次查詢一些屬性,但只測試一次。

private bool? canLogin; 
private bool? somethingOk; 

private bool CanLogin 
{ 
    get 
    { 
     if (canLogin == null) 
      canLogin = Login("johndoe","password"); 
     return canLogin.Value; 
    } 
} 

private bool SomethingOk 
{ 
    get 
    { 
     if (somethingOk == null) 
      somethingOk = checkForSomething("johndoe"); 
     return somethingOk .Value; 
    } 
} 

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    if (this.CanLogin && this.SomethingOk && // other checks) 
    { 
     DoOpenDashboard();    
    } 
}