在工作中,我正在开发一个应用程序,它从外部文件(Excel表格、文本文件等)中获取值,并将这些值转化为复杂的指令,然后输入到另一个系统中。
以下代码有点简化(没有指令和非常简单的逻辑),但思想是相同的。我有大约60个不同的翻译器,运行不同种类的业务逻辑。有些只需要一个参数就可以运行,而其他一些则需要多个参数。
我有一个抽象的翻译器类。该类的用户将使用两个公共方法: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语句来减少耦合。
附注:我限制使用.NET 3.5。