php 在遵循DDD哲学的应用程序中推动SOLID原则的程度[关闭]

vc6uscn9  于 2023-03-22  发布在  PHP
关注(0)|答案(1)|浏览(114)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

3天前关闭。
Improve this question
我正在开发一个领域驱动设计的PHP应用程序,这个应用程序将持续数年,并且会有很多修改和新功能。这是我第一次尝试遵循DDD的不同概念进行开发,我还使用CLEAN架构作为应用DDD哲学的架构方法。
然而,我发现自己想知道SOLID原则(以及一些关于DDD的问题)能走多远,让我解释一下。
我有一个表示凭据的值对象。

final class Credential
{
    public function __construct(
        private readonly EmailAddress $emailAddress,
        private readonly Password     $password
    )
    {
    }

    /* ... */
}

如您所见,Credential类需要示例化电子邮件地址和密码(也是值对象)。
这个案例给我提出了几个问题:

  • 凭据是一个聚合体吗?据我所知,聚合体是拥有其他对象的对象,在我看来,凭据就是这种情况。
  • SOLID中的依赖倒置原则怎么样?我应该为每个值对象创建一个接口,知道这只是我代码库的一小部分,并且我可能最终会有几十个接口吗?
  • 我的域的一个值对象(或根据你的答案聚合)依赖于另一个值对象真的是一个坏的做法吗?就像如果你想使用我的Credential类,你必须使用我的EmailAddress类和Password类,我不给予你选择使用你自己的实现。

此外,正如您可能猜到的,用户将包含凭据,但如果凭据是一个聚合,这是一个好的实践吗?
我真的是在所有这些概念的开始,我知道,一切可能并不完美,这就是为什么我转向你.我读了很多关于这方面的文章,但有时一个真正的反馈可以比几十篇文章更有益.
提前感谢那些愿意花时间回答我的问题的人,也许他们会把我引向资源,以更好地理解这些概念。

gudnpqoy

gudnpqoy1#

凭据是否为聚合?
不。它可能是一个聚合 * 根 *,也就是说,在组成聚合的对象图中的根对象。更可能的是它是一个值对象;在内存中表示您正在使用域模型跟踪的某些事实/信息。
包含其他值对象的值对象很常见。
(Note:聚合不是一种建模模式,它们是一种生命周期管理模式。请查看“蓝皮书”的第5章和第6章,以澄清这一区别。)
SOLID中的依赖倒置原则怎么样?我应该为每个值对象创建一个接口吗
可能不是?引入接口会增加解决方案的偶然复杂性;只有当有某种补偿利益时才有意义。
我的域的一个值对象(或者根据你的答案是聚合)依赖于另一个值对象,这真的是一个不好的做法吗?
如上所述,具有依赖于其他值对象的值对象是很好的和正常的。
值对象主要是关于信息的--它们是一个域抽象(EmailAddress,Password,Credential),隐藏了一些数据结构(String,Property Bag)。对该数据结构的改变对于类是局部的。
将接口作为值对象的抽象引入,为您提供了一种方法,可以让多个数据结构表达相同的域抽象。
坦率地说,为值引入接口不会产生很好的效果,除非您处于一个可以从表示相同域抽象的多个类中受益的上下文中。
没有魔法;只是权衡。

相关问题