私は非常に大きなクラスAを持っており、多くのメンバーがいます。また、Aオブジェクトを持っているときに構築できる非常に大きなクラスBがあります。Bオブジェクトがある場合、Aオブジェクトを作成できます。Aは検証機能を備えた一種のViewModelであり、Bは簡単にプロットできるグラフィカルな記述であるため、両方が必要です。
この変換を行う方法は?
これが私がやりたいことを説明するための例です:
class A
{
string s;
string t;
string u;
string v;
enum a;
enum b;
enum c;
enum d;
enum e;
Dictionary<enum, string> dict;
}
class B
{
string someString; // is essentially A.a + A.b + A.c + A.s with some rules.
int someValue; // is essentially dict.TryGetValue(enum.Entry);
string anotherString;
// ... and lots of others
}
もちろん、いくつかのマッピングを実行してBオブジェクトを構築するのは簡単であり、A=>Bを構築するルールを逆にしてプレーンなB=>Aマッピングを作成することはそれほど難しくありません。
したがって、質問は次のとおりです。
- それを達成するためのよく知られたパターンはありますか?
- そのようなことを行うデフォルトのC#の方法はありますか?
そのような単純なものを書き留めると、収まらないように見え、数百行のコードになってしまいます。
SomeStringConverter、SomeValueConverter、...などのパーツのコンバータークラスの種類について考えました。
- マッピングを行うためのルールとともに、Aの必要なメンバーを抽象化するにはどうすればよいですか。
- A=>BおよびB=>Aを実行する最も簡単な方法を持つように、これらのルールをどのように記述できますか。
編集: ここでのパターンは、「GoFデザインパターン」ではなく「ベストプラクティス」を意味します。
BクラスのSomeStringはある種の「セレクター」であり、描画オプションを選択します。これは常に25文字の長さで、クラスAの列挙型はそれらの文字を選択しますが、ほとんどの場合1対1ではありません。
たとえば、次のように考えます。Aa = "Filled"、Ab = "SingleCoordinate"、Ac = "DrawHints"は、SomeString=のような結果になります。
"Y**D***RR****---***---***"
つまり、このような文字列を取得するには組み合わせが重要ですが、組み合わせから、Aオブジェクトに設定する必要のある列挙型を導出できます。
Edit2:
マッピングルールを両方の方法で使用する方法に特に興味があります。つまり、Aa="Filled"とAb="SingleCoordinate"を組み合わせて、Ac = "DrawHints"と組み合わせると、(部分文字列)"Y**D***RR"
になり、その部分文字列は次のようになります。そのAaは「Filled」などに設定する必要があります。