Capisco il concetto di un oggetto e, in quanto programmatore Java, sento che il paradigma OO mi viene piuttosto naturale nella pratica.
Comunque recentemente mi sono trovato a pensare:
Aspetta un secondo, quali sono in realtà i benefici pratici dell'uso di un oggetto rispetto all'uso di una classe statica (con incapsulamento e pratiche OO appropriate)?
Potrei pensare a due vantaggi dell'uso di un oggetto (entrambi sono significativi e potenti):
-
Polymorphism: consente di scambiare la funzionalità in modo dinamico e flessibilmente durante il runtime. Permette anche di aggiungere nuove funzionalità 'parti' e alternative al sistema facilmente. Ad esempio se c'è una classe
Car
progettata per funzionare con oggettiEngine
e tu vuoi aggiungere un nuovo Motore al sistema che l'auto può usare, puoi crearne uno nuovoEngine
sottoclasse e semplicemente passare un oggetto di questa classe nel fileCar
oggetto, senza dover modificare nulla suCar
. E puoi decidere di farlo durante il runtime. -
Essere in grado di "passare la funzionalità in giro": puoi passare un oggetto attorno al sistema in modo dinamico.
Ma ci sono ulteriori vantaggi per gli oggetti rispetto alle classi statiche?
Spesso quando aggiungo nuove 'parti' a un sistema, lo faccio creando una nuova classe e creando un'istanza di oggetti da essa.
Ma recentemente, quando mi sono fermato e ci ho pensato, mi sono reso conto che una classe statica avrebbe fatto lo stesso di un oggetto, in molti dei luoghi in cui normalmente utilizzo un oggetto.
Ad esempio, sto lavorando per aggiungere un meccanismo di salvataggio / caricamento file alla mia app.
Con un oggetto, la linea chiamante di codice sarà simile a questa: Thing thing = fileLoader.load(file);
Con una classe statica, sarebbe simile a questa: Thing thing = FileLoader.load(file);
Qual è la differenza?
Molto spesso non riesco a pensare a una ragione per istanziare un oggetto quando una classe statica semplice e normale agirebbe allo stesso modo. Ma nei sistemi OO, le classi statiche sono piuttosto rare. Quindi mi manca qualcosa.
Ci sono ulteriori vantaggi per gli oggetti diversi dai due che ho elencato? Per favore, spiega.
EDIT: per chiarire. Trovo gli oggetti molto utili quando si scambiano funzionalità o si passano dati in giro. Ad esempio, ho scritto un'app che compone le melodie. MelodyGenerator
ha avuto diverse sottoclassi che creano melodie in modo diverso e oggetti di queste classi erano intercambiabili (modello di strategia).
Anche le melodie erano oggetti, dal momento che è utile passarli in giro. Così erano gli accordi e le scale.
Ma per quanto riguarda le parti "statiche" del sistema - che non verranno trasmesse? Ad esempio, un meccanismo "salva file". Perché dovrei implementarlo in un oggetto e non in una classe statica?