问题标签 [chain-of-responsibility]

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 投票
8 回答
400 浏览

java - 在数据库之前处理数据的应用程序设计

我在 excel 文件(和 csv 文件)中有大量数据。数据需要放入数据库(mysql)中。但是,在它进入数据库之前需要对其进行处理。例如,如果第 1 列小于第 3 列,则将 4 添加到第 2 列。在持久化信息之前必须遵循很多规则。

完成这项任务需要遵循什么好的设计?(使用Java)

补充笔记

该过程需要自动化。从某种意义上说,我不必手动进入并更改数据。我们谈论的是数千行数据,每行包含 15 列信息。

目前,我建立了一种责任链设计。每个规则一个类(Java)。当一个规则完成时,它会调用以下规则。

更多信息

通常每个数据表大约有 5000 行。速度不是一个大问题,因为这种大输入并不经常发生。

我考虑过流口水,但我不确定任务是否足够复杂,流口水。

示例规则:

  1. 所有货币(特定列中的数据)不得包含货币符号。

  2. 类别名称必须统一(例如书柜 = 书柜)

  3. 参赛日期不能是未来日期

  4. 文本输入只能包含 [AZ 0-9 \s]

等等。
此外,如果任何一列信息无效,则需要在处理完成时报告(或者可能停止处理)。

我目前的解决方案有效。但是我认为还有改进的余地,所以我正在寻找关于如何改进以及其他人如何处理类似情况的理想。

我曾考虑过(非常简单地)使用drools,但我不确定这项工作是否足够复杂以利用drools。

0 投票
2 回答
893 浏览

design-patterns - 关于责任链模式,已知的“陷阱”是什么?

在我当前的项目中,我发现自己经常使用责任链模式(对我来说经常是 3 次),我想知道我是否对解决方案变得有点过度热情。具体来说,我一直在使用 Apache Commons链项目。所以,到目前为止,我对它如何将许多复杂的、可互换的应用程序逻辑简化为一个更有凝聚力和组织性的整体印象深刻。然而,该项目的一些新人似乎很难“得到它”。你有什么经验?您在实施过程中遇到了哪些问题?

到目前为止,我注意到的唯一问题是当您尝试处理需要关闭的对象时。当您完成链的执行时,将这些对象存储在您的 Context 类中会很痛苦。我能够使用过滤器而不是命令来解决这个问题,但这似乎有点不直观,因为您的关闭语句通常离对象实例化的位置很远。

无论如何,我很想听听一些对这种模式有更多经验的开发人员的想法。

提前致谢。

0 投票
6 回答
4421 浏览

c++ - 用什么替换巨大的 switch 语句?

我有一个解析一些模板文件的代码,当它找到一个占位符时,它用一个值替换它。就像是:

在代码中,解析器找到那些,调用这个函数:

然后用返回值替换原来的占位符。

在实际情况下,它不是一个虚拟网页,并且可能出现许多 (50+) 个不同的占位符。

我的代码是 C++,但我猜任何语言都存在这个问题。我猜这更多是关于算法和面向对象设计的。唯一重要的是必须编译它,即使我想要我不能有任何动态/评估代码。

我虽然关于实施责任链模式,但它似乎不会改善这种情况。

更新:我也担心另一个线程中的这个评论。我应该关心它吗?

0 投票
2 回答
1336 浏览

c# - 如何在 Ninject 中使用装饰器声明责任链?

我想在 Ninject 中使用装饰器声明一个责任链。

有没有人这样做过?

谢谢。

0 投票
10 回答
30539 浏览

oop - 为什么我会在装饰器上使用责任链?

我只是在阅读责任链模式,我无法想象一个我更喜欢使用它而不是使用decorator的场景。

你怎么看?CoR 有利基用途吗?

0 投票
4 回答
5971 浏览

java - 责任链与类列表的优势是什么?

最近,我正在与另一位程序员讨论重构一个充满“if”语句的巨大(1000 行)方法的最佳方法。

代码是用 Java 编写的,但我想这个问题也可能发生在其他语言中,例如 C#。

为了解决这个问题,他建议使用责任链模式。他提议有一个基本的“处理程序”类。然后,“Handler1”、“Handler2”等将扩展“Handler”。
然后,处理程序将有一个“getSuccessor”方法,该方法将返回 null(如果它是链的最后一个)或链的下一个处理程序。
然后,“handleRequest(Request)”函数将处理 Request,或者将其传递给链的下一个,如果之前的解决方案都不起作用,它将只返回 null 或抛出异常。
为了向链中添加一个新的处理程序,编码器将转到链的最后一个元素并告诉它有一个新元素。要做某事,他只需在链的第一个元素上调用 handleRequest。

为了解决这个问题,我建议使用不同的方法。
我也有一个基本的“处理程序”类,带有“处理程序1”、“处理程序2”,就像前面提到的方法一样。
但是,不会有“getSuccessor”方法。相反,我将有一个带有处理程序列表的 Collection 类(一个 Vector、一个 ArrayList 或在这种情况下最好的任何东西)。
handleRequest 函数仍然存在,但它不会将调用传播到下一个处理程序。它只会处理请求或返回 null。
要处理请求,可以使用

或者,为了防止代码重复,可以将“parseRequest(request)”方法添加到集合类中。要添加一个新的处理程序,可以转到集合构造函数(或 static{} 块,或类似的东西)并简单地添加代码“addHandler(new Handler3());”。

这种方法到底缺少什么责任链优势?哪种方法最好(假设有最好的方法)?为什么?每种设计方法会导致哪些潜在的错误和问题?

对于那些需要上下文的人,原始代码如下所示:

0 投票
2 回答
254 浏览

c# - 你将如何测试过滤复杂对象的东西

我有一个包含 7 个相关字段的持久对象。

这些字段可以包含此处列出的值的数量:

这是 121600 个独特对象的潜力。

被测代码是一些过滤器,它们根据它们的字段值抓取一定数量的这些对象,然后将它们放在一个 bin 中以供另一个系统使用。垃圾箱的存放很简单,经过测试并且可以正常工作……只是过滤不起作用。似乎有许多边缘情况没有被覆盖,并且许多对象被放置在一个 bin 中,而它们根本不应该被选择,反之亦然。

总而言之,有 9 个过滤器在一个责任链中运行,每个过滤器将对象放入一个 bin 中,直到 bin 已满,此时链退出。链中的最后一个过滤器只是一个“过滤器”,它向管理员发送一封电子邮件,指出对象正在运行不足(即,如果链到达此过滤器,则垃圾箱未满,需要被看)。

所以我的问题是:如何测试这些过滤器?我可以使用一系列 for 语句创建每种唯一类型的对象:

但是试图手动找出应该从结果集合(甚至过滤对象的集合)中正确过滤哪些对象将非常困难(如果可能的话,我在第一次编写过滤器时会很容易地做到这一点)。

我知道要求有问题,因为他们说的是:

但是结果显示了如此多的边缘情况,以至于每次我将其更改为包含该特定情况时,都会出现其他问题(而且我没有回归测试来确保它不会)并且很难找出链中的哪个位置发生了特定问题。

编辑>我正在尝试单独测试过滤器,但是假设如下:

过滤器 1 抓取 121600 个可能对象中的 500 个(根据过滤器的标准)。我发现,比如说 100 个(完全猜测)被抓取的物体,不应该——而且出于各种原因。为了知道,我必须与另一个系统的用户一起检查每个过滤器的结果集是否正确。与此相反的情况也萦绕在我的脑海中……那些本应该被抓住但没有被抓住的物体呢?

我开始认为这可能是需求收集而不是测试中的问题。

0 投票
3 回答
226 浏览

php - 这在PHP中可能吗?

考虑以下 PHP 片段:

是否可以像这样调用 Available() 方法(如果未调用 Available 方法,仍然只返回 true 或 false)?

如果是,如何?

编辑:这会奏效吗?

提前致谢!

PS:这个片段被截断了,所以不要指望它本身就很有意义。

0 投票
3 回答
6654 浏览

c# - C# -Pipeline Style 事件模型

在 ASP.NET Web 应用程序中,事件以特定顺序触发:

为简单起见 加载 => 验证 => 回发 => 渲染

假设我想开发这样的管道式事件

例子 :

事件 1 [“观众正在聚集”,伙计们{事件 2 和事件 3 请等到我发出信号}]

事件 1 完成任务后

事件2 [{事件2,事件3“听众聚集!我的任务结束了}]

事件 2 正在接管控制权以执行其任务

事件 2 [“观众正在登录”事件 3 请等到我发出信号]

事件 2 完成任务后

......

活动 3 [“Jon skeet 的演讲结束 :)”]

任何人都可以通过非常基本的示例来解释,我该如何设计这个?

0 投票
3 回答
322 浏览

design-patterns - 允许在某些点注入代码的设计模式

我试图让开发人员在某些执行点扩展我的代码。

我的具体示例是数据库事务包装器。包装器负责处理我们希望从开发人员那里抽象出来的许多细节,并用于多个项目。

然而,每个项目都有他们希望在交易期间自动执行的某些事情。我想添加每个项目可以设置以运行代码的拦截点。

例如,我们数据库中的每个表都有一个输入日期字段,每次记录更改时都会更新该字段。然而,我们希望一个事务的所有日期都是相同的,无论有多少记录被触及(即表 A 中的 4 条记录,表 B 中的 1 条记录,...)。

我的想法是定义拦截点“TransactionStarting”、“TransactionStarted”、“StatementExecuting”、“StatementExecuted”……并将一个上下文对象传递给每个点。

然后项目可以定义一个类“EnteredDateManager”,它在“TransactionStarted”点期间存储当前日期,并在“StatementExecuting”点期间更新每个对象的 EnteredDate 属性。

我想在 web/app.config 文件中进行设置,并允许注册多个拦截类。如果注册了多个班级,则应按照注册的顺序解雇他们。

我想只是提出事件,但我希望秩序很重要。我还希望能够在不同点之间共享状态。在我上面的示例中,EnteredDate 属性在 TransactionStarted 点中设置并在 StatementExecuting 点中使用。

这是责任链模式吗?奥普?它似乎接近 ASP.Net 管道的工作方式,但据我所知,它们使用事件并且不保证排序。

任何方向/例子都会很棒。

谢谢