问题标签 [tell-dont-ask]
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.
oop - “告诉,不要问”多个域对象
问题
在执行涉及多个对象的功能时,如何遵守“告诉,不问”的原则。
示例 - 生成报告
我有以下对象(仅用于说明目的):
车、马、兔
这些对象之间没有关系,但我确实想根据这些对象生成报告:
这种方法的问题在于它必须从每个对象中“提取”数据,这违反了“告诉,不问”的规则。我宁愿隐藏每个对象的内部,并让它们为我生成报告:
...但后来我收到了 3 份部分报告。此外,我认为 Rabbit 不必知道如何生成我需要的每一个报告(HTML、JMS、XML、JSON ......)。
最后,在生成报告时,我可能想要打开多个项目:
c# - 告诉,不要问原则和密码过期
为了遵循实用的编程原则,我试图根据“告诉,不要问”原则来决定如何处理用户密码更改。
我有一个用户对象,其密码每 30 天过期一次。如果密码过期,我需要能够显示密码过期/更改密码视图。询问对象密码是否过期(它的状态)然后选择显示哪个视图似乎违反了原则。
处理这种情况的最佳方法是什么?
encapsulation - 告诉不要问——它如何应用于这个例子?
作为我正在研究的真实事物的代理,请考虑建立一个模型。我们有一个Parts
代表模型零件的类,包括根据给定参数制造零件的方法、验证等。我们有一个Glue
做同样事情的类和一个ModelBuilder
类。
我可以用很好的封装制造我的胶水和零件。然后我将 myPartsInstance
和GlueInstance
myModelBuilder
作为参数传递给 my。这就是一切都崩溃的地方。我可以告诉我的模型构建器进行构建,但要这样做,它需要访问Parts
(可能还有Glue
)中的数据。例如,我可能需要知道角落或中心在哪里PartsInstance.Part[0]
才能正确构建。
我在这里陷入困境,因为似乎告诉,不问阵营会说该部分应该以某种方式自行构建。但这对我来说没有意义。零件是零件,而不是整个模型。这就是应该建立自己的东西。ModelBuilder
可能非常复杂,并且可能会Parts
在其他地方使用。另一方面,我正在询问PartsInstance
对象的状态,然后根据该状态做出决定。Parts
此外,无论如何,该决定可能并不完全适合该概念。它可能涉及Glue
我选择的类型。
我怎样才能构造或修改这个例子,使它不违反封装?
oop - 告诉,不要问和单一职责 - 在课堂上用数据做新事物
我有一个案例,“告诉,不要问”似乎与“单一责任”原则相冲突。我已经查看了有关该主题的其他讨论,但尚未能够为这种情况制定最合适的面向对象方法。
我有一个程序可以读取和操作来自各种来源的数据集合。我创建了一个类来保存和操作数据(“DataSet”类)。它包括对数据集执行各种操作的方法,例如比较两个数据集以生成包含差异的新数据集,以及将数据集写入文件。
我现在想对数据集执行一些分析并将结果输出到报告中。我第一次尝试对此进行编码询问数据集以从中提取信息,然后构建报告,但这似乎违背了“告诉,不要问”的原则。那么:我是否应该将分析方法放在 DataSet 类中并告诉数据集进行自我分析并生成报告?这是否违反了单一职责原则?如果我想在将来执行其他类型的分析怎么办 - DataSet 类可能会变得非常臃肿,其中包含许多与其核心目的无关的不同分析例程。
谁能在这里建议最好的方法?是否有解决此问题的特定设计模式?
c# - 如何解决复杂计算中的最后一个“问”以符合“告诉!不要问!”?
今天我在想“告诉!不要问!” 并尝试使用此代码。
接口:
实现:
我知道并不总是可能符合设计原则。但最后我坚持使用这段代码,我问一个对象:
是否有可能解决它是否实用?
编辑1:
如果我修改我的IValidationContext
并重命名它:
不需要询问上下文:
现在上下文负责根据其内部状态调用计算。……感觉不对……
编辑2:
我读了一篇关于“告诉!不要问!”的小文章。它指出:询问一个对象的内部状态,然后根据该状态告诉该对象一些事情,这将违反“告诉!不要问!” 但是可以告诉另一个对象一些事情。这适用于这里吗?
顺便提一句。ValidateInput
为和引入一个布尔值有效结果ValidateOutput
。可以将代码更改为此,这很好,没有人被“询问”一些东西:
ruby - 你将如何在 HAML 中实现“告诉不问”的原则?
事情就是这样。我有一个按钮,根据场景的不同,它的行为、外观和文本都不同。目前大致是这样的:
还有一个 CSS 类,两个按钮都应该有 IF statement_B 为真。
所以这是一团糟。我最近读到了我非常喜欢的“告诉,不要问”原则,所以我很想在这里应用它......但我不确定如何。
我知道我可以做一个帮手,但我想远离他们,因为原因(我确实有一些正当的理由这样做,但这些超出了这个问题的范围)。我可以将其作为最后的资源,但宁愿找到另一种解决方案。
ruby-on-rails - Rails ActiveRecord 告诉不要问
有两个这样的类:
在相关订阅确定站点是否处于活动状态的情况下,我使用该方法hostname_active?
作为路由中的约束以及在需要确定它是否 a) 存在和 b) 处于活动状态的其他类中。
取自关于 SO 的另一个问题:
Tell-don't-ask 基本上意味着你不应该查询一个对象的状态,根据它的状态做出决定,然后告诉同一个对象要做什么。如果对象拥有它需要的所有信息,它应该自己决定。
虽然我不这样做,但我的代码确实感觉非常耦合,无论是在站点和订阅之间的耦合方面,还是在与 ActiveRecord 的耦合方面,这使得在不接触数据库的情况下很难进行测试。
您将如何构建它以避免询问相关订阅以确定站点的状态?而且,你会认为这违反了“不问不问”的规定吗?
c# - 使用 Event 应用 TellDontAsk 模式
我试图在 cSharp 中引发事件以通知我的应用程序中的代码更改,以便获得 tellDontAsk 场景。
我有从事件类实现的简单类
我定义我的事件类如下
我尝试将我的代码与 Nunit 测试一起使用
当我运行测试时,它会出现空引用异常
System.NullReferenceException :对象引用未设置为对象的实例。
我相信缺少某些东西,但无法弄清楚,有什么想法吗?
oop - 如何对返回“tell-dont-ask”对象的解析器进行单元测试?
我有两个班,Parser
和Item
。Parser 类解析一些结构化文档并返回Item
-objects 如果您调用类似Parser::GetItem(int some_id)
. Item 类的编写考虑了“告诉 - 不要问”的原则。我的意思是它没有用于由Parser
on 构造填充的几个内部变量的 getter 方法。
现在的问题是:如何对Parser
课程进行单元测试?如何检查内部Item
变量是否被正确解析?我必须重新安排我的课程吗?Item
解析器接口返回完全构造的对象是否可能是糟糕的设计?