gpt4 book ai didi

c# - 我怎样才能减少这段代码中的耦合

转载 作者:行者123 更新时间:2023-11-30 12:31:23 27 4
gpt4 key购买 nike

在工作中,我正在做这个应用程序,它从外部文件(Excel 工作表、文本文件...)中获取值,并将这些值转换为复杂的指令,然后输入另一个系统。

下面的代码有点简化(没有指令和非常简单的逻辑)但想法保持不变。我有大约 60 名不同的翻译人员,他们在背后运行不同类型的业务逻辑。有些只需要一个参数就可以运行。其他人采用多个参数。

我有一个抽象翻译类。该类的用户将使用 2 个公共(public)方法: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();
}
}

专业人士:

  • 将特定业务逻辑分离到小型可维护单元中
  • 翻译器很容易在应用程序的其他部分重用
  • 翻译器可以很容易地进行单元测试
  • 属性允许翻译器的用户查看需要哪些参数

我的问题:

  • 不同的 Controller 类使用许多转换器。我有太多耦合。

我想过使用工厂模式来创建翻译器,但后来我无法在设计时使用属性作为参数提示。

所以我基本上是在寻找一种解决方案,在设计期间您可以轻松地看到需要哪些参数。同时,我希望通过不让每个 Controller 都有 30 个新的 xTranslator 语句来减少耦合。

PS:我只能将 .NET 3.5 用于此代码。

最佳答案

different controller classes are using many translators. I have too much coupling

Controller 类应该只依赖于抽象,即BaseTranslator。因此,您不会有太多耦合,实际上它将是松散耦合的代码。通过依赖注入(inject)(例如通过构造函数参数)将依赖注入(inject)到您的 Controller 中。

使您的代码仅依赖于基类型的一个选项 - 在基类中创建字符串属性 Text:

BaseTranslator translator = new ReverseTranslator(); // inject implementation
translator.Text = "Stella";
translator.Translate();
translator.Text = "I'm not a beer";
translator.Translate();

关于c# - 我怎样才能减少这段代码中的耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593784/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com