Il mio testo del corso suggerisce di creare una classe 'facciata' per astrarre completamente l'interfaccia utente dal livello dominio. Cioè, l'interfaccia utente utilizza solo tipi di base e, se ha bisogno di un riferimento a un oggetto dominio, la conosce solo come Object
.
Per darti un'idea, questo è quello che potrebbe sembrare (esempio in Java ma potrebbe applicarsi anche ad altre lingue):
public class Facade
{
...
public Object getLastOrder(Object customer)
{
Customer castCustomer = (Customer)customer;
Order lastOrder = domainController.getLastOrder(castCustomer);
return lastOrder;
}
}
Nota: non sono sicuro che si tratti di un tipo di modello di facciata (l'ho sentito diversamente definito altrove), ma non voglio che troppo sia impantanato la terminologia.
Rispetto a nulla (se l'interfaccia utente chiama direttamente il controller di dominio), posso vedere che questo ha il vantaggio che l'interfaccia utente è molto più indipendente dalle modifiche all'implementazione del modello di dominio. C'è sempre il rischio che cambiamenti molto importanti (come non avere più nulla che rappresenti un ordine) spezzino le cose, ma questo sembra essere in grado di assorbire qualsiasi altra cosa.
Tuttavia, sembra sacrificare il controllo dei tipi e ciò significa che ottenere anche proprietà semplici degli oggetti di dominio più complicate di quanto necessario ( anOrder.getNumber()
vs facade.getOrderNumber(anOrder)
).
Il mio pensiero era che sarebbe stato meglio per l'interfaccia utente fare riferimento agli oggetti del dominio in termini di interfacce, piuttosto che semplici oggetti. Ad esempio:
public class Facade
{
...
public IOrder getLastOrder(ICustomer customer)
{
Customer castCustomer = (Customer)customer;
Order lastOrder = domainController.getLastOrder(castCustomer);
return lastOrder;
}
}
o anche se il controller di dominio stesso esponeva solo i tipi di interfaccia, dimenticando completamente la "facciata".
Per quanto posso vedere, è meglio da un punto di vista del tipo di controllo. Le principali modifiche (ad esempio la rimozione di Order
dal sistema) possono rompere le cose, ma ciò era vero per la soluzione 'plain Object
'.
E tutti i metodi che sono stabili (ad esempio anOrder.getNumber()
) possono essere specificati nelle interfacce, quindi chiamarli dall'interfaccia utente è più semplice e più orientato agli oggetti. Ovviamente questo si applica solo ai metodi le cui firme sono stabili, per evitare di rompere l'interfaccia utente, ma l'implementazione è ancora libera di cambiare.
C'è qualcosa che mi manca? La mia soluzione 'interfaccia' presenta degli inconvenienti che non ho individuato? O c'è una soluzione completamente diversa e migliore che non ho però?