Sarà poi così speciale lo special case?

Innanzitutto per chi ancora non lo conosce come pattern può sempre vedere qui.
Ma è davvero così utile? O almeno...lo è in tutti i casi?

Nella fattispecie parlerò di UnknownEntity Special Case, cioè uno special case che si dovrebbe restituire (secondo Fowler) se la ricerca di una Entità fallisce, e invece di scatenare una eccezione, o ritornare un null viene ritornato un tipo UnknownEntity (che eredita da Entity).

Situazione classica:
Da un provider di dati per la classe Cliente voglio ottenere quello con un particolare Id
Da qualche parte, in qualche modo ci scapperà di fare il test se l'entità ritornata è UnknownEntity

Cliente cliente = ClienteProvider.Load(id)
if ( cliente is UnknownEntity ) ...

Che in quanto a bruttezza ...non ci scherza neanche...
la mamma mi ha sempre insegnato che la identificazione a Runtime dei tipi è una cosa esteticamente poco piacevole.
Quell'if è d'obbligo...se non troviamo un Cliente...dovremmo cambiare form di presentazione, avvertire l'utente...loggare da qualche parte...insomma non si scappa...

Visto che quando carico una entità che "dovrebbe" essere unica i casi sono sempre questi

  1. Nessuna Entità trovata.
  2. Una Entità trovata (quella giusta).
  3. Più di una Entità trovata (supponendo che nel mio database non c'è controllo sugli indici....affari vostri)

Allora mi viene da dire...
Tutti i metodi di ricerca di un provider di dati potrebbero ritornare delle liste, anche nel caso di ricerca per chiave primaria:

public IList<T> Load(int id)
{
    List<T> lista = new List<T>();
    // Implementazione della ricerca. Eventualmente .Add(Entita)
    return lista;
}

Il codice che utilizza quel provider non ha che da testare il .Count per decidere cosa fare.

IList lista = ClienteProvider.Load(id)
if (lista.Count != 0)  { cliente = lista[0]; }
else
(...)

Non ci sono null neanche in questo caso (che è lo scopo del pattern Special Case)...
e non è neanche come potrebbe sembrare una riga di codice in più....dato che nel provider...non ci sarà una gestione dello Special Case.
Ci evitiamo così di scrivere un UnknownEntity per ogni classe che abbiamo sul nostro dominio.

(Discorso diverso si potrebbe fare per una MissedEntity...magari più avanti)

Ho aperto anche un thread su Metodologie nel nostro forum...i vostri commenti ed esperienze sono graditissimi.

Print | posted on Monday, October 9, 2006 2:03 PM

Comments have been closed on this topic.