2013-10-23 3 views
0

Это простая проблема, которая меня смутила.Инкапсулирующая логика в конструкторе объекта?

У меня есть два класса и словарь (упрощенный для примера):

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 и делать там логику. Но я не уверен, что это лучший способ.

Как вы это сделаете?

ответ

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.

+0

Я согласен с тем, что в этом примере то, что вы написали, правильно, но как оно отвечает на мой вопрос? Мне все равно придется использовать ResourceManager так же, как я использую этот словарь. –

+0

@ the-lights Ничего плохого в этом конкретном случае использования - это одноэлемент - «глобальная вещь» в вашем приложении. Я обновил ответ на примере. – BartoszKP

+0

Вот что я в итоге сделал –

0

Я не понимаю, почему у вас есть отдельные классы результатов и ошибок. Если оба описывают одну вещь - результат какого-то события - тогда они должны быть инкапсулированы в один объект, который ее представляет. Затем вы можете сохранить словарь в этом классе.

Простое решение - подумайте иначе. Если это кажется трудным, удалите бит, который делает это так.

+0

Я упростил объекты ради примера, но у них есть другая цель. Объект Result на самом деле является конкретным результатом проверки, а объект Error является общим объектом системной ошибки. –

+0

Человек ОО правильно будет утверждать, что ошибка - это особый вид результата. Возможно, это еще один способ взглянуть на это. – duffymo

Смежные вопросы