【问题标题】:Duplicate logic in backend and frontend with Domain Driven Design使用领域驱动设计在后端和前端重复逻辑
【发布时间】:2020-02-25 22:46:40
【问题描述】:

我有一个类在后端有一些计算登录:

public class MyDomainClass{
    private Double amount;
    private Double total;
    public Double getPercentage(){
        /*business logic*/
    }
}

我的前端是 Angular 2+,我想以 2 种方式显示此信息。

在服务器提供的列表中:

并且在版本形式中,基于用户输入的百分比计算:

要以表格形式进行此计算,我还必须在前端域类中复制逻辑吗?我害怕重复业务逻辑并失去对具有相同想法的更复杂问题的代码的控制(报告和列表的后端逻辑以及前端表单中的相同逻辑)。

我怎样才能避免这种情况?

P.S:我在后端使用 Jax-rs。

【问题讨论】:

  • 您始终可以使用更新的值异步调用后端,然后在返回时更新百分比。您确实会引入延迟,但取决于您对复制代码的厌恶程度,这可能是一个不错的选择。

标签: java angular rest design-patterns domain-driven-design


【解决方案1】:

您需要对这些事情保持务实。前端至少需要确保用户体验是可接受的,有时可能会出现功能重复,以保持用户体验流畅和合理。

另一个例子可能是验证。即使您的域必须执行相同的验证,前端验证也是必要的。域是事实的来源,所有不变量必须在那里实现。如果可以改善用户体验,在合理的范围内复制前端的某些功能是可以接受的。

简单的计算,正如你所举的例子,是我什至不会担心的。将成本加起来以显示总计等也是如此。您的域可能在做同样的事情,但意图不同。

如果有任何“繁重的工作”要做,那么宁可调用您的 web-api 并让您的后端处理。

【讨论】:

  • 如果规则数不胜数,另一种可能可行的方法是在 JavaScript 中转译表达式树。如果验证规则表示为规范,那么这可以使用访问者来工作。我从来没有采取过这种方法,但我内心 DRY 的自我经常想到它。
  • @p|a|x:我之前已经应用了类似于使用各种规则的东西。但是,这是一个 Windows 窗体应用程序,其中使用了 RuleSet 或类似名称来应用前端验证。这完全取决于为此建造管道需要付出多少努力。在大多数情况下,前端可能需要的位很容易复制,如果它们不太易变,则不需要这样的管道。但这确实是一个简单的重复,确实违背了整个 DRY 的想法。
猜你喜欢
  • 2011-11-18
  • 2023-04-05
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2016-09-29
相关资源
最近更新 更多