DDD - 总结 - 干将应该被避免真的?

问题描述 投票:1回答:1

早上好,

我读过这两个getter和setter方法应该在AR避免很多时间。虽然我可以理解为制定者的原因,我不同意关于吸气时,这些显然是业务的一部分了一下。

让我们想象一下以下用户AR:

namespace vendor\Domain\Model;

class User
{
    private $userId;
    private $username;
    private $password;
    private $email;

    static public register(...): User { ... } // Ubiquitous Language
    public function unregister(...) { ... } // Ubiquitous Language
    public function changePassword(...) { ... } // Ubiquitous Language
    public function changeEmail(...) { ... } // Ubiquitous Language
    public function getAggregateId(): UserId { ... } // A getter
    public function getUsername(): UserName { ... } // A getter
    public function getEmail(): UserEmail { ... } // A getter
    ...
}

现在让我们设想以下UserRepository接口:

namespace vendor\Domain;

interface UserRepository
{
    public function userOfId(UserId $userId):? User;
    public function userOfname(UserName $userName):? User;
    public function userOfEmail(UserEmail $userEmail):? User;
    ...
}

基本上在这里,我有一些发现者使人们有可能通过它的ID,用户名,或其电子邮件地址检索用户。

现在,让我们想象一下以下的内存中实现,UserRepository的:

namespace vendor\Infrastructure\Persistence;

use vendor\Domain\UserRepository;

class InMemoryUserRepository implements UserRepository
{
    /** User[] */
    private $users;

    public function userOfId(UserId $userId):? User
    {
        if(!isset($this->users[$userId->tostring()]) {
            return null;
        }

        $this->users[$userId->tostring()];
    }

    public function userOfEmail(UserEmail $userEmail):? User
    {
        foreach($users as $user) {
            if($user->getEmail()->sameValueAs($userEmail) {
                return $user;
            }
        }

        return null;
    }
    ...
}

正如你所看到的,在内存中执行,我需要通过电子邮件过滤器的用户,访问他们的电子邮件财产。这必然意味着用户AR需要提供getEmail()的吸气剂。这实在是坏?它允许有必须访问的性能干将?如果我只是considere的getEmail()的吸气剂具有商业含义,在这种情况下,它是完全合法的?

php domain-driven-design aggregate getter ddd-repositories
1个回答
2
投票

吸气的罚款。的“不写干将”的情况下,是为了避免暴露在外面总的内部状态:当你的服务采取的总和,获取其状态,并根据一些决定。这就是你要避免什么。

你可以按照迪米特法则的方针,瞄准这一点。不要力戒消气,但铭记他们。

有一个getIdgetUsername是完全正常的。有一个getCollection-一种方法返回一个可变的集合不是。骨料失去它是一个内部的细节,一个实现细节控制。当你暴露类似getFriends(),你的服务可以调用它,总外面添加或删除的东西,你基本上失去能力重构合计不破坏一切。在这种情况下的addFriend()deleteFriend()会解决这个问题。如果getFriends()返回一个不可改变的集合,它的罚款以及。

不要写getter方法不是一个硬性的规则,尽量不露出外面聚集过多的状态,但不要不必要地没有任何的干将,在你所有的生活变得一团糟。使用它们,如果它是有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.