Ho visto questo pattern utilizzato in una notevole quantità di applicazioni MVC. Supponiamo di avere un modello utente con i metodi:
- hasSessionExpired
- displaySessionExpired
Il primo metodo (hasSessionExpired) cerca nel database se la sessione dell'utente è scaduta e restituisce true o false e il secondo chiama il primo metodo e restituisce una stringa HTML che in pratica dice "Expired" con un carattere rosso o "Active "con un carattere verde in base all'output di hasSessionExpired.
Nel controller c'è una chiamata all'oggetto User per recuperare tutti gli utenti che vengono restituiti come una matrice di oggetti User, questo array viene inviato alla vista.
Quindi nella vista, l'array viene iterato e viene chiamato il metodo displaySessionExpired per ogni oggetto dell'array.
C'è qualcosa che ha un odore fondamentalmente sbagliato in questo approccio, dal momento che il modello ha una logica di presentazione nel metodo displaySessionExpired e l'esito di tale logica è basato sul risultato di una query di database eseguita in quel momento. Ciò ovviamente rende le classi modello con migliaia di linee afflitte da mix di presentazione e logica aziendale che a lungo termine rendono l'applicazione più difficile da mantenere.
Come dovrebbe essere refactored quindi c'è una chiara separazione delle preoccupazioni?