Ich möchte ein Voting-System zu schaffen, in denen mehrere Domänenobjekte, über die abgestimmt werden können:Ist das ein guter Kandidat für eine Fabrik?
- ein Kalenderereignis
- Kommentar
- ein Benutzer
So würde ich dachte, ich erstellen eine Voteable
Schnittstelle für diese Artikel:
interface Voteable
{
public function vote(User $user, $value);
}
Ich dachte, die vote
Methode würde Proxy eine Repository-Methode, so etwas wie:
class VotingRepository
{
public function castVote(Voteable $item, User $user, $value)
{
// save the these values, along with the value
$itemId = $item->getId();
$userId = $user->getId();
}
}
Vorerst wird das Repository eine Datenbank sein. Diese Datenbank wird Tabellen für jede Art von Stimme verbindet:
- eventVote
- commentVote
- userVote
Also, das bedeutet im Wesentlichen, dass jede Domain-Objekt eine andere Tabelle, die die Stimmabgabe muss . Wäre das ein guter Kandidat für eine Fabrik? A VotingRepositoryFactory
in diesem Fall? Mit anderen Worten so etwas wie:
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());
}
}
}
Dann alles zusammen zu binden, von innerhalb der Domain-Objekte (Kommentar in diesem Fall zum Beispiel), würde ich so etwas wie folgt aussehen:
class Comment implements Voteable
{
public function construct()
{
$this->_repository = VotingRepositoryFactory::createVotingRepository('comment');
}
public function vote(User $user, $value)
{
$this->_repository->castVote($this, $user, $value);
}
}
Ist diese Sinn ergeben?
Denken Sie daran, sich nicht zu sehr mit den Designmustern zu beschäftigen. Entwurfsmuster erzeugen eleganten und leicht zu wartenden Code, wenn sie effektiv und vernünftig verwendet werden. Sie möchten jedoch auch die Gefahr vermeiden, 10 Fuß Gerüste zu bauen, nur um Ihre Uhr an die Wand zu hängen. Das heißt, ich mag es, auf der Seite von zu viel Gerüst zu irren. ;-) –
@Jeff: Ich höre was du sagst. Die Website wird jedoch (zumindest für mich) ein ziemlich ehrgeiziges Projekt sein. Also wollte ich, dass es so gut wie möglich vom Gitarristen geht. –