c# - 了解使用单一职责原则的实际好处

标签 c# solid-principles single-responsibility-principle

我试图了解 SRP,但是,虽然我了解如何应用它背后的原因,但我并没有真正看到这样做的好处。考虑这个例子,摘自 Robert Martin 的 SRP PDF :

interface IModem
{
    void Dial(string number);
    void Hangup();
    void Send(char c);
    char Recv();
}

他建议将其分为两个接口(interface):

interface IModemConnection
{
    void Dial(string number);
    void Hangup();
}

interface IModemDataExchange
{
    void Send(char c);
    char Recv();
}

我也一直在阅读 this article ,这更进一步:

interface IModemConnection : IDisposable
{
    IModemDataExchange Dial(string number);
}

interface IModemDataExchange
{
    void Send(char c);
    char Recv();
}

在这一点上,我理解功能(发送/接收)和非功能(拨号/挂断)方面的含义,但我不明白在此示例中将它们分开的好处。考虑这个基本实现:

class ConcreteModem : IModemConnection
{
    public IModemDataExchange Dial(string number)
    {
        if (connection is successful)
        {
            return new ConcreteModemDataExchange();
        }

        return null;
    }

    public void Dispose()
    {
        // 
    }

    public bool IsConnected { get; private set; }
}

在这一点上,让我再次引用 Robert Martin,尽管他说的是与该 PDF 不同的示例:

Secondly, if a change to the GraphicalApplication causes the Rectangle to change for some reason, that change may force us to rebuild, retest, and redeploy the ComputationalGeometryApplication. If we forget to do this, that application may break in unpredictable ways.

这是我不明白的。如果我必须创建 IModemDataExchange 的第二个实现,并且我想利用它,我仍然必须更改 Dial 方法,这意味着该类还需要重新编译:

public IModemDataExchange Dial(string number)
{
    if (some condition is met)
    {
        return new ConcreteModemDataExchange();
    }
    else if (another condition is met)
    {
        return new AnotherConcreteModemDataExchange();
    }

    return null;
}

我看不出这对减少变化对类(class)的影响有何作用。还是要重新编译,有什么好处呢?这样做对生成高质量代码非常重要,您从中获得了什么?

最佳答案

对我来说,上面的调制解调器示例似乎总是 interface segregation principle 的情况。而不是 SRP,但这不是重点。

在您提到的关于 Rectangle 的部分,我认为您只是误解了它。 Martin 使用 Rectangle 作为共享库的示例。如果 GraphicalApplication 需要新方法或更改 Rectangle 类中的语义,那么这会影响 ComputationalGeometryApplication,因为它们都“链接”到矩形 库。他说它违反了 SRP,因为它负责定义渲染边界以及代数概念。想象一下,如果 GraphicalApplication 从 DirectX 更改为 OpenGL,其中 y 坐标被反转。您可能想要更改 Rectangle 上的一些内容以促进此操作,但您可能会导致 ComputationalGeometryApplication 发生更改。

在我的工作中,我尽量遵循 SOLID原则和 TDD,我发现 SRP 使编写类测试变得简单,并且还使类保持专注。遵循 SRP 的类通常非常小,这降低了代码和依赖项的复杂性。在取消类(class)时,我会尝试确保类(class)要么“做一件事”,要么“协调两件(或更多)事情”。这让他们保持专注,并使他们改变的理由仅取决于他们所做的一件事,对我来说这就是 SRP 的重点。

关于c# - 了解使用单一职责原则的实际好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20073023/

相关文章:

c# - 如何使用 MonoDevelop 打包我的 linux 应用程序?

c# - 避免 If Else 条件

php - Symfony2 表单组件 - 违反 MVC 和 SRP?

c# - 理解 SOLID 设计的单一职责原则

oop - 实现多个接口(interface)是否违反单一职责原则?

c# - 在 WPF 中呈现文本,使其完全适合给定的矩形

c# - 禁用 WPF 窗口的最大化按钮,保持调整大小功能不变

c# - 从可移植类库发送客户端证书

ruby - 当遵循Liskov替换原理(LSP)时,子类可以实现附加接口(interface)吗?

swift - 在 Swift 中使用具有关联值的枚举是否违反里氏替换原则?