I quattro pilastri della programmazione orientata agli oggetti
Il Settembre 27, 2021 da adminIn questo blog spiegherò i 4 pilastri della OOP e fornirò piccoli esempi. Esempi abbastanza piccoli che tu ed io possiamo comprendere facilmente.
L’astrazione è essenzialmente “need to know”. Nascondiamo i maggiori dettagli di implementazione, mantenendo l’uso ovvio in primo piano. Quindi ricordate questo “nascondere i dettagli, mostrare la rilevanza”.
Esempio di astrazione…
Questo è un modulo di iscrizione di un’applicazione su cui sto lavorando (la rilevanza).
Questa è la logica di implementazione dell’invio del modulo. (il bisogno di sapere).
Polimorfismo
Il polimorfismo è quando si usa un blocco di codice, si cambia la versione del codice usato in base agli input che gli vengono dati. Quindi, per renderlo un po’ più chiaro, classi diverse possono essere usate con la stessa interfaccia ma possono fornire la propria implementazione di quell’interfaccia.
Esempio di polimorfismo…
class Animal { speak = () => console.log('makes sound')}class Dog extends Animal { speak = () => console.log('woof')}class Cat extends Animal { speak = () => console.log('meowww')}class Cow extends Animal { speak = () => console.log('moooooo')}let dog1 = new Dog()let cat1 = new Cat()let cow1 = new Cow()dog1.speak() // => woofcat1.speak() // => meowwwcow1.speak() // => moooooo
Le classi gatto, cane e mucca stanno ereditando dalla classe Animal. Questo permette alle classi Cat, Dog e Cow di usare l’interfaccia di Animal. Però hanno solo il metodo speak a loro disposizione. Se dovessimo lasciare il metodo speak fuori dalla classe Cat, Dog, and Cow, e poi creare istanze di una classe Cat, Dog, and Cow saremmo ancora in grado di chiamare il metodo speak su quelle istanze. L’unico problema è che verrebbero stampati gli animali ‘makes sound’ invece dei suoni appropriati che un gatto, un cane e una mucca fanno (‘meow’, ‘woof’, ‘moo’).
E’ qui che entra in gioco l’override del metodo. Se ridefiniamo il metodo speak nelle classi Cat, Dog e Cow, possiamo personalizzarlo per stampare i suoni che fanno i gatti e i cani.
Incapsulamento
L’incapsulamento lega insieme i dati e le funzioni che manipolano i dati, e questo tiene entrambi al sicuro da interferenze esterne e usi impropri. Un buon esempio di incapsulamento è una classe. Possiamo effettivamente fare riferimento all’esempio precedente in cui si parla di cani, gatti e mucche con alcune leggere modifiche.
class Dog { constructor(name) { this.name = name } printName = () => console.log(this.name)}class Cat { constructor(name) { this.name = name } printName = () => console.log(this.name)}class Cow { constructor(name) { this.name = name } printName = () => console.log(this.name)}let dog1 = new Dog()dog1.name = "Max"dog1.printName() // => Maxlet cat1 = new Cat()cat1.name = "Mark"cat1.printName() // => Marklet cow1 = new Cow()cow1.name = "Tom"cow1.printName() // => Tom
Nota che quando creiamo istanze per ogni animale assegniamo anche un nome a ciascuno. Il risultato è che i ‘.name’ dopo ogni istanza creata (ad esempio dog1.name) sono tutti diversi. Questi ‘.name’ sono incapsulati nelle loro rispettive classi. Assegnare un nome a un’istanza non modifica il valore del nome di nessun’altra istanza.
Ereditarietà
L’ereditarietà è probabilmente la più facile da capire. L’ereditarietà è il concetto di una classe che usa (eredita) l’interfaccia di un’altra classe. Diventa quindi un figlio o una sottoclasse mentre la classe da cui eredita è il genitore o la superclasse. Abbiamo effettivamente fatto un po’ di eredità nel nostro secondo esempio sopra. Le classi Cat, Dog e Cow ereditano dalla classe Animal per avere accesso al metodo speak. Assicuratevi di aggiungere la parola chiave extends.
Lascia un commento