Inizio a decomporre il mio dominio con una storia di design. Di cosa parla il mio dominio? Cos'è importante? Quali sono i concetti principali? Quali azioni dovrebbero essere fatte (senza identificare da chi al momento)? Quali sono i confini del mio dominio, cosa sto modellando e cosa non sto modellando?
Successivamente identifico i concetti principali che formano il mio dominio. Probabilmente alcune relazioni importanti potrebbero essere illustrate su una rete semantica. Quindi arriviamo con oggetti candidati. Dovrebbero avere delle chiare responsabilità per essere utili.
Allora vengo con casi d'uso. I miei oggetti candidati apparentemente vi prendono parte. È così che posso avere un'idea di quale responsabilità dovrebbe avere ogni oggetto.
Cose che tengo a mente mentre modellino lo spazio dei miei problemi:
- Gli oggetti sono attivi e intelligenti. Possiedono tutte le risorse di cui hanno bisogno per attuare le proprie responsabilità.
- Le responsabilità dovrebbero essere dichiarate in una voce attiva. È una conseguenza di una dichiarazione precedente.
Quindi parla del tuo dominio.
Design story
Sto modellando una biblioteca. Qualunque persona può visitarlo. Dopo la registrazione, dovrebbe essere in grado di cercare un libro da una libreria, aggiungerlo ai segnalibri, preferirlo o votarlo.
Quindi da questa storia di design concludo che non sto modellando un dominio di nuove entrate di libri. Apparentemente è un sottodominio separato con le proprie responsabilità. Esso rappresenta un diverso business capacità , in altre parole .
Oggetti candidati
Una biblioteca, un utente, un libro.
Use cases
A user searches for a book.
Potrebbe sembrare che sia una responsabilità dell'utente. Ma il pensiero degli oggetti implica che gli oggetti siano attivi e incapsulati. Un utente non può scavare nella parte interna della biblioteca. La biblioteca è responsabile per le informazioni che possiede. Si correla con il concetto esperto di informazioni di GRASP . Quindi, se un utente vuole cercare un libro, dovrebbe chiedere una biblioteca.
A user bookmarks a book.
Un libro potrebbe non sapere nulla che sia segnato da qualcuno. Non è affar suo. Solo un utente si preoccupa di aver inserito qualche libro nei preferiti. Quindi è sicuramente responsabilità dell'utente.
... e così via.
Codice
interface User
{
public function bookmark(Book $book);
public function addToFavourites(Book $book);
public function rate(Book $book);
}
interface Library
{
public function search(Book $book);
}
Ulteriori pensieri
È probabile che l'azione di ogni utente - aggiungendo ai preferiti, ai segnalibri o alla valutazione, finisca con il proprio concetto con le proprie responsabilità. Quindi l'implementazione potrebbe essere la seguente:
class Bookmark
{
private $book;
private $user;
public function __construct(Book $book, User $user)
{
$this->book = $book;
$this->user = $user;
}
public function highlight()
{
// ...
}
}
class Rate
{
private $book;
private $user;
public function __construct(Book $book, User $user)
{
$this->book = $book;
$this->user = $user;
}
public function discard()
{
// ...
}
}
Questi concetti potrebbero essere utilizzati nel punto di ingresso dell'applicazione, quindi probabilmente User
potrebbe essere scartato di queste responsabilità.
dei modi per decomporsi un dominio.