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ı?