2014-11-08 60 views
0

我想請教一下最佳實踐在我的情況:結構或Messenger在.NET 4.5

假設我有這樣的代碼

Class BaseClass { 
    protected bool CheckResponse(string response) { 
     if (response == SomeCondition) 
     { 
      runErrorMessages(); 
      return true; 
     } 
      return false; 
    } 
} 

Class DerivedClassA { 
    ConnectorClass myConnector = new ConnectorClass(); 
    private void myCommand(string req) { 
     string resp = await myConnector.SendDataToServer(req); 
     if (!CheckResponse(resp)) 
      DoSomething1(); 
    } 
} 

Class ConnectorClass { 
    public async Task<string> SendDataToServer(string req) { 
     string resp = await Server.WaitForResponse(req); 
     return resp; 
    } 
} 

最好是像現在一樣或低於這個嗎?

Abstract Class BaseClass { 
    public BaseClass() { 
     Messenger.Default.Register<string>(CheckResponse); 
    } 

    public abstract callWhateverDeriveWant(); 

    private void CheckResponse(string response) { 
     if (response == SomeCondition) 
     { 
      runErrorMessages(); 
     } else 
      callWhateverDeriveWant(); 
    } 
} 

Class DerivedClassA { 
    ConnectorClass myConnector = new ConnectorClass(); 
    private void myCommand(string req) { 
     await myConnector.SendDataToServer(req); 
    } 

    public abstract callWhateverDeriveWant() { 
     callSomething(); 
    } 
} 

Class ConnectorClass { 
    public async Task SendDataToServer(string req) { 
     string resp = await Server.WaitForResponse(req); 
     Messenger.Default.Send(resp); 
    } 
} 

對於您的信息,會有很多從BaseClass派生的派生類,它的行爲與DerivedClassA類似。

請幫我找出解決我的案子的最佳方法。

以前感謝。

+0

當然,如果你的方法命名比結構更具功能性,那麼這兩種情況會更好。例如'callWhateverDeriveWant'應該是'afterResponseChecked'或類似的東西。 – theMayer 2014-11-08 12:24:26

+0

對不起。什麼方法callWhateverDeriveWant做的是做一些事情後,我知道如果答案不是錯誤的迴應。 – 2014-11-08 13:21:16

回答

0

在這種情況下,您的問題的答案取決於您的程序的意圖。這兩種情況在邏輯上根本不相同。

在您的第一個示例中,您正在檢查某個條件的響應。據推測,這是一個屬於自己方法的複雜程序。編寫代碼的方式,CheckResponse發生在基類中,而派生類實際上包含處理其布爾結果的條件邏輯語句。當所有類的CheckResponse方法相同時,這將是一個很好的使用案例,但是對結果的處理方式會有所不同。

在第二個示例中,您的CheckResponse方法和使用它的條件邏輯存在於基類中,因此兩者的所有用法在所有實例中都是相同的;一旦條件邏輯被執行,你只能在你的派生類上調用一個方法。派生類不知道CheckResponse的結果是什麼。

那麼,你試圖達到哪個目標?

+0

沒錯,實際上我的CheckResponse在所有派生類中都是相同的,所有派生類都有類似的行爲。 fyi,這裏發生了什麼實際上,如果響應返回一些錯誤,那麼它會顯示錯誤消息,並返回到應用程序(不做任何事情),所有派生類必須做同樣的事情。 – 2014-11-08 13:16:05

+0

這是有道理的,去與第二個選項,然後避免多重複代碼行。 – theMayer 2014-11-08 14:49:14