在工作中,我正在做这个应用程序,它从外部文件(Excel 工作表、文本文件……)中获取值,并将这些值转换为复杂的指令,然后输入另一个系统。
下面的代码有点简化(没有指令和非常简单的逻辑),但想法保持不变。我有大约 60 名不同的翻译器,它们背后运行着不同类型的业务逻辑。有些只需要一个参数即可运行。其他人则采用多个论点。
我有一个抽象翻译类。该类的用户将使用 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();
}
}
专业人士:
- 在小的可维护单元中分离特定的业务逻辑
- 翻译器很容易在应用程序的其他部分重用
- 翻译器可以很容易地进行单元测试
- 属性允许翻译器的用户查看需要哪些参数
我的问题:
- 不同的控制器类正在使用许多翻译器。我有太多的耦合。
我曾想过使用工厂模式来创建翻译器,但后来我不能在设计时使用属性作为参数提示。
所以我基本上是在寻找一种解决方案,在设计期间你可以很容易地看到需要哪些参数。同时我希望通过不让每个控制器都有 30 个新的 xTranslator 语句来减少耦合。
PS:我仅限于此代码使用 .NET 3.5。