我将如何在值对象中制作单独的重复逻辑

问题描述

我正在学习 DDD(域驱动设计)并阅读清洁架构。我发现了值对象,并一直在阅读有关它们的更多信息,并在我的应用程序中实现了一些可以在 https://gist.github.com/Tyler0722/73ec826be814b8e54b9f6ae6ae836409 中找到的内容

值对象是通过调用执行验证并遵循关注点分离原则的工厂方法创建的。问题是我有两个值对象,其中验证逻辑是重复的。 Username 和 QuizTitle,其中唯一的区别是 MAX_LENGTH,这违反了 DRY 原则。我想知道是否有人知道我可以把它弄干。

解决方法

我的建议是不要这样做。在这种情况下,它只是没有必要。

但是如果您无论如何都想这样做,您可以使用静态函数构建一个验证类。在我的工作中,我们使用 Webmozart/Assert,如果您查看它的 implementation,您就会明白我的意思。在我看来有非常方便的。您也可以将 MAX_LENGHT 作为参数传递。

,

如果你想删除重复,你必须非常小心。

你应该问自己的第一个问题是

什么是相同的,什么是不同的?

也许你会发现相同或相似的结构

  • 检查 props
  • 创建错误结果或成功结果

如果你发现你认为相同的是你必须问自己更多的问题:

(看起来)相同的东西有不同的职责吗?

它们的变化是出于相同还是不同的原因?”

这些是关于 single responsibility principle 的问题。有时事情看起来是一样的。它们看起来相同但不同,因为它们的变化原因不同。如果你消除了这种情况下的“重复”,那么你会遇到更多的问题。

例如如果您将 QuizTitleUsername 的验证逻辑合并到一个方法中,然后您收到 QuizTitle 验证的更改请求,您可以轻松破坏 Username 的验证行为。如果 QuizTitle 验证更改,我想它不应该更改。

您可能还想阅读 Martin Fowler 撰写的关于 Avoiding Repetition

的好文章 ,

好吧,我同意 Darius Mann 的观点,即这些值对象具有相似的业务逻辑是偶然的,如果它们在您的应用中是不同的概念,请将它们分开并独立,这是我的观点。