Questo design risale davvero a Smalltalk, che vedrei in gran parte come un tentativo di perseguire l'orientamento agli oggetti a spese di quasi tutte le altre preoccupazioni. Come tale, tende (a mio avviso) a utilizzare l'orientamento agli oggetti, anche quando altre tecniche sono probabilmente (o addirittura certamente) superiori.
Avere una singola gerarchia con Object
(o qualcosa di simile) alla radice rende abbastanza facile (per un esempio) creare le tue classi di raccolta come raccolte di Object
, quindi è banale che una raccolta contenga qualsiasi tipo di oggetto.
In cambio di questo vantaggio piuttosto minore, si ottiene una serie di svantaggi. Innanzitutto, dal punto di vista del design, ti ritrovi con alcune idee davvero folli. Almeno secondo la visione Java dell'universo, cosa hanno in comune l'ateismo e una foresta? Che entrambi hanno hashcode! Una mappa è una raccolta? Secondo Java, no, non lo è!
Negli anni '70, quando fu progettato Smalltalk, questo tipo di assurdità fu accettato, principalmente perché nessuno aveva progettato un'alternativa ragionevole. Smalltalk fu ultimato nel 1980 e nel 1983 fu progettato Ada (che include i generici). Sebbene Ada non abbia mai raggiunto il tipo di popolarità che alcuni avevano previsto, i suoi generici erano sufficienti a supportare raccolte di oggetti di tipo arbitrario, senza la follia insita nelle gerarchie monolitiche.
Quando furono progettati Java (e, in misura minore, .NET), la gerarchia di classi monolitiche era probabilmente vista come una scelta "sicura" - una con problemi, ma per lo più nota . La programmazione generica, al contrario, era quella che quasi tutti (anche allora) hanno capito che almeno teoricamente era un approccio molto migliore al problema, ma che molti sviluppatori orientati al commercio consideravano piuttosto scarsamente esplorato e / o rischioso (cioè, nel mondo commerciale , Ada è stato in gran parte respinto come un fallimento).
Vorrei essere cristallino però: la gerarchia monolitica è stata un errore. Le ragioni di quell'errore erano almeno comprensibili, ma era comunque un errore. È una cattiva progettazione e i suoi problemi di progettazione pervadono quasi tutto il codice che la utilizza.
Per un nuovo design oggi, tuttavia, non c'è una domanda ragionevole: usare una gerarchia monolitica è un errore evidente e una cattiva idea.
object
nel framework .NET in parte perché fornisce alcune funzionalità di base su tutti gli oggetti, comeToString()
eGetHashCode()