Classi contro "dati liberi" + funzioni
La libertà dei dati è sempre a scapito della libertà del programmatore:
- Con un POD sei libero di fare ciò che vuoi. E quello che vuoi, lo implementerai in una funzione ben sovraccaricata.
- Ma anche altri programmatori (o il tuo futuro te stesso) sono liberi di fare ciò che vogliono ed esprimere la loro creatività. Sono liberi di spararsi ai piedi se non prestano molta attenzione a quello che fanno.
- Inoltre, non appena esponi un POD pubblicamente, non è più una libertà: è un debito tecnico istantaneo! Perché, poiché non hai più il controllo su come vengono utilizzati i dati, non hai più il potere di modificare la struttura come desideri (ad esempio se decidessi di sostituire un giorno intero, un mese, un anno con un singolo campo data). Le modifiche richiederebbero un'attenta analisi di tutto il codice utilizzando questi dati.
- Nei piccoli sistemi con un paio di programmatori puoi imporre una certa disciplina che mitiga questi rischi. Tuttavia, nella programmazione a livello di grandi (motori di veicoli spaziali, centrali nucleari, sistemi di telecomunicazione), con migliaia di programmatori, tale visibilità causerà inevitabilmente bug o dipendenze indesiderate che ostacolano la manutenibilità futura. È statistico.
Questo è il motivo per cui sono stati compiuti tanti sforzi nei linguaggi di programmazione per controllare la visibilità dei dati e le funzioni sono state un problema nei sistemi di grandi dimensioni, dal momento che i primi giorni della programmazione strutturata:
- Nel mondo pre-object oriented, questo ha portato al concetto di modulo di Simula che è stato sviluppato ulteriormente in linguaggi come Modula2 o ADA.
- Nelle lingue più recenti orientate agli oggetti, questo ha portato al concetto di classe. La classe ti consente, tra l'altro, di creare e gestire più istanze con estrema facilità mentre nei moduli non hai questa facitabilità.
Quello che cerco di dire sopra è che la disciplina delle classi ti dà più libertà di quanto pensi. È solo una questione di punto di vista (cioè il proprietario della classe rispetto al consumatore).
Quali classi possono fare di più
Come hai detto, le classi possono fare più di dati gratuiti con funzioni:
- incapsulamento e separazione delle preoccupazioni
- astrazione dati
- l'ereditarietà passando da una classe generale a più specifiche
- polimorfismo, consentendo l'invocazione di funzioni / metodi specifici di una classe senza sapere in fase di compilazione quale classe sarà l'oggetto
Le classi sono anche un blocco di edifici per ulteriori libertà:
- Abbiamo assistito nelle principali lingue all'emergere della programmazione generica, che consente di definire una funzione generica indipendentemente dai dati che deve manipolare.
- Anche il concetto di design pattern è stato un passo avanti. È difficile immaginare tali modelli implementati con POD e funzioni. (In effetti posso immaginarlo, perché l'ho fatto per anni in un linguaggio non orientato agli oggetti: funziona ma con quale complessità ...)
Conclusione
Come conclusione, una citazione da Bjarne Stroustrup :
Do we really need multiple inheritance? Not really. We can do without multiple inheritance by using
workarounds, exactly as we can do without single inheritance by using
workarounds. We can even do without classes by using workarounds.
(...) The reason languages provide
inheritance (...) is that language-supported inheritance is typically
superior to workarounds (e.g. use of forwarding functions to
sub-objects or separately allocated objects) for ease of programming,
for detecting logical problems, for maintainability, and often for
performance.