问题标签 [solid-principles]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
837 浏览

c# - 依赖倒置。对象创建

根据 SOLID 原则,一个类不能依赖其他类,必须注入依赖项。这很简单:

但是,如果我希望我的 Foo 类能够创建 Bar,而不知道 IBar 背后的确切实现,该怎么办?我可以在这里想到 4 种解决方案,但它们似乎都有缺点:

  1. 注入对象的类型并使用反射
  2. 使用泛型
  3. 使用“服务定位器”并调用 Resolve() 方法。
  4. 创建一个分离的工厂类并将其注入 Foo:

最后一种情况看起来很自然,但是 BarCreator 类的代码太少了。那你怎么看,哪个最好?

0 投票
3 回答
1362 浏览

oop - 开源库中 OCP 的好例子

关于stackoverflow上的“开闭原则”这个话题已经有很多讨论了。然而,一般来说,对原理的更宽松的解释似乎很普遍,因此例如 Eclipse 是开放的,可以通过插件进行修改。

根据严格的 OCP,您应该只修改原始代码以修复错误,而不是添加新行为。

在公共或 OS 库中是否有任何严格解释 OCP 的好例子,您可以在其中通过 OCP 观察功能的演变:有一个带有方法 bar() 的类 Foo,然后有一个带有 foo2() 方法的 FooDoingAlsoX库的下一个版本,其中原始类已在未修改原始代码的情况下进行了扩展。

编辑:根据 Robert C. Martin 的说法:“模块的二进制可执行版本,无论是可链接库、DLL 还是 Java .jar 都保持不变”*。我从来没有看到图书馆保持关闭,实际上新行为被添加到图书馆并发布了新版本。根据 OCP,新行为属于新的二进制模块。

*Robert C. Martin 的敏捷软件开发、原则、模式和实践

0 投票
2 回答
2050 浏览

oop - GoF 设计模式与 SOLID 之间的联系

我很想知道哪种 GoF 设计模式直接转化为特定的 SOLID 原则?例如,我认为(在我看来)策略模式转化为依赖倒置原则。

不幸的是,我找不到任何研究他们关系的文献。如果能够从彼此的角度更有效地学习两者,那就太好了。

0 投票
3 回答
18065 浏览

c# - 用 C# 学习单一职责原则

我正在尝试学习单一职责原则(SRP),但这非常困难,因为我很难弄清楚我应该在什么时候从一个班级中删除什么以及应该在哪里放置/组织它。

我在谷歌上搜索了一些材料和代码示例,但我发现的大多数材料并没有让它更容易理解,反而变得难以理解。

例如,如果我有一个用户列表,并且从该列表中我有一个名为 Control 的类,它可以执行很多操作,例如在用户进出时发送问候语和再见消息,验证用户是否应该能够进入的天气踢他,接收用户命令和消息等。

从这个例子中你不需要太多了解我已经在一节课上做太多了,但是我对之后如何拆分和重组还不够清楚。

如果我了解 SRP,我会有一个用于加入频道的课程,用于问候和再见,用于用户验证的课程,用于阅读命令的课程,对吗?

但是,例如,我将在哪里以及如何使用踢?

我有验证课程,所以我确信我会在那里进行各种用户验证,包括天气或不应该踢用户。

所以 kick 函数会在通道加入类中,如果验证失败会被调用?

例如:

如果你们能在这里帮助我提供易于理解的在线免费 C# 材料,或者向我展示我将如何拆分引用的示例以及如果可能的话一些示例代码、建议等,我将不胜感激。

0 投票
1 回答
72 浏览

solid-principles - 简单对象 - 单一职责和封装原则的正确设计是什么

我正在计划一些简单的应用程序,并希望遵循单一职责和封装原则。

主要参与者有:

API 类- 它公开了保存用户的能力:

DBConnector 类- 它公开了将用户数据保存到数据库中的能力。

User 类- 代表一个用户。

在旧的方式 saveUser 方法看起来像:

根据新原则,正确的方法似乎是:

它是否正确?

用户应该处理数据库保存吗?

如果没有,你能提供更好的方法吗?

0 投票
4 回答
1449 浏览

oop - 单一职责原则(SRP)和我的服务类

我有YoutubeVideoService执行 CRUD(创建、读取、更新和删除)操作的类。在我看来,创建、读取、更新和删除是更改类的四个原因。这个类是否违反了单一职责原则?

如果它违反了,那么我们应该有四个类,如CreateYoutubeVideoService、和。有很多课程不是矫枉过正吗?ReadYoutubeVideoServiceUpdateYoutubeVideoServiceDeleteYoutubeVideoService

0 投票
4 回答
8103 浏览

domain-driven-design - DDD:我应该对域实体采取什么样的行为?

我的团队非常努力地坚持将领域驱动设计作为一种架构策略。但是,在大多数情况下,我们的域实体都非常贫乏。我们希望将更多的业务/域行为放在我们的域实体上。

例如,Active Record 对实体进行数据访问。我们不希望这样,因为我们很乐意使用存储库模式进行数据访问。

此外,我们将软件设计为 SOLID(鲍勃叔叔提出的五个软件设计原则)。因此,我们在设计实体时关注单一职责、开闭、liskov、接口隔离和依赖倒置对我们来说很重要。

那么,我们应该包括哪些行为呢?我们应该远离哪些种类?

0 投票
3 回答
480 浏览

.net - 瘦接口和胖接口之间的“细线”是什么?

我有一个预订系统,可让您预订、修改现有预订和取消现有预订。我正在研究接口隔离原则,我想知道我的接口应该有多薄,以及我是否违反了单一责任原则。我最初的设计是:

但后来我想,如果一个预订系统不需要为预订实现这些方法之一,并且只关心预订,例如,我做了以下事情:

现在我可以做这样的事情:

或者

所以问题就变成了我是不是把它像这样细化了。此外,为接口考虑名称变得更加困难,例如,我不喜欢 IModify 或 ICancel (它们对我来说就像应该在 IReservation 接口上的方法)。您如何确定应该进入接口的内容以及应该将哪些内容隔离到另一个接口、类等中...

0 投票
2 回答
925 浏览

unit-testing - 测试驱动开发和开放/封闭原则如何协同工作?

我一直在阅读单元测试、TDD 和 SOLID 原则,我需要一些说明。我的理解是,如果坚持开放/封闭原则,由于代码对修改是封闭的这一事实,单元测试可能在很大程度上变得不必要——因此如果代码被正确隔离和解耦,则无需重新测试。如果代码一旦通过相关的单元测试就不会改变,那么单元测试增加的前期成本的长期利益就会丧失。代码将永远通过,因为它永远不会改变,对吧?继承的类需要测试,但是一旦通过了相关测试,它们也将被关闭修改,不需要重新测试。维基百科关于 OCP 的文章在第一段中强化了这一思路,(我意识到这并没有成为法律)。
我发现 OCP 和 TDD 和谐共存的最佳解释是在这里,尽管 Arnon 似乎是在说 OCP 是对 TDD 的补充,因为不鼓励开发人员修改源代码,因为现有的测试方法在修改以测试新方法时会变得复杂功能。
这就是它的全部吗?请注意,我不是在寻找争论,我是新手,我正在寻找比我更有经验的人的澄清。

0 投票
2 回答
983 浏览

c# - 我在哪里可以找到符合 OOP 原则和 SOLID 原则的代码示例?

我在哪里可以找到符合 OOP 原则和 SOLID 原则的 ac# 代码示例?

我搜索了谷歌,但找不到与解决这两组原则直接相关的任何代码示例或业务问题的解决方案。

谢谢