- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图了解 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/
如果函数定义顺序不对,Jslint 将指出错误。 显然 jslint 是严格的,但我想知道将函数按顺序排列是否有任何好处。 我的意思是在调用它们之前定义它们。 最佳答案 函数定义(和 var 语句)被
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我注意到Flask tutorial涉及到点的使用。看起来它只是用于在本地创建一个轮子,这将使服务器上的设置变得更容易,但作为一个网络开发新手,我很好奇:是否有人真的会一路将他们的网站上传到像 PyP
我一直在阅读有关 jquery live event 的内容,但仍然有点困惑?使用它有什么好处? http://docs.jquery.com/Events/live 我知道它与绑定(bind)类似,
这是我的故事:我已将我的应用迁移到 AndroidX,因为我需要从网上找到的库中获取一些新功能。 问题:我目前遇到了一些问题,因为我现在需要为 Cordova 开发一个插件来实现该应用程序的一部分。
在使用 RAD 或一般不使用单元测试时使用依赖注入(inject)是否有任何好处? 最佳答案 是的,有以下几个好处: 减少依赖 减少依赖携带 更多可重用代码 更多可测试代码 更具可读性的代码 更多引用
我目前正在构建一个通过 MSI Windows Installer 分发的产品。我们的客户正在使用不同的形式(例如我们在他们自己的 MSI 中)集成该产品,使用 Bootstrap /链接器(如 Wi
有人声称 Scala 的类型系统是图灵完备的。我的问题是: 这有正式的证据吗? 简单的计算在 Scala 类型系统中会是什么样子? 这对 Scala 这种语言有什么好处吗?与没有图灵完备类型系统的语言
我开始尝试使用 React,我注意到我正在制作的简单应用程序全部使用 JS。我的 html 页面只是一个空的 body 标签! 所以我有几个问题,因为我是这个框架的新手。 我的整个应用程序应该基本上都
我们有一个相当大的基于 Windows 的 1.1 .NET 应用程序,我们正在考虑升级到 2.0。我们考虑更新的主要原因是我们可以利用 Visual Studio 2008 进行项目的持续开发,以及
我有一个页面,其中内置了基于 ajax 的分页。分页用于页面中的“评论”功能。根据 Google 的网站管理员博客,具有 rel="next"和 rel="prev"值有利于 SEO。 我在头部添加了
我是一名优秀的程序员,十分优秀!