2014-11-08 27 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