Capisco il concetto di un oggetto e, come programmatore Java, sento che il paradigma OO mi viene in pratica in modo naturale.
Tuttavia recentemente mi sono ritrovato a pensare:
Aspetta un secondo, quali sono in realtà i vantaggi pratici dell'utilizzo di un oggetto rispetto all'utilizzo di una classe statica (con incapsulamento corretto e pratiche OO)?
Potrei pensare a due vantaggi dell'utilizzo di un oggetto (entrambi sono significativi e potenti):
Polimorfismo: consente di scambiare funzionalità in modo dinamico e flessibile durante il runtime. Consente inoltre di aggiungere facilmente nuove funzionalità "parti" e alternative al sistema. Ad esempio, se esiste una
Car
classe progettata per funzionare con gliEngine
oggetti e si desidera aggiungere un nuovo motore al sistema che l'automobile può utilizzare, è possibile creare una nuovaEngine
sottoclasse e semplicemente passare un oggetto di questa classeCar
nell'oggetto, senza dover cambiare qualcosaCar
. E puoi decidere di farlo durante il runtime.Essere in grado di "passare funzionalità": è possibile passare un oggetto attorno al sistema in modo dinamico.
Ma ci sono altri vantaggi per gli oggetti rispetto alle classi statiche?
Spesso quando aggiungo nuove 'parti' a un sistema, lo faccio creando una nuova classe e istanziando oggetti da esso.
Ma di recente, quando mi sono fermato a pensarci, mi sono reso conto che una classe statica avrebbe fatto lo stesso di un oggetto, in molti dei luoghi in cui normalmente uso un oggetto.
Ad esempio, sto lavorando per aggiungere un meccanismo di salvataggio / caricamento file alla mia app.
Con un oggetto, la riga chiamante del codice sarà simile alla seguente: Thing thing = fileLoader.load(file);
Con una classe statica, sarebbe simile al seguente: Thing thing = FileLoader.load(file);
Qual è la differenza?
Abbastanza spesso non riesco proprio a pensare a un motivo per istanziare un oggetto quando una semplice classe statica avrebbe agito allo stesso modo. Ma nei sistemi OO, le classi statiche sono abbastanza rare. Quindi mi manca qualcosa.
Ci sono altri vantaggi per gli oggetti diversi dai due che ho elencato? Spiega per favore.
EDIT: per chiarire. Trovo gli oggetti molto utili quando si scambiano funzionalità o si passano dati. Ad esempio ho scritto un'app che compone melodie. MelodyGenerator
aveva diverse sottoclassi che creano melodie in modo diverso e gli oggetti di queste classi erano intercambiabili (modello di strategia).
Anche le melodie erano oggetti, poiché è utile passarle in giro. Così erano gli accordi e le scale.
Ma che dire delle parti "statiche" del sistema - che non passeranno in giro? Ad esempio: un meccanismo "salva file". Perché dovrei implementarlo in un oggetto e non in una classe statica?
FileLoader
con uno che legge da un socket? O un finto per i test? O uno che apre un file zip?
System.Math
in .NET è un esempio di qualcosa che ha molto più senso come classe statica: non avrai mai bisogno di cambiarlo o deriderlo e nessuna delle operazioni potrebbe logicamente far parte di un'istanza. Non credo proprio che il tuo esempio di "risparmio" si adatti a quel conto.
Thing
?