我正在查看SOLID原则,并为SRP遇到了一些代码。
我有这个代码,但我不知道为什么我有一个接口,以下面的方式声明?这对我有什么好处?我找到了here,它显示了一个解决方案,但它并没有真正解释代码如何更好地工作或为什么事情就是这样。
我不明白的是:
IGateUtility _gateUtility;
在public class ServiceStation
中,正下方是IGateUtility
作为参数的构造函数。为什么这样写的?什么是我必须通过的参数。
public class ServiceStation
{
IGateUtility _gateUtility;
public ServiceStation(IGateUtility gateUtility)
{
this._gateUtility = gateUtility;
}
public void OpenForService()
{
_gateUtility.OpenGate();
}
public void DoService()
{
//Check if service station is opened and then
//complete the vehicle service
}
public void CloseForDay()
{
_gateUtility.CloseGate();
}
}
public class ServiceStationUtility : IGateUtility
{
public void OpenGate()
{
//Open the shop if the time is later than 9 AM
}
public void CloseGate()
{
//Close the shop if the time has crossed 6PM
}
}
public interface IGateUtility
{
void OpenGate();
void CloseGate();
}
答案 0 :(得分:2)
构造函数参数是依赖注入的一个示例,特别是称为"构造函数注入" (这通常是首选技术)。
ServiceStation
不应该包含IGateUtility
的逻辑,因为它与门没有任何关系(单一责任原则)。它确实需要使用门,所以你传递一个实现IGateUtility
的对象。
一般来说,我不认为继承在这种情况下是有意义的;但有一个原则是:
首选组合继承
这基本上意味着;注入(组合)对象以获取对其行为的访问权,而不是从它们继承。
答案 1 :(得分:1)
SRP代表单一责任原则。所以服务类没有任何责任来创建 ServiceStationUtility 对象。
让我们通过一个例子来理解它。假设您没有使用任何界面,那么您的代码如下所示。
public class ServiceStation
{
ServiceStationUtility _gateUtility;
public ServiceStation()
{
this._gateUtility = new ServiceStationUtility();
}
public void OpenForService()
{
_gateUtility.OpenGate();
}
public void DoService()
{
//Check if service station is opened and then
//complete the vehicle service
}
public void CloseForDay()
{
_gateUtility.CloseGate();
}
}
public class ServiceStationUtility
{
public void OpenGate()
{
//Open the shop if the time is later than 9 AM
}
public void CloseGate()
{
//Close the shop if the time has crossed 6PM
}
}
因此,现在不使用界面,Service Station类还负责创建 ServiceStation 对象,这违反了 SRP 。
第二个问题
如果您想为 OpenGate()和 CloseGate()提供不同的实现,请使用以上代码。你必须创建另一个类。因此,您必须再次更改 ServiceStation 类中的代码。
使用界面的原因
接口允许依赖注入。这意味着对象创建任务被委托给第三方。这意味着 ServiceClass 不需要知道谁是该对象的实际提供者。 ServiceClass ,请关注 在这里界面。对于 ServiceStationUtility 课程,此课程也不知道谁将使用它。
因此,界面有助于构建松散耦合架构