Я хочу создать систему голосования, в которой можно голосовать за несколько объектов домена:
- событие календаря
- комментарий
- пользователь
Итак, я решил создать интерфейс Voteable
для этих элементов:
interface Voteable
{
public function vote( User $user, $value );
}
Я думал, что этот vote
метод будет использовать прокси-метод, например:
class VotingRepository
{
public function castVote( Voteable $item, User $user, $value )
{
// save the these values, along with the value
$itemId = $item->getId();
$userId = $user->getId();
}
}
На данный момент хранилище будет базой данных. Эта база данных будет иметь таблицы ссылок для каждого типа голосования:
- eventVote
- commentVote
- userVote
Итак, это, по сути, означает, что каждому объекту домена нужна другая таблица, чтобы отдать голоса. Будет ли это хорошим кандидатом на завод? А VotingRepositoryFactory
в этом случае? Другими словами что-то вроде:
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() );
}
}
}
Затем, связав все это изнутри объектов домена (например, комментарий в этом случае), я бы выглядел примерно так:
class Comment implements Voteable
{
public function construct()
{
$this->_repository = VotingRepositoryFactory::createVotingRepository( 'comment' );
}
public function vote( User $user, $value )
{
$this->_repository->castVote( $this, $user, $value );
}
}
Имеет ли это смысл?