Non molto tempo fa, avevo inserito nei miei progetti una mia interfaccia IUnknowEntity che mi ha permesso di far gestire (o forse far digerire) gli special case "Unknow" (i "Missing" IMHO vanno gestiti dal DAL) a NHibernate.
In poche parole tutti gli special case "Unknow" delle mie entità implementano l'interfaccia IUnknowEntity e sviluppando un PropertyAccessor custom per NHibernate si può dire semplicemente al custom Getter di inserire null nel db nel caso in cui l'entità che deve persistere implementa IUnknowEntity.
BTW, di recente mi sono anche reso conto che come ISetter può essere tranquillamente utilizzato il BasicSetter se la relativa proprietà della classe utilizza una lazy initialization nella get (come è giusto che sia), rendendo superflua la Factory che utilizzavo in precedenza.
Al di là di quanto scritto sopra, in un ottica di... "UnitDeveloping" penso che sia assolutamente sempre giusto in ogni funzione verificare se gli oggetti coinvolti siano degli special case, ma questo porta ad uno svantaggio e ad un potenziale problema:
- Ogni volta nel codice "tocca" scrivere qualcosa di simile a:
if (entity is UnknowEntity || entity is MissingEntity || entity is OtherSpecialCaseType) {...}
a svantaggio della corposità e forse della leggibilità del codice
- Potrebbero aggiungersi in un secondo tempo altri special case oltre ad Unknow e Missing per quell'entità ed il metodo non sarebbe in grado di riconoscerlo (come neppure i vari test scritti per quella funzione...).
Per ovviare a questo problema oggi mi sono finalmente deciso ad introdurre ciò che avevo pensato parecchio tempo fa, ovvero un interfaccia "base" ISpecialCase da cui derivano le varie ed eventuali interfacce di Special Case specifiche (IUnknowEntity : ISpecialCase, nel caso specifico).
In questo modo è sufficiente, ovviamente nel caso di un test non specifico, scrivere semplicemente:
if (entity is ISpecialCase) {...}
ed entrambi i punti precedenti, soprattutto il secondo, dovrebbero essere risolti.