我有两种情况:
-使用静态服务
public class TestService {
public static bool FunctionA(int b) {
return b > 0;
}
}
-使用界面
public interface ITestSerice {
bool FunctionA(int b);
}
public class TestService : ITestService {
public bool FunctionA(int b) {
return b > 0;
}
}
静态类非常简单。但我经常看到更多的人使用接口(或高于依赖注入)。请向我解释为什么以及何时使用该界面?(哪个更好?
对不起,如果我的英语太差:D
如果使用静态方法,则调用该方法的代码将绑定到该特定实现。
如果您的类通过接口使用该方法,则允许您使用该接口的不同实现。
静态方法使您的类紧密耦合。接口方法使它们松散耦合。 在面向对象范式中,松耦合和紧耦合有什么区别?
为什么开发人员通常更喜欢依赖接口而不是静态实现,问题的答案位于称为依赖反转原则的 SOLID 原则之一。
我试着给你举个例子: 假设您有一家商店。你想买果汁机并开始销售果汁。让我们想象一下,在您的城镇中,机器有多种变体,每种变体都有不同形式的不同果汁风味罐,这使得它们在机器方面是不可替代的。假设您想在商店中销售所有口味,这样您需要有 4 或 5 台不同的机器。如果所有香精生产商都有一个风味罐标准,这样您就可以使用一台机器来制作任何这些口味,那不是很好吗?
所以在我的例子中,统一风味锅的标准是接口。拥有该标准使您的果汁机独立于风味锅的实施,因此您可以随时更改机器中的风味,甚至创建自己的风味。
请向我解释为什么以及何时使用该界面?
它归结为拉动与推送- 这意味着是您的类负责定义或拉取服务实现,还是其他人负责注入或推动该服务实现?
如果你打算使用静态版本,那么你基本上只将你的类与该服务实现耦合。
最重要的一点是考虑是否可以在没有服务实现的具体依赖的情况下对类进行单元测试 - 如果使用静态版本,则无法做到这一点。
如果您使用接口版本 - 您可以在为类编写单元测试时提供服务的模拟实现。 有意义吗?
哪个更好?
使用接口。