[英]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进行建模,因为它为我提供了更大的灵活性和更少的基础结构代码。
显然,这种技术仅在您只需要抽象一个方法的情况下才有效。 一旦抽象需要第二种方法,就需要引入适当的接口,或者最好是抽象基类。
因为界面或委托都可以使用,所以有点发麻。
在这种情况下首选委托的一个原因是,您实际上仅取决于方法,因此必须同时声明接口和方法,这有点多余。 如果您的进程类似于我的进程,则方法名称是显而易见的,但接口名称却不是,因为它实际上没有任何意义。 它是该方法的容器。 (而且我最终会得到与您几乎完全相同的名字。)
此外,委托还为您提供了使用静态方法的选项。 您的类仍依赖于抽象,因此,如果需要对类进行单元测试,则可以传入模拟方法。 我通常不喜欢静态方法,但这主要是因为它们会干扰可测试性。 但是,如果您是依赖委托而不是直接依赖函数,那么这无关紧要。
以我的观点(我确定),带接口的第二个选项是最好的。 这种情况是策略模式的典型示例。
NextRandomInt()
另一种实现,请使用Interface。 instance
方法或static
方法使用该方法由您决定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.