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

How would I make separate duplicated logic in Value Objects

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

中找到的内容

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

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

但是如果您仍然想这样做,您可以使用静态函数构建验证 class。在我的工作中,我们使用 Webmozart/Assert and if you take a look at its implementation 你会明白我的意思。在我看来有非常好用的。您也可以将 MAX_LENGHT 作为参数传递。

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

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

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

What is the same and what is different?

也许您会发现与

相同或相似的结构
  • 检查 props
  • 创建错误结果或成功结果

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

Do the things that are (look) the same have different responsibilities?

Do they change for the same or for different reasons?"

这些是关于 single responsibility principle 的问题。有时事情看起来是偶然的。它们看起来相同但不同,因为它们因不同原因而变化。如果在这种情况下消除“重复”,您将遇到更多问题然后解决。

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

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

的好文章