问题标签 [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.

0 投票
4 回答
1453 浏览

oop - “告诉,不要问”多个域对象

问题

在执行涉及多个对象的功能时,如何遵守“告诉,不问”的原则。

示例 - 生成报告

我有以下对象(仅用于说明目的):

车、马、兔

这些对象之间没有关系,但我确实想根据这些对象生成报告:

这种方法的问题在于它必须从每个对象中“提取”数据,这违反了“告诉,不问”的规则。我宁愿隐藏每个对象的内部,并让它们为我生成报告:

...但后来我收到了 3 份部分报告。此外,我认为 Rabbit 不必知道如何生成我需要的每一个报告(HTML、JMS、XML、JSON ......)。

最后,在生成报告时,我可能想要打开多个项目:

0 投票
5 回答
852 浏览

c# - 告诉,不要问原则和密码过期

为了遵循实用的编程原则,我试图根据“告诉,不要问”原则来决定如何处理用户密码更改。

我有一个用户对象,其密码每 30 天过期一次。如果密码过期,我需要能够显示密码过期/更改密码视图。询问对象密码是否过期(它的状态)然后选择显示哪个视图似乎违反了原则。

处理这种情况的最佳方法是什么?

0 投票
0 回答
167 浏览

encapsulation - 告诉不要问——它如何应用于这个例子?

作为我正在研究的真实事物的代理,请考虑建立一个模型。我们有一个Parts代表模型零件的类,包括根据给定参数制造零件的方法、验证等。我们有一个Glue做同样事情的类和一个ModelBuilder类。

我可以用很好的封装制造我的胶水和零件。然后我将 myPartsInstanceGlueInstancemyModelBuilder作为参数传递给 my。这就是一切都崩溃的地方。我可以告诉我的模型构建器进行构建,但要这样做,它需要访问Parts(可能还有Glue)中的数据。例如,我可能需要知道角落或中心在哪里PartsInstance.Part[0]才能正确构建。

我在这里陷入困境,因为似乎告诉,不问阵营会说该部分应该以某种方式自行构建。但这对我来说没有意义。零件是零件,而不是整个模型。这就是应该建立自己的东西。ModelBuilder可能非常复杂,并且可能会Parts在其他地方使用。另一方面,我正在询问PartsInstance对象的状态,然后根据该状态做出决定。Parts此外,无论如何,该决定可能并不完全适合该概念。它可能涉及Glue我选择的类型。

我怎样才能构造或修改这个例子,使它不违反封装?

0 投票
4 回答
1956 浏览

oop - 告诉,不要问和单一职责 - 在课堂上用数据做新事物

我有一个案例,“告诉,不要问”似乎与“单一责任”原则相冲突。我已经查看了有关该主题的其他讨论,但尚未能够为这种情况制定最合适的面向对象方法。

我有一个程序可以读取和操作来自各种来源的数据集合。我创建了一个类来保存和操作数据(“DataSet”类)。它包括对数据集执行各种操作的方法,例如比较两个数据集以生成包含差异的新数据集,以及将数据集写入文件。

我现在想对数据集执行一些分析并将结果输出到报告中。我第一次尝试对此进行编码询问数据集以从中提取信息,然后构建报告,但这似乎违背了“告诉,不要问”的原则。那么:我是否应该将分析方法放在 DataSet 类中并告诉数据集进行自我分析并生成报告?这是否违反了单一职责原则?如果我想在将来执行其他类型的分析怎么办 - DataSet 类可能会变得非常臃肿,其中包含许多与其核心目的无关的不同分析例程。

谁能在这里建议最好的方法?是否有解决此问题的特定设计模式?

0 投票
1 回答
209 浏览

c# - 如何解决复杂计算中的最后一个“问”以符合“告诉!不要问!”?

今天我在想“告诉!不要问!” 并尝试使用此代码。

接口:

实现:

我知道并不总是可能符合设计原则。但最后我坚持使用这段代码,我问一个对象:

是否有可能解决它是否实用

编辑1:
如果我修改我的IValidationContext并重命名它:

不需要询问上下文:

现在上下文负责根据其内部状态调用计算。……感觉不对……

编辑2:
我读了一篇关于“告诉!不要问!”的小文章。它指出:询问一个对象的内部状态,然后根据该状态告诉该对象一些事情,这将违反“告诉!不要问!” 但是可以告诉另一个对象一些事情。这适用于这里吗?

顺便提一句。ValidateInput为和引入一个布尔值有效结果ValidateOutput。可以将代码更改为此,这很好,没有人被“询问”一些东西:

0 投票
1 回答
242 浏览

ruby - 你将如何在 HAML 中实现“告诉不问”的原则?

事情就是这样。我有一个按钮,根据场景的不同,它的行为、外观和文本都不同。目前大致是这样的:

还有一个 CSS 类,两个按钮都应该有 IF statement_B 为真。

所以这是一团糟。我最近读到了我非常喜欢的“告诉,不要问”原则,所以我很想在这里应用它......但我不确定如何。

我知道我可以做一个帮手,但我想远离他们,因为原因(我确实有一些正当的理由这样做,但这些超出了这个问题的范围)。我可以将其作为最后的资源,但宁愿找到另一种解决方案。

0 投票
1 回答
431 浏览

ruby-on-rails - Rails ActiveRecord 告诉不要问

有两个这样的类:

在相关订阅确定站点是否处于活动状态的情况下,我使用该方法hostname_active?作为路由中的约束以及在需要确定它是否 a) 存在和 b) 处于活动状态的其他类中。

取自关于 SO 的另一个问题:

Tell-don't-ask 基本上意味着你不应该查询一个对象的状态,根据它的状态做出决定,然后告诉同一个对象要做什么。如果对象拥有它需要的所有信息,它应该自己决定。

虽然我不这样做,但我的代码确实感觉非常耦合,无论是在站点和订阅之间的耦合方面,还是在与 ActiveRecord 的耦合方面,这使得在不接触数据库的情况下很难进行测试。

您将如何构建它以避免询问相关订阅以确定站点的状态?而且,你会认为这违反了“不问不问”的规定吗?

0 投票
2 回答
79 浏览

c# - 使用 Event 应用 TellDontAsk 模式

我试图在 cSharp 中引发事件以通知我的应用程序中的代码更改,以便获得 tellDontAsk 场景。

我有从事件类实现的简单类

我定义我的事件类如下

我尝试将我的代码与 Nunit 测试一起使用

当我运行测试时,它会出现空引用异常

System.NullReferenceException :对象引用未设置为对象的实例。

我相信缺少某些东西,但无法弄清楚,有什么想法吗?

0 投票
1 回答
132 浏览

oop - 如何对返回“tell-dont-ask”对象的解析器进行单元测试?

我有两个班,ParserItem。Parser 类解析一些结构化文档并返回Item-objects 如果您调用类似Parser::GetItem(int some_id). Item 类的编写考虑了“告诉 - 不要问”的原则。我的意思是它没有用于由Parseron 构造填充的几个内部变量的 getter 方法。

现在的问题是:如何对Parser课程进行单元测试?如何检查内部Item变量是否被正确解析?我必须重新安排我的课程吗?Item解析器接口返回完全构造的对象是否可能是糟糕的设计?

0 投票
1 回答
234 浏览

oop - 工厂模式不是违反“告诉,不问”的原则吗?

程序代码获取信息然后做出决定。面向对象的代码告诉对象做事。

亚历克夏普

当我们使用工厂模式时,我们根据工厂类以外的类的属性做出决定,所以这不违反告诉,不问原则吗?