C# .NET4.5中的结构或通讯器

C# .NET4.5中的结构或通讯器,c#,.net-4.5,mvvm-light,C#,.net 4.5,Mvvm Light,我想询问关于我的最佳实践: 假设我有这种代码 Class BaseClass { protected bool CheckResponse(string response) { if (response == SomeCondition) { runErrorMessages(); return true; } return false; } } Class

我想询问关于我的最佳实践:

假设我有这种代码

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);
    }
}
仅供参考,将有许多派生自基类的派生类,其行为与DerivedClassA类似

请帮我找出解决我的案子的最好办法


谢谢。在这种情况下,您的问题的答案取决于您的程序的意图。这两种情况在逻辑上完全不同

在第一个示例中,您正在检查响应的某些条件。这大概是一个复杂的过程,属于它自己的方法。按照编写代码的方式,CheckResponse发生在基类中,而派生类实际上包含处理其布尔结果的条件逻辑语句。当CheckResponse方法在所有类中都是相同的,但对结果所做的操作不同时,这将是一个很好的用例

在第二个示例中,您的CheckResponse方法和使用它的条件逻辑存在于基类中,因此这两种方法在所有实例中的所有使用都是相同的;只有在执行了条件逻辑之后,才能对派生类调用方法。派生类不知道CheckResponse的结果是什么


那么,您想要实现哪一个目标呢?

如果您的方法命名更具功能性而非结构化,那么这两种情况肯定会更好。例如,callWhateverDeriveWant应该在响应检查或类似的内容之后进行。对此表示抱歉。方法callWhateverDeriveWant要做的是在我知道响应是否为错误响应之后做一些事情。没错,实际上我的CheckResponse在所有派生类中都是相同的,并且所有派生类都会有类似的行为。仅供参考,这里实际发生的情况是,如果响应返回一些错误,那么它将显示错误消息,然后返回到应用程序,不执行任何操作,所有派生类都必须执行相同的操作。使用第二个选项以避免多行重复的代码是有意义的。