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

Oop 在对象构造函数中封装逻辑?,oop,encapsulation,Oop,Encapsulation,这是一个让我困惑的简单问题 我有两个类和一本字典(为了示例而简化): 我不希望字典被到处使用,我希望这个逻辑被封装在结果对象或错误对象中 我考虑在Result对象中创建一个新的构造函数,它将接受一个ErrorCode并在那里执行逻辑。但我不确定这是不是最好的办法 你会怎么做?我不明白为什么你会有单独的结果类和错误类。如果两者都描述一件事——某个事件的结果——那么它们应该封装在一个表示它的对象中。然后您可以在该类中保持字典的私有性 简单的解决方案——换一种方式思考。如果它看起来很难,请删除使其如此

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

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

我不希望字典被到处使用,我希望这个逻辑被封装在
结果
对象或
错误
对象中

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


你会怎么做?

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

简单的解决方案——换一种方式思考。如果它看起来很难,请删除使其如此的位。

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

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

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" }
}
枚举错误代码
{
一些令人愉快的事情,
另一件事是,
UserIsAnIdiot
}
ErrorCodes.resx
文件中:


有点不对劲。很抱歉
另一件事是错的。很抱歉
你是个白痴{0:dd-MMM-yyyy}不是将来的日期!
你可以这样使用它:

public void GetErrorMessage(ErrorCode ErrorCode)
{
//ErrorCodes是ErrorCodes.resx文件附带的一个类
var rm=新的ResourceManager(类型(错误代码));
//如果需要本地化消息,也可以使用CultureInfo实例
返回rm.GetString(errorCode.ToString());
}

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

为了示例,我简化了对象,但它们有不同的用途。结果对象实际上是一个特定的验证结果,错误对象是一个通用的系统错误对象。OO人员会正确地认为错误是一种特殊的结果。也许这是另一种看待它的方式。我同意在这个例子中你写的是正确的,但它如何回答我的问题呢?我仍然需要像使用这个一样使用ResourceManagerDictionary@the-在这个特定的用例中,这并没有什么错——它是一个单例——在您的应用程序中是一个“全局事物”。我已经用一个例子更新了答案。这就是我最后所做的
Result result = new Result {
    Description = errorCodeToMessage[error.ErrorCode];
}