在工作中,我正在執行此應用程序,它從外部文件(Excel工作表,文本文件...)獲取值,並將這些值轉換爲複雜的指令,並將其傳送到另一個系統。如何減少此代碼中的耦合
下面的代碼是有點簡化(沒有指令和非常簡單的邏輯),但這個想法保持不變。我有大約60個不同的翻譯人員,他們運行着各種不同的業務邏輯。有些只需要一個參數就可以運行。其他人則有多個論點。
我有一個抽象翻譯類。該類的用戶將使用2個公共方法:翻譯運行翻譯邏輯,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();
}
}
Pro's:
- 在小維護單元
- 翻譯很容易在應用
- 翻譯人員可以很容易地進行單元測試
- 屬性允許翻譯的用戶看見哪個參數是的其它部分重用分離特定的業務邏輯需要
我的問題:
- 不同的控制器CLASSE s正在使用許多翻譯。我有太多的耦合。
我想過使用工廠模式創建翻譯器,但後來我不能在設計時使用屬性作爲參數提示。
所以我基本上尋找一個解決方案,在設計時你可以很容易地看到哪些參數是必需的。同時我希望通過不讓每個控制器擁有30個新的xTranslator語句來減少耦合。
PS:我被限制爲使用.NET 3.5代碼。
你如何確定哪一個翻譯器用於行? 你只是創建每種類型的翻譯器之一,並測試它是否CanTranslate? –