0

要点にまっすぐ。

abstract class AbstractRepository {

    private $mapper;

    public function __construct(AbstractMapper $mapper) {
        $this->mapper = $mapper;
    }

    public function save(AbstractEntity $entity) {
        return $this->mapper->save($entity);
    }

    public function delete(AbstractEntity $entity) {
        return $this->mapper->delete($entity);
    }

}

class UserRepository extends AbstractRepository {

    private $userMapper;

    public function __construct(UserMapper $userMapper) {
        parent::__construct($userMapper);
        $this->userMapper = $userMapper;
    }

    public function fetchByUsername($username) {
        return $this->userMapper->fetch( array('username' => $username) );

}

VS

abstract class AbstractRepository {

    // Different visibility
    protected $mapper;

    public function __construct(AbstractMapper $mapper) {
        $this->mapper = $mapper;
    }

    public function save(AbstractEntity $entity) {
        return $this->mapper->save($entity);
    }

    public function delete(AbstractEntity $entity) {
        return $this->mapper->delete($entity);
    }

}

class UserRepository extends AbstractRepository {

    // $userMapper property gone

    public function __construct(UserMapper $userMapper) {
        parent::__construct($userMapper);
    }

    public function fetchByUsername($username) {
        return $this->mapper->fetch( array('username' => $username) );

}

UserRepositoryが のインスタンスを保持することがより明示的かつ具体的であるため、私は最初の方法が好きですUserMapper

2 番目の方法は、コードが少ないため優れていますが、線を引きます

return $this->mapper->fetch( array('username' => $username) );

ほど明確ではありません

return $this->userMapper->fetch( array('username' => $username) );

ユーザーリポジトリにいるとき、それ$this->mapperが のインスタンスであることはわかっていますが、 のUserMapperようにアドレス指定することを好みます$this->userMapper

このようなシナリオで何をするのが最善かについてのルールはありますか?

ありがとう。

4

1 に答える 1

1

最初のアプローチは意味がありません...コードを複製しています。

あなたが理解しなければならないのは、それUserRepositoryにはまだ$mapperプロパティがあるということです。であるため、直接アクセスすることはできませんprivate。これを行うには、アクセサー メソッドが必要です。

abstract class AbstractRepository {

    // Different visibility
    private $mapper;

    public function __construct(AbstractMapper $mapper) {
        $this->mapper = $mapper;
    }

    protected function getMapper() {
        return $this->mapper;
    }

    public function save(AbstractEntity $entity) {
        return $this->mapper->save($entity);
    }

    public function delete(AbstractEntity $entity) {
        return $this->mapper->delete($entity);
    }

}

class UserRepository extends AbstractRepository {

    // $userMapper property gone

    public function __construct(UserMapper $userMapper) {
        parent::__construct($userMapper);
    }

    public function fetchByUsername($username) {
        return $this->getMapper()->fetch( array('username' => $username) );

}

*Repositoryこのようにして、サブクラスのいずれかが で奇妙なことを行うことを保証できますが$mapper、 でそれを「読み取る」ことはできますgetMapper

あなたの2番目のアプローチも正しいですが、制限が少なくなります。

于 2013-11-07T21:49:22.487 に答える