单一责任原则混淆
本文关键字:原则 责任 单一 | 更新日期: 2023-09-27 18:06:06
我将通过这篇文章来理解SRP。初始有一个IModem接口
interface IModem : IDisposable
{
void Dial(String number);
void Send(char c);
char Recv();
}
这个接口有两个功能,一个是连接,另一个是数据交换,所以它应该在子接口中分解,并做什么:-
interface IModemConnection : IDisposable
{
void Dial(String number);
}
interface IModemDataExchange
{
void Send(char c);
char Recv();
}
直到这部分我明白了,但进一步上述接口改变如下,我无法得到什么公共IModemDataExchange Dial(String number);部分正在做。
interface IModemConnection : IDisposable
{
IModemDataExchange Dial(String number);
}
interface IModemDataExchange
{
void Send(char c);
char Recv();
}
谁能告诉我为什么我们要那样做?
教程中有这样一个句子
调制解调器连接实现成为数据的工厂交换实现
。据我所知,作者的目的是每当您拨打另一个调制解调器(当建立连接时)时返回一个数据交换对象。当然,关于信令部分还有其他问题,例如接受呼叫/请求等。然而,作者没有深入到这个细节,因为这可能有点偏离本教程的主题。在我看来,Dial返回一个IModemDataExchange,你可以在那个对象上调用Send/Recv。例如,
using (IModemConnection modemConnection = new IsdnModem())
{
IModemDataExchange dataExchange = modemConnection.Dial("123456")
dataExchange.Send("Hello");
}
正如作者所暗示的那样,Dial调用另一个调制解调器并创建一条数据路径,以便通过该数据路径进行通信。
我没有通读整篇文章,但是这个例子很简单:当您在IModemConnection
中只有public void Dial(String number);
时,通过这个接口使用的对象可以只是拨号和…好吧,如果他们只是拨号,因为void
返回"类型",调用此方法后没有其他事情可做。有点没用,对吧?
因此,为了在调用Dial
方法后做一些事情,接口现在返回IModemDataExchange
对象,该对象可用于Send
和Receive
。
如果IModem
接口没有被分割成两个单独的接口,那么返回void
就可以了(您可以看到. net SqlConnection Open方法作为返回void
的相同方法概念的示例)。但是为了强调和展示SRP原则,作者决定给出这个例子,通过这个设计,Dial(String number)
应该返回IModemDataExchange
的结果,该结果可用于拨号后的其他操作。
记住:
- 单一职责:每个接口只负责一个职责
- 打开扩展,关闭修改:
- Liskov替换:接口被传递,所以你可以替换所有使用接口的不同类
- 接口隔离:由于隔离,一个更改不会影响另一个更改!
- 依赖倒置:通过使用接口和实现你的SOLID规则,你已经为控制倒置和依赖注入做好了准备!
所以当你创建一个IModemConnection的实例并调用Dial(123456)时,它会传回一个接口IModemDataExchange的实例。这基本上是说,一旦你连接了,你就有兴趣从使用接口IModemDataExchange的任何类交换数据。课程上的其他内容都是额外的!