C# 单一责任原则混乱

C# 单一责任原则混乱,c#,solid-principles,C#,Solid Principles,我正在阅读这篇文章以了解SRP。 最初有一个IModem接口 interface IModem : IDisposable { void Dial(String number); void Send(char c); char Recv(); } 此接口有两个职责,一个是连接,另一个是数据交换,因此应在子接口中对其进行分解,并完成以下操作:- interface IModemConnection : IDisposable { void Dial(String

我正在阅读这篇文章以了解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拨号(字符串号)部分正在做

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调用另一个调制解调器并创建一个数据路径,以便通过该数据路径进行通信。这也是关于工厂模式的。

教程有这样一句话

调制解调器连接实现成为数据传输的工厂 交换实现

。据我所知,作者的目标是在您拨打另一个调制解调器(建立连接时)时返回数据交换对象。当然,关于信令部分还有其他问题,例如接受呼叫/请求等。然而,作者并没有深入讨论这个细节,因为这可能有点脱离本教程的主题。在我看来,Dial返回一个IModemDataExchange,您可以在该对象上调用Send/Recv。比如说,

using (IModemConnection modemConnection = new IsdnModem())
{
    IModemDataExchange dataExchange = modemConnection.Dial("123456")
    dataExchange.Send("Hello");
}

正如作者所暗示的,Dial调用另一个调制解调器并创建一个数据路径,以便通过该数据路径进行通信。这也是关于工厂模式的。

我没有通读整篇文章,但示例很简单:当您只有
公用无效拨号(字符串号)时
IModemConnection
中,通过此接口使用的对象可以直接拨号和。。。好吧,如果他们只是拨号,因为
void
返回“type”,调用此方法后就没有其他事情要做了。有点没用,对吧?
因此,为了在调用
拨号
方法后执行某些操作,接口现在返回
IModemDataExchange
对象,该对象可用于
发送
接收


如果
IModem
接口没有拆分为两个单独的接口,那么返回
void
就可以了(您可以看到返回
void
的相同方法概念的示例)。但是为了强制和展示SRP原理,作者决定给出这个例子,通过这种设计,
拨号(字符串编号)
应该返回
IModemDataExchange
结果,可以在拨号后用于执行其他操作。

我没有通读整篇文章,但这个例子很简单:当你刚刚有了
公用无效拨号(字符串号码)
IModemConnection
中,通过此接口使用的对象可以直接拨号和。。。好吧,如果他们只是拨号,因为
void
返回“type”,调用此方法后就没有其他事情要做了。有点没用,对吧?
因此,为了在调用
拨号
方法后执行某些操作,接口现在返回
IModemDataExchange
对象,该对象可用于
发送
接收

如果
IModem
接口没有拆分为两个单独的接口,那么返回
void
就可以了(您可以看到返回
void
的相同方法概念的示例)。但是为了强制和显示SRP原理,作者决定给出这个例子,通过这种设计,
拨号(字符串编号)
应该返回
IModemDataExchange
结果,可以用于拨号后的其他操作。

记住:

  • 单一责任:每个接口负责单一责任
  • 打开以进行扩展,关闭以进行修改:
  • Liskov替换:传递接口,以便您可以替换所有使用该接口的不同类
  • 界面分离:因为分离,一个改变不会影响另一个
  • 依赖项反转:通过使用接口和实现您的可靠规则,您已经为控制反转和依赖项注入做好了准备
因此,当您创建IModemConnection实例并调用拨号(123456)时,它会传回接口IModemDataExchange的实例。这基本上是说,一旦连接,您就会对使用接口IModemDataExchange的任何类的数据交换感兴趣。课堂上的其他内容都是额外的

记住:

  • 单一责任:每个接口负责单一责任
  • 打开以进行扩展,关闭以进行修改:
  • Liskov替换:传递接口,以便您可以替换所有使用该接口的不同类
  • 界面分离:因为分离,一个改变不会影响另一个
  • 依赖项反转:通过使用接口和实现您的可靠规则,您已经为控制反转和依赖项注入做好了准备

因此,当您创建IModemConnection实例并调用拨号(123456)时,它会传回接口IModemDataExchange的实例。这基本上是说,一旦连接,您就会对使用接口IModemDataExchange的任何类的数据交换感兴趣。课堂上的其他内容都是额外的

一旦连接上调制解调器,你就只能和它交换数据了,不是吗?@CédricBignon我正在读关于固体原理的书,我正在读