单一责任原则混乱

时间:2014-05-31 08:35:14

标签: c# solid-principles

我正在阅读this文章以了解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();
}

任何人都可以告诉我为什么我们这样做了。

3 个答案:

答案 0 :(得分:4)

教程有一个像

这样的句子
  

调制解调器连接实现成为数据工厂   交流实施

。据我所知,作者的目的是在您拨打另一个调制解调器时(当建立连接时)返回一个dataexchange对象。当然还有其他关于信号部分的问题,例如。接受调用/请求等等。然而,作者没有详细说明,因为这可能是本教程的主题。在我看来,Dial返回一个IModemDataExchange,您可以在该对象上调用Send / Recv。例如,

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

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

答案 1 :(得分:1)

我没有浏览整篇文章,但示例很简单:当public void Dial(String number);中只有IModemConnection时,通过此界面使用的对象只能拨打和...好吧,如果他们只是拨打,因为void返回"输入"调用此方法后没有别的事可做。有点无用,对吧?为了在调用Dial方法后做一些事情,接口现在返回IModemDataExchange对象,可用于Send和{{1} }。
如果Receive接口没有被拆分为2个单独的接口,那么返回void可能非常好(您可以看到.NET SqlConnection Open method作为返回{{{}的相同方法概念的示例1}})。但是为了强制并显示SRP原则,作者决定提供此示例,并且通过此设计IModem应该返回void结果,该结果可用于在拨号后执行其他操作。

答案 2 :(得分:0)

记住:

  • 单一责任:每个界面负责单一责任
  • 打开以进行修改的延期:
  • Liskov替换:接口被传递,因此您可以替换所有使用接口的不同类
  • 界面隔离:由于分离,一个变化不会影响另一个!
  • 依赖性反转:通过使用接口并实现您的SOLID规则,您已准备好进行控制和依赖注入反转!

因此,当您创建IModemConnection的实例并调用Dial(123456)时,它会传回IModemDataExchange接口的实例。这基本上说,一旦你连接,你就有兴趣从任何使用IModemDataExchange接口的类交换数据。除此之外还有其他任何东西!