gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:46:08 24 4
gpt4 key购买 nike

我试图了解 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com