posts - 463, comments - 1515, trackbacks - 139

Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Probabilmente proprio tutte non sarebbe neanche utile (se no che provocazione sarebbe?), probabilmente sarebbe un ambiente meno RAD di quello che oggi è, probabilmente il beginner farebbe molta più fatica ...

Il fatto è che tutte le volte che inizio un progetto mi ritrovo sempre a lavorare sulle mie classi che derivano quelle del framework.

Prendiamo i controlli winform, datagrid, textbox, treeview e treenode, ... quasi sempre meritano di essere estesi per aggiungere proprietà, modificare la serializzazione, aggiungere metodi e così via.
Per i controlli webform vale lo stesso principio, per aggiungere script lato client, validazioni, etc.
Poi ci sono esempi che vengono dal framework come i dataset tipizzati.
O ancora, non vale la pena di derivare le varie collection?
E quanti tra noi avrebbero voluto che le classi di ado.net non fossero sealed?
Si potrebbe continuare per molti altri namespace come System.Net, System.Drawing, etc. etc.

Certo, so bene che in molti casi avrebbe poco senso e rischierebbero di rendere farraginosa la programmazione ma se dimenticando questi casi ci viene voglia di dire “si“, forse allora varrebbe la pena di ragionarci, almeno da un punto di vista architetturale dei nostri progetti.

Il fatto è che sono in tanti a scrivere delle helper classes per i controlli (componenti, etc.) invece di estenderli derivandoli. Perciò ripeto: e se tutte le classi del framework non sealed fossero abstract?

Print | posted on sabato 16 ottobre 2004 16.38 | Filed Under [ .NET [Italiano] ]

Feedback

Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Un framework object-oriented, in quanto tale, dovrebbe essere utilizzato esattamente come lo hai descritto in questo post. Le applicazioni basate su un framework dovrebbero essere progettate per riutilizzare il design del framework e non il codice (il fatto che .NET ci metta a disposizione un ricco set di funzioni pronte per l'uso è un altro discorso).
La provocazione ci sta tutta, ma credo che molte helper classes derivino soprattutto dalla scarsa conoscenza del framework .NET piuttosto che dalla necessità/impossibilità di estendere le classi.
Invece di porre vincoli sarebbe meglio conoscere più a fondo i motivi di alcune scelte architetturali per _continuare_ ad applicarle nelle nostre applicazioni, in modo che queste, a loro volta, siano nuove _estensioni_ del framework.
Un'osservazione: secondo voi è giusto che una classe sealed faccia parte di un framework?
16/10/2004 19.12 | Flavio Polesello
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Ciao Raffaele,
finalmente ecco un argomento nel quale siamo completamente d'accordo; unico svantaggio non poter collezionare lunghi thread di bota e risposta nel NG (just joking).

Mentre sono qui (a questa ora assurda) a preparare il materiale per le prossime sessioni che terrò all'agile day 2004 (http://www.agileday.it/) e al fantastico Workshop UGIdotNET "Architecture & Management" mi sono imbattuto sul tuo blog che è a tema.

Quindi a risposta della tua provocazione viene in aiuto “The Martin Metrics” (http://www.objectmentor.com/publications/oodmetrc.pdf) che da un criterio con cui giudicare individuare un buon rapporto tra la stabilità di una classe e la sua astrattezza non solo nei casi estremi (tra cui la tua provocazione trova ottima conferma, quindi è estremamente corretta!!!) ma anche nelle situazioni intermedie identificate dalla “Main Sequence”.

Questa metrica come ogni cosa merita delle eccezioni, ad esempio i tipi base del CTS sono estremamente concreti e stabili, cosa che secondo la metrica sembra negativa ma in realtà questi tipi possono essere rigidi perché non hanno bisogno di cambiamenti ed evoluzioni e di questa rigidità ne benefiziano le prestazioni e la ridotta occupazione di memoria. Stessa situazione si ha nei "Concrete Type" descritti da Stroustrup nel "The C++ programming language".

Rispondo anche a Flavio
> Un'osservazione: secondo voi è giusto che una classe sealed faccia parte di un framework?
La risposta è si, un esempio sono i tipi base, ma poi ci sono anche casi in cui per ragioni di priorità/tempi/costi alcuni tipi non sono stati studiati per essere correttamente derivabili e quindi necessariamente sono dovuti essere marcati sealed.

17/10/2004 3.57 | Luca Minudel
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Flavio, grazie del sostegno :-), concordo pienamente sul fatto che spesso le helper classes derivano da una scarsa conoscenza del framework o più generalmente parlando di OOP. Questo è un tarlo che ho in mente da tantissimi anni quando ho cominciato a detestare MFC per le grandi restrizioni in merito all'espandibilità degli oggetti (mancanza di virtual ad esempio).
Per quello che concerne la tua domanda forse si capiva già dal mio post che sono dello stesso avviso di Luca. Ci sono classi che hanno senso siano sealed. La prima che mi è venuta in mente leggendo il tuo post è DBNull ma d'altra parte ce ne sono anche molte sealed che avrei voluto non lo fossero (vedi ado.net).
Credo però che Microsoft abbia fatto un uso attento di sealed, in particolare per evitare il proliferare di framework sopra il framework. Penso che questo sia proprio quello che è avvenuto in ado.net dove già Microsoft sapeva di dover ritoccare il progetto (vedi novità di ado.net 2.0) e non voleva che i progetti si legassero in modo troppo stretto all'attuale architettura della 1.1
17/10/2004 10.51 | Raffaele Rialdi
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Ciao Luca, mi sa che te la prendi troppo per le mie risposte sui ng ;-)
Ovviamente concordo con quanto hai commentato. Tra le altre le affermazioni di Stroustrup sono quelle che ho più care da molto tempo.
La provocazione in realtà lascia spazio ad una possibile evoluzione dei compilatori. Così come in vs2005 fxcop entra prepotentemente nella finestra dei warning in compilazione, ci sarà mai lo spazio per dare dei warning a livello architetturale-oop?

Attualmente penso di no, perchè già oggi 'litighiamo' con i team di sviluppo affinchè tolgano la default instance di vb2005 (o almeno la rendano opzionale) senza successo. Il succo è che il RAD porta molti inesperti alla programmazione e alla fine un framework e relativi compilatori che dovessero imporre regole rigide anche nell'architettura, costituirebbero uno scalino troppo alto.
17/10/2004 11.01 | Raffaele Rialdi
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Anche la mia voleva essere una provocazione :-)
Però quello che intendevo dire è che ci sono alcune classi nel framework che rappresentano già una prima estensione dell'infrastruttura e che andrebbero conosciute per riutilizzare i concetti di base e il design più che il codice.
Il primo esempio che mi viene in mente è nel tracing: ho visto applicazioni che invece di avere nuove implementazioni di TraceListener hanno helper classes che scrivono il log su un database.
Per scrivere buone applicazioni che si appoggiano su un framework (non solo .NET) bisognerebbe conoscere bene gli hot spot e partire da quelli, quando è possibile.
17/10/2004 11.21 | Flavio Polesello
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Trovo interessante la domanda posta da Raffaele ed i successivi sviluppi. Senza voler approfondire dei concetti già da voi affrontati con competenza, volevo solo aggiungere che spesso sono le aziende che non investono sulla preparazione degli sviluppatori; se si riesce a far girare in qualche modo il progetto allora è sufficiente, non importa se poteva essere fatto meglio e se non sono state rispettate le regole di base del Framework di sviluppo.
Il povero programmatore deve quindi caricare su se stesso l'onere di uno studio più approfondito, cosa che io ritengo stimolante, ma che spesso molti non fanno :-(
18/10/2004 9.21 | Daniele Proietti
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Ciao Daniele, convengo con te su questo problema e sappiamo che i corsi sono tra le prime cose che vengono tagliate quando ci sono i costi di mezzo.
Il problema però forse nasce prima: non è che nelle nostre università si fa troppa teoria e poca pratica? Quante delle nozioni teoriche insegnate vengono spiegate in chiave applicativa? Io ho avuto docenti che non mi hanno saputo dire a cosa servissero in pratica certe teorie (jordanizzare una matrice per esempio, ma non è l'unico esempio).
Negli USA accade l'opposto dove gente chiede se hanno mai tradotto la Divina Commedia in Italiano, ma forse questo fa meno danni.
18/10/2004 10.05 | Raffaele Rialdi
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Non ho frequentato l'università quindi non posso rispondere con molta cognizione di casua, la mia esperienza proviene dalla pratica e da libri (o documentazione internet) studiati "on my own";i corsi finanziati dalle aziende li posso contare sulla punta delle dita (di una sola mano).
Penso comunque che hai centrato il segno, in quanto essendo da molti anni nel mondo dell'informatica ho incontrato diversi programmatori di diversa estrazione, spesso i laureati (che magari non hanno una grande esperienza lavorativa) hanno una grande conoscenza teorica ma non riescono a tradurla efficacemente in pratica.
Al contrario programmatori con molta esperienza (ma magari con meno cultura) riescono a trovare una soluzione che "funziona" ma che poi studiandola a fondo fa "rabbrividire" per come è scritta.
Penso comunque che il segreto di un buon programmatore sia quello di non considerarsi mai "arrivato", ma di continuare a studiare e migliorarsi sempre sia dal punto di vista teorico che pratico.
18/10/2004 10.37 | Daniele Proietti
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Direi che entrambe le provocazioni di Raffaele siano quanto meno legittime nel senso che nella maggioranza dei casi ci si trova sempre a crearsi un proprio framework "derivato" da quello di sistema. Tuttavia sono dell'idea che questo "taglierebbe" le gambe ai meno esperti con una conseguente immagine negativa del prodotto (basti pensare a tutti i provenienti da VB6).
04/11/2004 14.41 | Tommaso Caldarola
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Damien Morton lo chiama "the dead-end-by-default design of the BCL":
http://www.bitfurnace.com/blog/archives/2004/07/deadends_in_the_1.html
20/12/2004 5.19 | Adrian Florea
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

Ciao Adrian, concordo assolutamente e forse questo da ancora di più l'idea che Microsoft spinga l'evoluzione del framework in specifiche direzioni. Per le classi sealed è sotto gli occhi di tutti in System.Data, perle implementazioni paraziali lo è nelle classi e interfacce del CodeDom.
20/12/2004 8.33 | Raffaele Rialdi
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

un'interessante discussione a riguardo:
http://weblogs.asp.net/cazzu/archive/2005/08/29/IHateSealed.aspx
19/09/2005 11.16 | Adrian Florea
Gravatar

# re: Provocazione: e se tutte le classi del framework non sealed fossero abstract?

eh eh ... grazie ;-)
21/09/2005 2.16 | Raffaele Rialdi

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 4 and 1 and type the answer here:

Powered by: