Ho cominciato a scrivere questo post mentre la mia
connessione Web va e viene. Ieri sera, mentre io e mio fratello
discutevamo su perchè una classe va scritta in un certo modo, su come
implementare un domain model, su perchè è meglio creare proprie classi custom
per fare determinati lavori, ho avuto un sussulto.
Marco ci ha detto poco tempo fa come implementare l'interfaccia
ITypedList su una custom collection per comunicare al FX
come questa collection deve essere bindata ad una DataGridView (DGV).
Implementare questa interfaccia significa sostanzialmente scrivere due metodi
pubblici, che il FX esegue la prima volta che viene richiesto il binding della
custom collection. In uno di questi due metodi,
GetItemProperties, dobbiamo semplicemente ritornare un oggetto
PropertyDescriptorCollection che rappresenta l'elenco di
property (colonne) che vogliamo mostrare sulla DGV. Quindi, possiamo
rimuovere colonne che non ci servono, riordinarle a piacimento, e così via.
Il tutto è tecnicamente corretto, ma c'è una questione di approccio che non
mi convince. Con la ITypedList, infatti, doniamo ad un business object la
capacità di auto-descriversi verso gli altri, spiegando a chiunque lo richieda
come deve essere mostraro. L'abbiamo detto prima: quando il FX deve
bindare la custom collection sulla DGV, prima le chiede cosa
mostrare e come mostrarlo.
Sono però convinto che questa capacità debba essere
slegata dal business object, perchè un certo oggetto può
innanzitutto mostrarsi con modalità diverse, a seconda del contesto, oppure,
molto più grave, a seconda della UI che stiamo sviluppando. Un oggetto non deve
per sua natura sapere come verrà mostrato, perchè il
come dipende dal dove, ed un business object non è in
alcun posto, esiste e basta. Il dove viene determinato da altri fattori, dalla
UI che stiamo creando (WinForms, Web, Mobile, WPF), dallo scenario in cui
ci troviamo all'interno dell'applicazione (una vista contabile mostra contenuti
fortemente diversi da altre viste), oppure dalle impostazioni personalizzate
dell'utente corrente (l'utente IDamiani può ad esempio decidere di non vedere
una certa colonna).
Quindi, è vero che la custom collection deve implementare
ITypedList, ma l'implementazione spetta ad un'altra classe di
supporto, che può cambiare in base ai fattori di cui ho parlato prima.
Il
tutto, very very IMHO.