单一责任原则混淆

本文关键字:原则 责任 单一 | 更新日期: 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对象,该对象可用于SendReceive
如果IModem接口没有被分割成两个单独的接口,那么返回void就可以了(您可以看到. net SqlConnection Open方法作为返回void的相同方法概念的示例)。但是为了强调和展示SRP原则,作者决定给出这个例子,通过这个设计,Dial(String number)应该返回IModemDataExchange的结果,该结果可用于拨号后的其他操作。

记住:

  • 单一职责:每个接口只负责一个职责
  • 打开扩展,关闭修改:
  • Liskov替换:接口被传递,所以你可以替换所有使用接口的不同类
  • 接口隔离:由于隔离,一个更改不会影响另一个更改!
  • 依赖倒置:通过使用接口和实现你的SOLID规则,你已经为控制倒置和依赖注入做好了准备!

所以当你创建一个IModemConnection的实例并调用Dial(123456)时,它会传回一个接口IModemDataExchange的实例。这基本上是说,一旦你连接了,你就有兴趣从使用接口IModemDataExchange的任何类交换数据。课程上的其他内容都是额外的!