4

私は説明的であるように努めました:)それは、コーディングの問題自体というよりも、むしろプログラミングスタイルの問題です。

私たちが持っているとしましょう:

A:

public class MyDict {
     public Dictionary<int,string> dict;
     // do custom-serialization of "dict"
     public void SaveToFile(...);
     // customized deserialization of "dict"
     public void LoadFromFile(...);
} 

B:

public class MyDict : Dictionary<int,string>
{

}

プログラミングスタイルの問題では、どのオプションがより良いでしょうか? クラス B: 外部で逆シリアル化されます。

主な問題は次のとおりです。新しいクラスを作成する方が良いですか (これにはプロパティが 1 つしかありません - opt A: のように)、新しい派生クラスを作成します - opt B: のように? ストリームへの追加/削除と逆シリアル化以外のデータ処理は必要ありません。

前もって感謝します!

4

7 に答える 7

6

なぜ新しいクラスを作成する必要があるのですか? というか、なぜそれ自体をロードおよび保存できるクラスでなければならないのでしょうか。他の場所にメソッドを持たないのはなぜですか:

public void SaveDictionary(Dictionary<int, string> dictionary, string fie)

public Dictionary<int, string> LoadDictionary(string file)
于 2010-03-19T18:31:55.140 に答える
1

オプション B を選択します。ディクショナリをバックグラウンドで使用する (つまり、プライベート/保護する) 場合にのみオプション A を使用し、新しいクラスでディクショナリから限られた量の機能のみを公開します。

ディクショナリのすべての機能を提供し、次にいくつかの機能を提供する場合、明らかな解決策はディクショナリから継承することです (オプション B のように)

于 2010-03-19T18:38:23.720 に答える
1

私が別の質問のために書いた答えから:

基本クラスの API を「コピー」/公開する場合は、継承を使用します。機能を「コピー」するだけの場合は、委任を使用します。

この一例: List から Stack を作成したいとします。スタックには、ポップ、プッシュ、ピークのみがあります。スタックに push_back、push_front、removeAt などの種類の機能が必要ない場合は、継承を使用しないでください。

一方、どちらのアプローチも、あなたのジレンマに最も「適している」ようには見えません。おそらく、次のようなシリアル化作業全体を行うヘルパー クラスを作成できます。

class DictionarySerializationHelper
{
    public static void Serialize(Dictionary<int, String> d, File f){
    //...
    }
    public static Dictionary<int, String> Deserialize(File f)
    {
    //...
    }
}

静的メソッドを一般化して辞書の特殊化を許可することもできるため、このアプローチは優れている可能性があります。

于 2010-03-19T18:43:23.063 に答える
1

私の2セント:

サンプル A では、コードが Dictionary を使用しているという事実をクラスのコンシューマーから隠したい場合に、このスタイルを使用します。

サンプル B - 私が Dictionary を使用していることを消費者が知っていることを気にしない場合は、これを行います。

したがって、シナリオによっては、コーディングのスタイル/戦略を1つ選択できる場合があります。この考え方は、クラスをシリアル化する必要があるかどうかに関係なく...

この考え方についてのコメントをお待ちしております。

HTH。

于 2010-03-19T19:09:28.333 に答える
0

常にいくつかの拡張メソッドを使用できます

public static class DictionaryExtensions
{
    public static void Save<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string fileName)
    {
        // TODO: save logic
    }

    public static void Load<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string fileName)
    {
        // TODO: load logic
    }
}

または、使用するのがDictionary<int, string>

public static class DictionaryExtensions
{
    public static void Save(this Dictionary<int, string> dictionary, string fileName)
    {
        // TODO: save logic
    }

    public static void Load(this Dictionary<int, string> dictionary, string fileName)
    {
        // TODO: load logic
    }
}
于 2010-03-19T18:52:25.720 に答える
0

問題の最適な解決策は、ユースケースによって異なります。プロジェクトでクラスがどのように使用されているかを教えてくれません。非常に普通の Dictionary が必要で、読み込みと保存のためのメソッドを追加したいだけなら、拡張メソッドを見てください:

  public static class DictionaryExtensions
  {
        public static void Save(this Dictionary<int,string> yourDict, ...) {...}
        public static void Load(this Dictionary<int,string> yourdict, ...) {...}
  }

これで、次のようにインスタンスを保存できます。

Dictionary<int,string> dict = ....;
dict.Save(...);
于 2010-03-19T18:56:35.327 に答える
0

IDictionary<TKey, TValue>と の両方を実装する独自のクラスを作成できますIXmlSerializable(または、必要な機能を必要とするシリアル化インターフェイスは、独自に作成する必要がある場合があります)。何らかの理由で、IDictionary<TKey, TValue>から継承するよりもインターフェイスを実装する方が望ましいとどこかで読んだことを覚えていると思います。Dictionary<TKey, TValue>

編集: C# はディクショナリから継承し、KeyValuePairs を反復処理することは、ディクショナリ クラスからの継承について私が尋ねた質問です。これが悪い考えである理由については、そこにある回答を参照してください。

于 2010-03-19T19:19:14.253 に答える