问题标签 [single-responsibility-principle]

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 投票
2 回答
362 浏览

java - 伪向后生成器模式?

在遗留代码库中,我有一个非常大的类,其中包含太多字段/职责。想象这是一个 Pizza 对象。

它具有高度精细的字段,例如:

  • 有意大利辣香肠
  • 有香肠
  • 有甜椒

我知道,当这三个字段都成立时,我们就有了一个至尊披萨。但是,这个类不开放扩展或更改,所以我不能添加 PizzaType 或 isSupreme() 等。整个代码库中的人们到处重复相同的if(a && b && c) then isSupreme)逻辑。这个问题出现在很多概念上,所以我正在寻找一种方法来将此对象解构为许多子对象,例如伪向后的构建器模式。

这是正确的方法吗?这种模式是否已经存在?

0 投票
2 回答
247 浏览

asp-classic - 我的验证者应该可以访问我的整个模型吗?

正如标题所述,我想知道我的验证类是否可以访问我模型中的所有属性。理想情况下,我想这样做,因为某些字段需要 10 多个其他字段来验证它是否有效。我可以但宁愿没有具有 10 多个参数的函数。或者这会使模型和验证器过于耦合?这是我的意思的一个小例子。然而,这段代码不起作用,因为它给出了一个无限循环!

如果我是对的并且这是一个好主意,我怎样才能用获取属性 UserID 来解决无限循环?

谢谢你。

解决方案

哪个生产解决方案图片

虽然不完美,但比我开始的要好得多。基本上,我决定使用装饰器模式。我的下一步很可能从每个验证中删除 Init() 函数,并将其替换为 SetModel() 函数或其他东西。这样每个验证都可以访问我模型中的每个属性。

谢谢大家。

0 投票
1 回答
1832 浏览

principles - SRP 和“变革轴”?

我正在阅读Bob Martin 的 OOD 原则,特别是 SRP 文本,我非常了解它所说的精神,但我不太理解链接的第 2 页(本书第 150 页)中的特定措辞):

我转述:

将这两个职责分成不同的类很重要,因为每个职责都是变化的轴

这里所说的“变化轴”究竟是什么意思?

0 投票
7 回答
297 浏览

oop - 如何避免创建庞大的类

Stackoverflow 用户,

您如何避免使用大型主体方法创建大型类。当最后期限很紧时,您最终会尝试将事物拼凑在一起,最终会变得一团糟,需要重构。

一种方法是从测试驱动开发开始,这有助于良好的类设计和 SRP(单一责任原则)。

我还看到开发人员双击控件并在触发的事件方法中逐行输入。

有什么建议么?

0 投票
4 回答
405 浏览

design-patterns - 单一职责和混合

鉴于Mixins 通常会在一个类中引入新的行为,这通常意味着一个类会有多个行为。

如果一个类有一个单一的责任,这被定义为只有一个改变原因的类。

所以,我可以从两个不同的角度来看

  1. 班级只有一个改变的理由。混入的模块也只有一个改变的理由。如果班级发生变化,只有班级需要重新测试。如果模块被改变,只有模块需要重新测试。因此,SRP 是完整的。

  2. 班级现在有两个改变的原因。如果更改了类,则类和模块都需要重新测试。如果模块被更改,则类和模块都需要重新测试。Henge,SRP 被违反了。

使用 mixins 是否违反了单一职责原则,最终导致系统更难维护?

0 投票
6 回答
181 浏览

c# - 在处理静态方法时保持代码在同一级别

这可能有点主观,但我想听听您对我目前情况的看法。我有一个用于序列化/反序列化对象的类。

我只喜欢这种方法,因为它将两个功能保持在同一水平。但是,我的目标是避免使用静态方法(在可行的情况下)。我也觉得我可能违反了 SRP,但这个对象的主要目标是它可以从 xml 字符串中序列化/反序列化。

在这种情况下使用静态方法有什么想法吗?我应该只制作ToXmlString非静态的,但留下FromXmlString静态的吗?我应该创建一个只处理 MyClass 序列化的新类吗?

编辑:

我在这里讨论的类是一个简单的传输对象。它用于从第三方工具保存/恢复值。

谢谢!

0 投票
2 回答
827 浏览

oop - 单一职责原则 - 一个很难看到的例子?

我刚刚阅读了关于单一职责原则的内容,Robert C. Martin 曾指出,有时很难看出一个类有多个职责。

任何人都可以提供这样一个类的例子吗?

0 投票
2 回答
2380 浏览

asp.net-mvc - ASP.NET MVC 向最终用户显示操作成功

我见过的大多数 ASP.NET MVC 示例都描述了用户正在查看对象(或对象集合)然后从该页面移动到显示用户完成的表单的页面的场景。在提交具有良好输入的表单后,用户将被重定向回显示对象(或列表)的页面,并且用户可以看到他们的更改是成功的。

我遇到了一个场景,每个业务规则都没有视图或列表页面。

在 ASP.NET MVC 中针对这种情况有哪些好的方法?

在过去使用经典 ASP 和 ASP.NET 时,我会处理输入,然后向用户显示成功消息或有错误的表单——所有这些都来自同一页面。这似乎违背了最佳实践(SRP、视图中没有逻辑等)。

一种简单的方法是重定向到一个新页面,告诉用户他们的更改是成功的,然后用户可以随时访问该页面。如果我开始输入逻辑来防止这种情况(即临时数据),那么解决方案就会开始变得肮脏。

我可以重定向到登录页面,但没有确认。也许我可以依靠一个消息系统,在最终用户返回登录页面时向他们显示确认信息?

0 投票
3 回答
297 浏览

oop - 在可扩展的类层次结构中实现单一职责原则的技术/模式

例如,单一职责原则说,一个Invoice类不应包含打印自身的代码。打印应该被分成不同的类。

但是假设您Invoice在软件的不同层中有一个类层次结构:

可以使用哪些技术或设计模式来分离印刷责任?

想法:

  • 一个单独的类,带有一个很大的if语句,用于测试每个子类Invoice并运行适当的打印代码。这似乎是错误的。
  • 访客模式。问题是访问者界面需要存在于核心层中,并引用自定义层中的类。我希望能够通过修改核心层在自定义层中添加新的子类。
0 投票
2 回答
455 浏览

iphone - 使用 UIViewController 维护单一职责原则 (SRP)

遵循 Apple 的指导方针,我为 iPhone 应用程序的每个屏幕创建了一个 UIViewController 子类。然而,我一直发现这些类变得非常大,无论是纯粹的代码行数还是成员变量的数量。

根据定义,它们最终要负责许多不同的问题(例如视图生命周期、视图和模型之间的中介、有时是触摸处理、控制逻辑、管理警报和其他 UI 状态)。

这不仅违反了单一职责原则,而且还导致大量代码几乎不可能进行单元测试。

您倾向于将哪些职责/关注点划分为新的类别?在 UIViewController 子类的情况下,你认为什么样的职责是干净分离的好候选?