繁体   English   中英

C#最佳实践:使用委托或接口作为类依赖项

[英]C# Best Practice: Using a delegate or an interface as a class dependency

我有一个类,该类需要一种方法来检索具有最大值的随机整数值。 我不希望此类依赖特定的方式来检索该随机值(例如system.random)。 最好是:

(A)使用公共委托 (或func)

public delegate int NextRandomInt(int maxValue);

public class MyClass
{
    public NextRandomInt NextRandomInt { get; set; }

    public MyClass(NextRandomInt nextRandomInt)
    {
        NextRandomInt = nextRandomInt;
    }
}

(B)使用公共界面

public interface IRandomIntProvider
{
    int NextInt(int maxValue);
}

public class MyClass
{
    public IRandomIntProvider RandomIntProvider { get; set; }

    public MyClass(IRandomIntProvider randomIntProvider)
    {
        RandomIntProvider = randomIntProvider;
    }
}

(C)其他所有东西。

两种方式都可以。 我觉得使用委托将更容易实现,但接口更具可读性,并且在依赖注入出现时可能更容易。

这取决于您要使用委托或接口实现多少工作。

如果您的界面将只有一种或什至两种方法,则可以使用Func强制相同的行为。 否则我会使用interface s。

Mark Seemann在这里很好地解释了这一点: 链接

总结起来,他说:

只要有可能,我都倾向于使用委托而不是单方法接口对API进行建模,因为它为我提供了更大的灵活性和更少的基础结构代码。

显然,这种技术仅在您只需要抽象一个方法的情况下才有效。 一旦抽象需要第二种方法,就需要引入适当的接口,或者最好是抽象基类。

因为界面或委托都可以使用,所以有点发麻。

在这种情况下首选委托的一个原因是,您实际上仅取决于方法,因此必须同时声明接口和方法,这有点多余。 如果您的进程类似于我的进程,则方法名称是显而易见的,但接口名称却不是,因为它实际上没有任何意义。 它是该方法的容器。 (而且我最终会得到与您几乎完全相同的名字。)

此外,委托还为您提供了使用静态方法的选项。 您的类仍依赖于抽象,因此,如果需要对类进行单元测试,则可以传入模拟方法。 我通常不喜欢静态方法,但这主要是因为它们会干扰可测试性。 但是,如果您是依赖委托而不是直接依赖函数,那么这无关紧要。

以我的观点(我确定),带接口的第二个选项是最好的。 这种情况是策略模式的典型示例。

  1. 如果您认为系统中可能存在NextRandomInt()另一种实现,请使用Interface。
  2. 如果您认为应将其作为事件或回调的原因执行,请选择委托。
    否则,只需将方法作为类成员即可。 是否要以instance方法或static方法使用该方法由您决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM