问题标签 [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.
c# - 多态性与职责分工:如何避免“切换类型”
在设计具有层次关系的系统时,我经常遇到一个需要多态行为的问题,但不止一种类型的工作可以从这种多态实现中受益。
例如,考虑一个编译器,它使用抽象语法树来组织已解析的源代码以进行编译。以多态方式组织逻辑很方便,因为您可能有不止一种类型的 ValueProvider,每种类型负责发射不同的代码以将值加载到操作堆栈上。问题是您可能还想对 AST 执行静态分析,在这种情况下,您想对树进行完全不同的工作,但可能具有取决于所分析节点类型的行为。换句话说,您需要多态行为,但不想将分析代码与编译代码混合在一起。
我目前处理这个的方法是用一个对象模型来存储数据,它的职责只是提供树。树的每个使用者(例如编译器或静态分析器)然后使用运行时类型信息来执行其逻辑的条件分支。根据节点的类型,这不可避免地会导致大量的“if/else if”或“switch”编码。多态性旨在解决的正是这种丑陋的分支,但并行的、不相交的职责似乎需要它。
有没有更好的方法来构建它?
oop - 单一职责原则的例子是什么?
有人可以给我一个单一职责原则的例子吗?我试图理解在实践中,一个班级承担单一责任意味着什么,因为我担心我可能每天都会违反这条规则。
oop - 告诉,不要问和单一职责 - 在课堂上用数据做新事物
我有一个案例,“告诉,不要问”似乎与“单一责任”原则相冲突。我已经查看了有关该主题的其他讨论,但尚未能够为这种情况制定最合适的面向对象方法。
我有一个程序可以读取和操作来自各种来源的数据集合。我创建了一个类来保存和操作数据(“DataSet”类)。它包括对数据集执行各种操作的方法,例如比较两个数据集以生成包含差异的新数据集,以及将数据集写入文件。
我现在想对数据集执行一些分析并将结果输出到报告中。我第一次尝试对此进行编码询问数据集以从中提取信息,然后构建报告,但这似乎违背了“告诉,不要问”的原则。那么:我是否应该将分析方法放在 DataSet 类中并告诉数据集进行自我分析并生成报告?这是否违反了单一职责原则?如果我想在将来执行其他类型的分析怎么办 - DataSet 类可能会变得非常臃肿,其中包含许多与其核心目的无关的不同分析例程。
谁能在这里建议最好的方法?是否有解决此问题的特定设计模式?
entity-framework - 如何只定义一次 EF 连接字符串并在其他项目中重复使用?
我正在构建一个使用实体框架的 Web 应用程序。我已将实体模型和生成的类移到一个单独的项目中,因为它将被多个消费者使用。
但是当我尝试运行应用程序时,Entity Framework 告诉我
要消除此问题,我必须将实体框架连接字符串添加到每个使用项目。当然这很烦人,因为有几个消费者,而且它还引入了一种紧密耦合,我希望通过将软件分成不同的项目来摆脱这种耦合。
那么是否可以只在一个地方而不是在每个消费项目中定义连接字符串?
注意:我遵循数据库优先方法。
c# - 班级责任,我的“移动对象”班级是否真的关心它是否在移动?
我想要一些关于哪个类应该保存某些信息的指导。如果我有一个在“空间对象”内四处移动的“移动对象”,移动对象是否真的关心它在空间对象中的位置、移动的速度以及向哪个方向移动?
将属性分配给“位置”的移动对象当然看起来很方便,但我认为它确实对此没有任何顾虑。所以我想出了:
写的有点仓促……但我希望它能传达我的意思。总而言之:手机应该拥有一个位置,还是空间?谁应该控制运动?
oop - “高凝聚力”是“单一职责原则”的代名词吗?
高凝聚力是单一职责原则的同义词吗?如果不是,它们有何不同?
c# - 关于何时需要特定 DTO 类的另一个讨论
我正在做一个大型项目,其中一部分是要替换现有的服务器堆栈。对于一个非常规范化的大型数据库,很明显我们需要构造许多复合对象。我的一个查询示例如下:我的复合对象定义:
我的服务中的数据库查询:
现在从我的复合对象的定义中可以清楚地看出,它只包含数据,没有业务规则,也没有其他持久性或业务结构、数据结构或其他任何东西的暴露。
然而我的队友说这只能存在于域模型中,我必须花费周期将我的数据从这个定义明确的对象移动到 DTO。不仅如此,a) 所有 DTO 的名称中都必须包含 DTO,并且 b) 它们的存在必须仅用于在网络中移动的目的。因此,当我们的客户端代码被开发时,它必须 a)创建每个对象属性的属性,并且 b)从 DTO 移动到视图模型属性。
我觉得这把DTO推到了极致。即基于这些 ARE 数据传输对象的复合对象的定义。此外,我认为将此对象存储在客户端并直接绑定到客户端中的此对象绝对没有问题。由于我所做的只是获取复合对象中定义的每个属性并将它们复制到 DTO 中,因此创建一个对象只是为了将其复制到另一个对象然后再次将其复制到内部似乎是浪费大量时间和周期客户端的属性。
我对这方面的其他意见感兴趣。我觉得我没有违反任何 OOP 规则,例如关注点分离或单一责任原则……至少只要您不对这些感到极度敏感。意见???
ruby-on-rails - Rails、SRP 和单元测试
前言
这是我第一次尝试在考虑 SRP 的情况下构建应用程序,并真正尝试使用测试来驱动网站的代码,而不是从我的数据架构 (ActiveRecord) 开始,然后构建适合的应用程序。
但我遇到了问题。我订阅并观看了很多 Destroy All Software 的截屏视频,理论上我喜欢他所宣扬的内容,但我在实践中遇到了麻烦。
手头的问题
我知道我的应用程序的主要功能是根据位置搜索个人资料。因此,我为此编写了一个简单的 Cucumber 功能(暂时不使用路由/控制器/等,以简化手头的任务)。
搜索功能:
search_steps.rb:
没问题,现在看规格:
profile_search_spec.rb:
profile_search.rb:
我使用 ProfileSearch 类有几个原因。
- 将尽可能多的业务逻辑移到 ActiveRecord(单一职责原则)之外似乎是正确的做法。
- PORO 可以加快测试速度(不加载 Rails)。
- 我计划在不久的将来使用 ElasticSearch 或 Solr,并希望界面保持不变。
我不确定下一步该怎么做。ProfileSearch
显然取决于Profile
模型,我很确定这将是 ActiveRecord。
所以问题是我是否开始规范和构建Profile
并开始在我的测试中加载 Rails?这似乎是最简单的选择,但似乎有些错误。我觉得我会设计和构建我的应用程序尚未特别要求的行为。我将不得不考虑字段、关系和存储等,所有这些都是我的应用程序目前不应该关心的。
Profile
或者我应该对规范中的所有调用使用存根/模拟,ProfileSearch
并确保调用了正确的方法?这似乎也是错误的,因为那时我不会真正测试该行为,并且在切换到 Solr 或 ElasticSearch 时我必须重写测试,即使预期会有相同的行为。
或者我实际上应该创建一个工作的 Profile 模型,它暂时不使用 ActiveRecord,但可以正确响应 Bob 叔叔在构建他的 wiki 事物时展示的所有正确方法?从理论上讲,这似乎是最好的方法,但知道我将来会使用 ActiveRecord,这似乎也很多余。
或者...去他妈的,把所有东西都扔到 ActiveRecord 模型中:\
有太多的模式、原则和最佳实践在我脑海中浮现,我不知道 WTF 该怎么做。
你会怎么做?
ruby-on-rails-3 - Rails SRP 模块,attr_accessible
我正在学习 SOLID 并尝试将 SRP 引入我的 rails 应用程序。我有以下具有基本身份验证的用户模型:
我想将所有身份验证逻辑移动到一个模块,如下所示:
我的用户模型是这样的:
现在错误开始了:
身份验证的未定义方法“attr_accessible”:模块
我将如何解决此错误?我确信这是将 SRP 引入我的 Rails 应用程序的最佳开始。
谢谢
unit-testing - SRP 使类难以测试
在重构一些旧的遗留代码时,我尝试尽可能多地应用单一职责原则,所以我最终得到了许多只有一个目的的类。这很好,但是当我尝试为这些新类编写单元测试时问题就来了。有些类真的很难测试,因为测试很难设置。我需要创建 4-5 个模拟/存根来编写一个测试用例,如果我想覆盖我的所有代码,我需要编写几个测试用例,所以这只是一个麻烦。
难以设置测试(因为它依赖于许多其他类)是代码异味吗?你如何解决这个问题?