2011-11-10 15 views
5

Nel nostro progetto abbiamo bisogno di memorizzare qualche oggetto (utente, per esempio) e anche di classe utente deve avere una bandiera di convalida (metodi come setOutdated e isOutdated)Quale modello preferirei?

Di tanto in tanto, il nostro oggetto d'uso possono essere nulli, ma in questo caso il flag di convalida deve essere raggiungibile. È possibile estrarre questi metodi dalla classe User, ma quel campo e questi metodi devono essere all'interno di quella classe a causa della semantica.

Ho trovato alcuni articoli su Null Object pattern (come this), e voglio sapere - è possibile creare Null Object (come pattern) che può memorizzare diversi stati come null obsoleti, null non superati, non null obsoleto e non nullo non obsoleto.

PS: Se un campo introdurre "Vecchio" nella mia classe, sarà davvero difficile oggetto chiaro invece di impostare a NULL

+0

C'è qualche ragione particolare per cui non si desidera controllare se è null prima di chiamare effettivamente "isOutdated()" o simili "controllori di stato"? – DejanLekic

+0

Anche se l'utente è nullo, devo avere accesso al campo obsoleto, quindi devo memorizzare da qualche parte le informazioni – skayred

+0

In tal caso, aggiungerei semplicemente uno stato, ad esempio "readyToUse" che è impostato su false per impostazione predefinita e utilizzare l'oggetto come se fosse "non un null" solo quando readyToUse è vero. – DejanLekic

risposta

2

Si desidera distinguere tra (tra gli altri) "null obsoleto" e "null non superato".
Questo significa che si suggerisce due diversi oggetti null, con un comportamento diverso. Questa è una violazione del modello che dice che un oggetto Nullo dovrebbe avere un tipo di comportamento, il comportamento predefinito per un oggetto non inizializzato del suo tipo.

Suggerisco di utilizzare la soluzione fornita da @Kent o di rendere l'oggetto utente qualcosa come "PresentUser" e "FormerUser". Quest'ultima è tecnicamente la stessa soluzione che tu proponi tu stesso, ma non è un Pattern a Oggetti Nulli.

2

La mia prima idea è l'aggiunta di una classe UserUtil (nome potrebbe essere qualcos'altro) .

e un metodo come

public static boolean isUserOutdated(User u){ 
return (u==null)? true :u.isOutdated(); 

} 

or return (u==null)? false :u.isOutdated(); depends on your businesslogic 

funziona nella vostra situazione?

+0

Ho paura di usare metodi statici perché sembra essere una cattiva pratica in OOP – skayred

+0

mi sembra che i metodi statici per una classe util siano ok. Se davvero odi la staticità, puoi ovviamente rimuovere la 'static' e creare un costruttore appropriato. il punto è, se questa soluzione nella mia risposta funziona nella tua situazione? – Kent

Problemi correlati