Ho un'applicazione (Android) e ho deciso che il livello di presentazione otterrà i dati solo attraverso interfacce rigorose dal controller. Sono al punto in cui alcuni oggetti di base devono essere passati al livello di presentazione, ma gli oggetti stessi devono essere in modalità rigorosa di sola lettura, poiché tutte le modifiche verranno gestite dal controller.
Per fare un semplice esempio, immagina una App ToDo, in cui lo schermo deve visualizzare un elenco di elementi da fare.
L'articolo Todo ha i campi "titolo" e "contenuto" con i rispettivi getter e setter. Anche se passo un elenco non modificabile, gli oggetti in esso contenuti possono essere modificati. Posso pensare a queste alternative:
- metti controller e dati in un unico pacchetto e rendi i setter protetti.
- aggiungi un'interfaccia all'elemento todo contenente solo i getter e passando questi oggetti.
- aggiungi un'interfaccia solo al controller e metti tutti i getter lì.
per 1)
public class TodoItem {
private String title; private String content;
public String getTitle() ...
protected String setTitle(..) ...
}
per 2)
public interface ITodoItem {
public String getTitle();
}
public class TodoItem implements ITodoItem {
private String title; private String content;
@Override
public String getTitle() ...
public String setTitle(..) ...
}
Ora mi chiedo quale sia l'opzione più comune, più intelligente, ecc. (o ce ne sono altri?) e quali sono gli argomenti?
Alternativa 1) per il mio sentimento dipende molto dal fatto che gli elementi devono trovarsi nello stesso pacchetto rendendolo difficile da espandere il programma.
L'alternativa 2) mi sembra strana, perché tutti gli oggetti piccoli diventerebbero un'interfaccia con i metodi getter. Lo sto usando e tecnicamente sono soddisfatto (in quanto mi impedisce di cambiare accidentalmente un oggetto). Tuttavia, non è immutabile, poiché l'oggetto può essere ricondotto a ToDo-Item e quindi l'originale viene modificato. Quindi questo non è buono per gli apis pubblici. Devo davvero clonare ogni oggetto se voglio immutabilità?
L'alternativa 3) diventa rapida perché un controller contiene tutti i getter dei piccoli oggetti. Questo non è conforme a "lasciare che l'oggetto faccia il lavoro".
Quali sono le tue esperienze e pensieri su questo?