私は多くのメソッドを持っています(この場合、Webサービスからのものですが、これは影響ありません)。彼らはすでにの固定リリースバージョンであり、変更されません、それは私に適応することです。私は既に私のプロジェクトにプロキシーを持っていますが、実際には私はすでにそれを呼び出しています。プロジェクトは大丈夫です。同様の機能を実行する異なるクラス(異なるメソッドとタイプ)を呼び出すことができますか?
このクラスのメインメソッドは、いくつかの入力パラメータ(トランザクションタイプ、およびトランザクションデータを含むXML文字列)を取得します。 TransactionTypeに基づいて、どのクラスとメソッドを呼び出すべきかを知っています。また、提供されたXMLから既に構築された、期待される型変数を提供する必要があります。ここでは、およそ、(私は右ここにコードを持っているので、構文エラーのための私を許していない)それが今日である方法は次のとおりです。
public class MyClass()
{
public void MyMethod(string TransactionType, string XML)
{
switch(TransactionType) {
case "1":
type1VO type1Object = (new Deserializer<Type1>()).XML2Object(XML);
ws = new WSProxy1();
string response = ws.Method1(type1VO);
//
// lots of other lines of code that use type1VO, type1Object, the response, etc.
//
break;
case "2":
type2VO type2Object = (new Deserializer<Type2>()).XML2Object(XML);
ws = new WSProxy2();
string response = ws.Method2(type2VO);
//
// same structure here, but handling types specific for "case 2"
//
break;
}
...
}
}
そして、それは延々と続きます。今日、このコードはすでに15種類のトランザクションタイプを処理していますが、上記の方法で開発されました。私はこれを変更しようとしているので(他のシステムにはこのロジックが必要なので、このコードを自分自身のライブラリに移動します)、コードの改良によって利益を得ることができると思いました。また、上記のコードはかなり減少しています。各ケースの特定の型を扱う行が増えています。例を挙げました。
私はそれほど心配していませんが、私にはそれほどエレガントではないようです。何らかのデザインパターンがこれを処理できるという印象を与え、トランザクションタイプごとに繰り返すのではなく、1つのブロックでトランザクションを処理できるという印象を与えました。たぶん私は間違っていて、これはできません、私はちょうどそれを繰り返しコードを見て "感じた"。
.NET v2.0ではC#ですが、他のバージョンや言語に関する回答がある場合は気になりません。私は関与している概念についてもっと気にしています。私はあなたが提供できるヒントについて皆様に感謝しています。彼らはいつも素晴らしいです。
これはヒントのおかげで、かなり上品なデザインです。各ケースのコードを特定のアダプタに転送するので、メインの実行に単一のブロックを使用する意向はまだありません。それは確かであり、確かに、それぞれのコードに1つのメインブロックを達成する方法がない場合、おそらくそれは私がやる方法です。ありがとう、たくさんの人、それは素敵なアプローチでした。 –
@Charlie Brown:OK、gotcha - 私はあなたが長いswitch文からリファクタリングコードを探していると思った。すべての呼び出しに1つのコードブロックを使用する方法がわかりません。おそらくそれはいくつかの複雑な反射で行うことができます - しかし、それは努力の価値があるかどうかわかりません... – blech
そうではありません。あなたのアプローチを使いました。ここの事実は、基本サービスがより良い方法で設計されているはずであるということです。 –