Bu bir fabrika için iyi bir aday var mı?

3 Cevap php

Birden çok etki alanı nesneleri oylanacak bir oylama sistemi oluşturmak istiyorsanız:

  • Bir takvim etkinliği
  • Yorum
  • Kullanıcı

Bu yüzden bu öğeler için Voteable arayüzü oluşturmak düşündüm:

interface Voteable
{
    public function vote( User $user, $value );
}

Ben bu vote yöntemi vekil bir depo yöntemi gibi bir şey düşündüm:

class VotingRepository
{
    public function castVote( Voteable $item, User $user, $value )
    {
        // save the these values, along with the value
        $itemId = $item->getId();
        $userId = $user->getId();

    }
}

Şimdilik, depo bir veritabanı olacaktır. Bu veritabanı oyların her tür tabloları bağlama olacak:

  • eventVote
  • commentVote
  • userVote

Yani, bu aslında her etki alanı nesnesi için oy için başka bir tablo ihtiyacı var demektir. Bu bir fabrika için iyi bir aday olurdu? A VotingRepositoryFactory bu durumda? Diğer bir deyişle gibi bir şey:

class VotingRepositoryFactory
{
    createVotingRepository( $type )
    {
        switch( $type )
        {
            case 'event':
                // create a voting repository with EventVote table
                return new VotingRepository( new EventVoteTable() );
            case 'comment':
                // create a voting repository with CommentVote table
                return new VotingRepository( new CommentVoteTable() );
            case 'user':
                // create a voting repository with UserVote table
                return new VotingRepository( new UserVoteTable() );
        }
    }
}

Daha sonra, (örneğin bu durumda Yorumlamak) etki alanı nesneleri içinde, hep birlikte ipe, ben böyle bir şey olacaktır:

class Comment implements Voteable
{
    public function construct()
    {
        $this->_repository = VotingRepositoryFactory::createVotingRepository( 'comment' );
    }

    public function vote( User $user, $value )
    {
        $this->_repository->castVote( $this, $user, $value );
    }
}

Bu mantıklı mı?

3 Cevap

evet depo ve fabrika hem de mantıklı.

fabrika hakkında birkaç yorum:

Ben switch ($type) kaldırmak ve Votable her tür nesne için yöntemler oluşturmak istiyorum. böylece yerine

VotingRepositoryFactory::createVotingRepository( 'comment' );

Ben tercih ederim

VotingRepositoryFactory::createCommentVotingRepository();

nedeni (ben php hakkında emin değilim, ama) olarak adlandırılan bir yöntemi eksik olduğunda derlenen diller size anlatacağım ise, anahtara yeni bir olgu eklemek için unutmak kolay olduğunu olmak. Ayrıca en akıllı IDE yöntemler bir sınıf / nesnede var ne anlatacağım $ olurken, tip, sabit olduğu gibi fabrika yönteme gönderebilirsiniz dizelere ne hatırlayarak.

başka bir fikir VotingRepositoryFactory::Instance->createCommentVotingRepository(); gibi denilebilir singleton'ununu eklemek olacaktır. "Örnek" sonra DatabaseVotingRepositoryFactory veya (birim test için) bir FakeVotingRepositoryFactory veya bir VotingRepositoryFactory başka uygulama olabilir. Eğer birim testleri yazmak veya başka bir depolama sistemine geçmek istiyorsanız bu şekilde kolayca VotingRepositoryFactory uygulanmasını yerini alabilir.

sadece birkaç fikir ..

Evet, öyle.

:]

Oh Evet yapar. +1