職場で、外部ファイル (Excel シート、テキスト ファイルなど) から値を取得し、それらの値を別のシステムに供給される複雑な命令に変換するこのアプリケーションを実行しています。
以下のコードは少し単純化されています (命令がなく、ロジックが非常に単純です) が、考え方は同じです。私には、さまざまな種類のビジネス ロジックを背後で実行する約 60 人の異なる翻訳者がいます。実行する引数を 1 つだけ取るものもあります。他のものは複数の引数を取ります。
抽象翻訳クラスがあります。クラスのユーザーは、2 つのパブリック メソッドを使用します。Translate を使用して翻訳ロジックを実行し、CanTranslate を使用すると、トランスレータが開始する準備ができているかどうかを確認できます。
この抽象クラスを使用する開発者は、実際のビジネス ロジックを含む DoTranslate メソッドを実装する必要があります。デフォルトでは、CanTranslate は常に true を返しますが、検証が必要な場合はオーバーライドできます。
抽象トランスレータの基本クラスは次のとおりです。
// Contains some base logic which is the same for all translators
public abstract class BaseTranslator
{
// Public translate method
public void Translate()
{
if (CanTranslate())
DoTranslate();
}
// Checks if we are ready to translate
// True by default
public virtual bool CanTranslate()
{
return true;
}
// This method is used to implement business logic
public abstract void DoTranslate();
}
具体的なトランスレータ クラスの実装は次のとおりです。
// Translates beer names
public class ReverseTranslator : BaseTranslator
{
// Use of properties to allow strongly typed arguments
// which can be seen by the developer at design time
public string BeerName { get; set; }
// Validation
public override bool CanTranslate()
{
if (BeerName.Equals("Budweiser") || BeerName.Equals("Stella"))
return true;
else
return false;
}
// Implementation of the business logic
public override void DoTranslate()
{
char[] letters = BeerName.ToCharArray();
Array.Reverse(letters);
Console.WriteLine(new string(letters));
}
}
そして、使用中はこんな感じです。
class Program
{
public static void Main(string[] args)
{
var translator = new ReverseTranslator();
translator.BeerName = "Stella";
translator.Translate();
translator.BeerName = "I'm not a beer";
// This line will not translate since it's not a valid beer name.
translator.Translate();
Console.ReadLine();
}
}
プロの:
- 特定のビジネス ロジックを保守可能な小さな単位に分離する
- 翻訳者は、アプリケーションの他の部分で簡単に再利用できます
- 翻訳者は簡単に単体テストできます
- プロパティにより、トランスレータのユーザーはどの引数が必要かを確認できます
私の問題:
- さまざまなコントローラ クラスが多くのトランスレータを使用しています。カップリングが多すぎる。
トランスレータの作成に Factory パターンを使用することを考えましたが、設計時にプロパティを引数のヒントとして使用できません。
したがって、基本的には、設計時に必要な引数を簡単に確認できるソリューションを探しています。同時に、各コントローラーに 30 個の新しい xTranslator ステートメントを持たせないことで結合を減らしたいと考えています。
PS: このコードには .NET 3.5 しか使用できません。