在对象构造函数中封装逻辑?

时间:2013-10-23 12:28:55

标签: oop encapsulation

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

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

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对象中创建一个新的构造函数,该构造函数将接受ErrorCode并在那里执行逻辑。但我不确定这是最好的方式。

你会怎么做?

2 个答案:

答案 0 :(得分:0)

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

简单的解决方案 - 不同的想法。如果它看起来很难,那就把它移掉就可以了。

答案 1 :(得分:0)

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

从本质上讲,使用在整个应用程序中提供消息的实体并没有错 - 因为它是Singleton的一个很好的例子。但是,您可以将消息分区到不同的容器中。一个简单的例子:

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生成的不同类包含。