一般的な形式のテキストファイルがあります。
ThreadID, MethodName, [Param1 | Param2 | ... ]
そして、私は次のようなユーティリティクラスを持っています:
public static class Util
{
public static List<double> Foo(List<double> Source, double Scale)
{
List<double> l = new List<double>(Source);
for (int i = 0; i < l.Count; i++)
{
l[i] = l[i] * Scale;
}
return l;
}
public static void Fud(List<double> Source, string Name)
{
//... Chart Series
}
public static bool Fee(CustomClass MyClass, double Limit1, int Limit2)
{
//... Test MyClass values against input limits
return true; // false;
}
}
そのため、テキストファイルからメソッド名を指定し、ケース内のメソッドに引数を解析して渡すスイッチ/ケースを使用していました。sudoコードは、次のような効果があります。
static void Main(string[] args)
{
List<string> TextFile;
List<double>[] Register = new List<double>[3]; //lists containing data that is moved, mutated and converted to CustomClass
CustomClass MyClass = new CustomClass();
bool Passed = false;
foreach (var line in TextFile)
{
string methodName = Util.ParseMethod(line); //parsed from file
string param1, param2, param3, param4 = Util.ParseParams(line); //parsed from file
switch (methodName)
{
case "Foo":
Register[param1] = Util.Foo(Register[param2], param3);
break;
case "Fud":
Util.Fud(Register[param1], param3);
break;
case "Fee":
Passed = Util.Foo(MyClass, param1, param2);
break;
}
}
}
ロジックを分割するのが嫌いで、新しいユーティリティメソッドを開発するたびに、別のcaseステートメントを手動で追加する必要があります。設計時のエラー(文字列/更新のタイプミス)は通常、実行時にのみキャッチされるため、caseステートメントの保守が困難になりました。
これをすべてファクトリアーキテクチャに変換しようとしましたが、さまざまなメソッド定義に対応できないようです。Utilityクラスを廃止し、ファクトリインターフェイスを使用して独自のクラスで各メソッドを定義したいと考えていました。
public interface IRecipe
{
string GetFactoryKey();
string SerializeArgs(object[] args);
object[] DeserializeArgs(string args);
??? DoWork(???);
}
問題は、ユーティリティクラスの各メソッドがどれほど異なっていたか、インターフェイスで適切に定義する方法が見つからないことです。私が望む最終結果は、foreachループのスイッチをジェネリックコードに置き換えることができ、すべての本質的なロジック、解析、メソッド定義、エラーチェック、および検証が、メソッド呼び出し元ではなく、ファクトリインターフェイスを実装する各クラスで定義されることです。 。私が何をしたいのかわからないので、私はグーグルするものが不足しています。