问题标签 [architectural-patterns]

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 投票
1 回答
34 浏览

java - 库、“注入工厂”和扩展库的最佳实践

我使用需要修补的库。我需要分叉它,因为不使用工厂设计模式。

库具有这样的结构:X 类包含对其他类的引用、对其他类的引用以及更多层。类层次结构是“树状”结构。

我寻找重构的最佳方式——足够灵活以防止人们分叉它。我找不到关于该问题的任何最佳实践。

多年来,我使用“注入工厂”来解决它——工厂模式在工厂方法中注入父对象(DI)。我找不到任何关于这种方法的文档,我需要一些关于它的反馈(例如理论或可能的问题)。

我用 Car 的例子来描述它:

  • 汽车有CarInterior
  • CarInterior 有里程表

问题 - 无法创建自定义对象,尤其是里程表。

仅使用简单工厂方法模式的按书解决方案(可扩展性有限)

这种方法的主要问题

  • 如果工厂方法需要参数,那么这种更改可能会给 lib 用户带来麻烦。因为扩展类应该改变方法定义。

小问题

  • 如果我需要不同的里程表,我应该同时扩展 Car 和 CarInterior
  • 我需要 fork 的库只有很少的“级别”,所以这意味着在我设法调用工厂方法之前有很多级别的额外对象。

可能的业务请求

里程表类的可能扩展#1:使用 KM 或 Miles

汽车对象应该有 targetCountry。如果是在法国,则应使用公制单位。如果在美国 - 英里。该业务请求可以通过以下方式实现:

  • (重大更改)工厂方法 createOdometer() 获取参数:createOdometer(OdoUnits)
  • (重大更改)工厂方法 createInterior() 获取参数:createInterior(OdoUnits) 或 createInterior(Country)
  • 如果有更多级别(我的情况),则需要进行更多更改

里程表类的可能扩展#2:里程表值范围

  • 0-220公里/小时
  • 0-300公里/小时
  • ETC

里程表类的可能扩展#3:里程表的颜色应该与汽车的颜色相同

如果我们使用相同的方法,我们应该在方法中引入更多参数。还有更多“代理”功能。

问题

那么解决这个问题的最佳实践是什么?当新需求出现时,我们如何避免/减少方法定义的更改?

0 投票
1 回答
77 浏览

design-patterns - 哪种设计模式适合从多个来源获取相同类型的数据,将它们组合成一个单元并应用多个过滤器

我有两个产品,Product AProduct BProduct A有一个使用M 数据库调用创建的营销活动列表,Product B也有一个由单独的N数据库调用创建的营销活动列表。

需要注意的重要一点M- 一些调用在和之间是常见的N

现在Product A我们调用M数据库调用列表并将它们组合成一个列表,反之亦然Product B

现在我们要应用一个X FiltersonProduct A列表和一个Y Filterson列表,Product B以便根据客户对特定产品的调用获得过滤列表。Product A campaignsProduct B campaigns

您有什么建议,我们应该如何设计系统?任何指导我正确方向的建议或链接或参考将不胜感激。

0 投票
1 回答
31 浏览

architecture - 该服务在调用事务中的第二个服务期间引发了异常。什么通用解决方案是可能的?

我的问题是:

  1. 服务 A 开始交易;
  2. 服务 A 准备并将任何数据保存到 DB
  3. 服务 A 对服务 B 发出一些(HTTP-REST)请求
  4. 如果服务 B 成功响应(并保存数据),则 A 提交事务
  5. 如果服务 B 抛出任何异常 - 服务 A 回滚事务

问题是服务 B 只是响应缓慢,服务 A 捕获了超时异常并回滚了事务。然而,服务 B 处理了数据(尽管它没有及时响应)。何时,如果服务 A 和服务 B 都保存并处理了数据,则认为该过程成功。在这种情况下,由于事务的回滚,服务A的数据没有被保存。

这个问题有一个通用的解决方案吗?我期待 2PC 和基于事件的分布式事务机制(例如 saga 模式)。感谢任何帮助/链接/等。

0 投票
2 回答
53 浏览

oop - 我们应该在拦截设计模式实现中使用 NullValueFilter 吗?

我有一个需要通过不同类型的过滤器处理的活动列表,例如平台过滤器、应用程序过滤器、CampaignRunning 过滤器,以检查当前日期是否应该在开始日期和结束日期之间等。

理想情况下有 15-20 种不同的过滤器,我使用Intercept Design Pattern管理它们。

在应用过滤器之前列表可能为空,所以我应该NullValueFilter在过滤器链中使用吗?

再次应用一些过滤器列表后可以为空,以检查我是否应该使用策略设计模式注入相同的空或空检查策略?

我通常会更多地考虑设计视角来管理此类案例。我想知道我是否在思考正确的方向,或者我是否在这方面过度设计。

一些伪代码来说明场景 -

我可以在这里想到两个选择 -

  1. 创建一个过滤器基类,可以管理列表的空和空检查。
  2. 使用构造函数注入在每个过滤器中注入空值过滤器实例,并调用该空值和空值检查方法。
0 投票
0 回答
26 浏览

javascript - 在 MVC 应用程序中的模型之间共享数据

我正在使用 vanilla JavaScript 中的 MVC 模式开发一个 SPA 端项目。我的目标是学习如何应用 MVC 模式。

这是一个简单的电子商务,显示要出售的商品清单。我有不同的组件,每个组件都有一个模型、一个视图和一个控制器。例如,一个组件允许您选择、添加、编辑和删除产品列表。我有另一个组件(具有自己的模型、视图和控制器),它允许您做完全不同的事情,但根据在前一个组件中选择的产品,它的显示方式略有不同。

如果每个组件都有自己的 MVC,那么一个组件的状态如何影响另一个组件

谢谢你。