2

すべてのDDDの例で見てきたように、コレクションはクラスとして実装されています。たとえば、PHPMasterのWebサイトでは次のようになっています。

<?php
namespace Model\Collection;
use Mapper\UserCollectionInterface,
    Model\UserInterface;

class UserCollection implements UserCollectionInterface
{
    protected $users = array();

    public function add(UserInterface $user) {
        $this->offsetSet($user);
    }

    public function remove(UserInterface $user) {
        $this->offsetUnset($user);
    }

    public function get($key) {
        return $this->offsetGet($key);
    }

    public function exists($key) {
        return $this->offsetExists($key);
    }

    public function clear() {
        $this->users = array();
    }

    public function toArray() {
        return $this->users;
    }

    public function count() {
        return count($this->users);
    }

    public function offsetSet($key, $value) {
        if (!$value instanceof UserInterface) {
            throw new \InvalidArgumentException(
                "Could not add the user to the collection.");
        }
        if (!isset($key)) {
            $this->users[] = $value;
        }
        else {
            $this->users[$key] = $value;
        }
    }

    public function offsetUnset($key) {
        if ($key instanceof UserInterface) {
            $this->users = array_filter($this->users,
                function ($v) use ($key) {
                    return $v !== $key;
                });
        }
        else if (isset($this->users[$key])) {
            unset($this->users[$key]);
        }
    }

    public function offsetGet($key) {
        if (isset($this->users[$key])) {
            return $this->users[$key];
        }
    }

    public function offsetExists($key) {
        return ($key instanceof UserInterface)
            ? array_search($key, $this->users)
            : isset($this->users[$key]);
    }

    public function getIterator() {
        return new \ArrayIterator($this->users);
    }
}

そしてインターフェース:

<?php
namespace Mapper;
use Model\UserInterface;

interface UserCollectionInterface extends \Countable, \ArrayAccess, \IteratorAggregate 
{
    public function add(UserInterface $user);
    public function remove(UserInterface $user);
    public function get($key);
    public function exists($key);
    public function clear();
    public function toArray();
}

単純な配列を使用しないのはなぜですか?特定の実装を使用することでどのようなメリットがありますか?

4

1 に答える 1

1

特定の実装を使用することでどのようなメリットがありますか?

新しいユーザーが追加または削除されるたびに反応するなど、追加の動作でUserCollectionを簡単に拡張できます(オブザーバーパターンなど)。配列を使用すると、そのようなロジックをあちこちに分散させる必要がありますが、クラスを使用すると、このロジックを1つの場所に配置して、そこで制御できます。また、よりテスト可能です。

UserCollectionの概念が常にドメインの制約に準拠していることを確認するコードをチェックする不変条件を含めることもできます。

制約や追加の動作がすぐに必要ないように思われる場合でも、これらはプロジェクトライフの後半で発生する可能性があり、拡張性を考慮して設計されていないコードベースに実装するのはやや困難です。

于 2013-01-22T22:40:33.127 に答える