0

私を混乱させたのは簡単な問題です。

2 つのクラスと 1 つの辞書があります (例のために簡略化しています)。

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ます。

ResultErrorCode を受け入れるオブジェクトに新しいコンストラクターを作成し、そこでロジックを実行することを考えました。しかし、これが最善の方法であるかどうかはわかりません。

どのようにしますか?

4

2 に答える 2

0

Result クラスと Error クラスを分けている理由がわかりません。両方が 1 つのこと (あるイベントの結果) を表す場合、それを表す 1 つのオブジェクトにカプセル化する必要があります。次に、そのクラス内で辞書をプライベートに保つことができます。

簡単な解決策 - 考え方を変えてください。固いと感じたら、その原因となっている部分を取り除いてください。

于 2013-10-23T12:31:13.857 に答える
0

.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メソッドは、ある種のシングルトン、またはアプリケーション全体で使用される静的クラスになります。VSによって生成された異なるクラスによって囲まれる異なるresxファイルにそれらを置くことで、メッセージタイプを互いに分離することができます。

于 2013-10-23T12:33:26.893 に答える