【问题标题】:Encapsulating logic in an object constructor?在对象构造函数中封装逻辑?
【发布时间】:2013-10-23 12:28:55
【问题描述】:

这是一个让我困惑的简单问题。

我有两个类和一个字典(为了示例而简化):

class Result {       
    public string Description;
}

class Error {
    public int ErrorCode;
}

Dictionary<int, string> errorCodeToMessage = new Dictionary<int, string> {
    { 0, "Item not found" },
    { 1, "Connection error" }
}

在我继承的代码库中,我经常看到这一行:

Result result = new Result {
    Description = errorCodeToMessage[error.ErrorCode];
}

我不希望字典被全部使用,我希望将此逻辑封装在 Result 对象或 Error 对象中。

我考虑在Result 对象中创建一个新的构造函数,它将接受一个错误代码并在那里执行逻辑。但我不确定这是不是最好的方法。

你会怎么做?

【问题讨论】:

    标签: oop encapsulation


    【解决方案1】:

    在 .NET 中,您应该为此使用 ResourceManager。这样,您就可以将所有可能的消息封装在它们所属的位置。

    本质上,使用在整个应用程序中提供消息的实体没有任何问题——因为它是单例的一个很好的例子。但是,您可以将消息划分到不同的容器中。一个简单的例子:

    enum ErrorCode
    {
        SomethingIsWrong,
        AnotherThingIsWrong,
        UserIsAnIdiot
    }
    

    ErrorCodes.resx 文件中:

    <data name="SomethingIsWrong" xml:space="preserve">
        <value>Something is wrong. Sorry!</value>
    </data>
    <data name="AnotherThingIsWrong" xml:space="preserve">
        <value>Another thing is wrong. Sorry!</value>
    </data>
    <data name="UserIsAnIdiot" xml:space="preserve">
        <value>You're an idiot! '{0:dd-MMM-yyyy}' is not a future date!</value>
    </data>
    

    你可以这样使用:

    public void GetErrorMessage(ErrorCode errorCode)
    {
        //ErrorCodes is a class accompanying the ErrorCodes.resx file
        var rm = new ResourceManager(typeof(ErrorCodes));
    
        //or with a CultureInfo instance if you want localized messages
        return rm.GetString(errorCode.ToString());
    }
    

    这个GetErrorMessage 方法将在某种单例中,或者在整个应用程序中使用的静态类中。您可以将彼此之间的消息类型分开,将它们放入不同的 resx 文件中,这些文件将由 VS 生成的不同类包围。

    【讨论】:

    • 我同意在这个例子中你写的是正确的,但它如何回答我的问题?我仍然必须像使用此 Dictionary 一样使用 ResourceManager
    • @the-lights 在这个特定的用例中没有什么问题——它是一个单例——你的应用程序中的一个“全局事物”。我已经用一个例子更新了答案。
    • 这就是我最终做的事情
    【解决方案2】:

    我不明白为什么你有单独的 Result 和 Error 类。如果两者都描述一件事——某个事件的结果——那么它们应该被封装在一个代表它的对象中。然后,您可以在该类中保持字典私有。

    简单的解决方案 - 以不同的方式思考。如果它看起来很难,请删除使它如此的位。

    【讨论】:

    • 为了示例,我简化了对象,但它们确实有不同的目的。 Result对象其实是具体的验证结果,Error对象是一般的系统错误对象。
    • 一个面向对象的人会正确地认为错误是一种特殊的结果。也许这是另一种看待它的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多