Ciao e benvenuto a questo video. Oggi parleremo di incapsulamento e di information hiding. Sono in realtà due argomenti molto correlati e stanno alla base della definizione delle classi, cosa che abbiamo già affrontato nei video passati, qua sopra trovi il link alla playlist.
Cosa è l'incapsulamento? In questo caso purtroppo l'informatica ci dà un ennesimo esempio di definire un concetto da 5 centesimi con una... confezione da 50 dollari come si dice.
Cioè l'idea è questa, l'idea è quella per cui noi abbiamo allora il nostro oggetto, detto così, che appartiene a una classe e all'interno avrà delle variabili, dei dati. Non so se penso alla classe punto, questi potrebbero essere x, y e z. L'incapsulamento dice tu metti i dati all'interno E anche i metodi, abbiamo visto proprio nello scorso esempio, nell'ultimo video che ho caricato, dove ho fatto vedere come fare una semplice classe in Java, come in realtà il metodo non è nient'altro che una sorta di funzione, immaginiamola così, in realtà non è proprio così, però è una funzione che opera su quei dati specifici e abbiamo visto la parola chiave this che ci diceva questo è l'oggetto su cui sto lavorando, this.
allora ok e l'incapsulamento è solo questo praticamente vuol dire che io decido quali sono gli attributi e i metodi quindi diciamo se un oggetto una classe definita avrò diciamo un oggetto 1 un oggetto 2 un oggetto 3 sono le variabili di stanza queste e avrò un metodo 1 e un metodo 2, che sono i metodi che agiscono su questi dati. Va bene. L'idea adesso è questa, ma io ho definito questi elementi.
L'incapsulamento, un'altra cosa che fa, e questo è sostanzialmente l'information hiding, decide quali sono accessibili dall'esterno. Se ho qua un mio client, Un client in questo caso è qualsiasi altro oggetto che utilizza quello che noi stiamo modellizzando. Io potrei dire, no guarda che in realtà non va bene che tu possa accedere direttamente, cioè io non voglio un accesso diretto dal client a uno, questo non lo voglio. Cosa posso fare però?
Posso prevedere quindi un accesso ad O1 mediato tramite un metodo che sarà ad esempio un getter che mi consentirà, che considera il client di recuperare il valore. Quindi questo metodo M1 sarà lui che poi internamente andrà a cedere al contenuto di O1, farà se deve dei controlli, delle operazioni aggiuntive e poi lo ritornerà. al client che lo ha richiesto. Perché io voglio impedire un accesso diretto?
Voglio impedire un accesso diretto perché nascondere l'informazione è meglio decidere nella classe quali sono le modalità di accesso all'informazione è un'operazione fondamentale. La cosa importante in questo caso è proprio che io dovrò definire quella che è la mia interfaccia pubblica. Cosa è l'interfaccia pubblica?
L'interfaccia pubblica è esattamente quello che il client vedrà del mio oggetto. Cioè l'idea è che io posso avere un oggetto veramente grandissimo, complicatissimo. con all'interno un sacco di variabili di distanza, facciamola in verde va, e un sacco di metodi, li mettiamo in azzurro quelli, ok, io definirò l'interfaccia pubblica ad esempio con l'evidenziatore adesso dicendo che questo fa parte...
aspetta non si vede niente, e adesso mi fa ok. Me lo fa mettere in bianco tipo... Scusate, vediamo se si vede così. Faccio finta di niente.
Lo ritagliamo con un bellissimo... Ah, col bianco, guardate qua, è il nostro bianco. Ok, lo facciamo più piccolo e adesso possiamo mostrarlo.
Allora, ad esempio io dico che questa parte, queste e queste due varabili distanza e anche questa potrebbero far parte... dell'interfaccia pubblica è abbastanza raro che questo sia succeda però potrebbe essere e poi questi due metodi ad esempio questo vuol dire che dall'esterno il mio oggetto quindi un'istanza della classe che sto definendo verrà visto come formato solo da questi elementi questi elementi formano quello che si chiama appunto l'interfaccia pubblica pubblica nel senso che può essere che è accessibile dall'esterno e tutti gli altri metodi e le altre variabili di distanza dovranno essere marcate come private. Quindi ci sono un po'di parole chiave che i linguaggi ci mettono a disposizione per poter fare questa modellizzazione ad oggetti. Quindi avremo public, ogni cosa, questo più o meno in tutti i linguaggi di programmazione oggetti, ogni cosa, variabili di distanza, un metodo dichiarato public e un metodo accessibile dall'esterno.
Quindi il client, chi lo utilizza, chi utilizza il nostro oggetto, può andare a richiamarlo. Perfetto. E se andiamo a ragionare invece su questi altri elementi che sono privati, ci sarà una parola chiave private che ci racconta il fatto che quell'elemento non è accessibile dall'esterno. Semplicemente. Allora, nelle definizioni canoniche si fa riferimento al fatto che quello che non cambia va nell'interfaccia pubblica e quello che cambia va nell'interfaccia privata.
Io ragionerei un po'in modo diverso, magari, cioè quello che deve essere accessibile dall'esterno lo metto pubblico. Quello che invece serve per eseguire le operazioni, quindi per scrivere meglio il codice che viene eseguito nelle... nelle parti pubbliche lo metto privato in realtà c'è molto di più di questo nel senso che io potrei mettere privato anche ad esempio l'accesso a un sistema esterno immaginato sistema di pagamento online allora io al mio software che utilizza la mia classe di pagamento dirò semplicemente questo dirò caro software paga questa cifra questa persona perfetto il fatto che come verrà fatta questa operazione io non voglio saperlo immaginate, e questo è un po'quello che succede nel sistema operativo alla fine, quando tu stampi ok, un documento io stampo un documento, cosa succede? il documento, chiedo al sistema operativo stampa il documento, pigio sui tastini interfaccia pubblica e faccio stampa, basta, finito io non mi preoccupo di niente altro Chi si preoccuperà poi di trasformare questo mio documento in un insieme di comandi da mandare alla stampante? Sarà il sistema operativo.
Funziona un po'in questo modo l'idea dell'incapsulamento e dell'information hiding. Cioè io nascondo la complessità e faccio sì che dall'esterno non ci si renda conto di qual è il vero meccanismo che viene utilizzato per fare una cosa. Non ci si renda conto quando non deve essere scelto dal client. Ci sono casi in cui invece... Il caso del pagamento è uno di questi.
Ad esempio io posso decidere, dammi, cioè, fai il pagamento con questo tipo di pagamento. È chiaro che io scelgo il tipo di pagamento così come potrei scegliere la stampante, ma non so poi come viene effettuato dal basso livello questa operazione. Questo è compito della classe.
Avere una classe che espone il suo funzionamento interno che problemi comporta. Comporta dei grossi problemi, comporta il fatto che noi non possiamo evolverla. O meglio, se dovessimo evolvere una classe che espone tutto, qual è il grosso problema?
Il grosso problema è che dovremmo riscrivere tutto il codice che la riutilizza. Pessima idea. L'idea che noi, definendo un'interfaccia pubblica, andiamo a definire come la nostra classe verrà chiamata, a prescindere dal suo funzionamento interno poi.
che noi, e qua mi ricollego alla definizione che abbiamo detto all'inizio di incapsulamento, che noi poi potremmo decidere di cambiare. Questo fa riferimento in realtà a un altro principio che vedremo in un altro video sicuramente, che è il principio di open-closed. Cioè il nostro codice deve sempre essere aperto a evoluzioni. C'è un nuovo metodo di pagamento, c'è un nuovo modo di fare una certa operazione. Ok, benissimo.
Dobbiamo poterlo integrare nel nostro software senza modificare i client. Quello che noi non vogliamo fare è modificare i client. Quindi aperto al cambiamento, ma chiuso alle modifiche. Cioè vuol dire che la nostra interfaccia pubblica, pur cambiando l'implementazione, pur cambiando gli aspetti interni della nostra classe, non deve cambiare, deve restare il più possibile, diciamo, uniforme nel corso del tempo. Questo è un obiettivo che devi avere quando vai a disegnare degli elementi, utilizzando la programmazione oggetti.
Cioè io definisco l'interfaccia pubblica, E per quello che nell'ultimo video ho detto, beh, proviamo a definire questa classe, l'abbiamo fatta in Java, ma lo faremo anche in altri linguaggi. Definiamo una classe e scriviamo prima l'utilizzo che voglio fare della classe, perché in quel modo io sto definendo l'interfaccia pubblica. Tutto il resto, tutto quello che io aggiungo per implementare questa interfaccia pubblica va privato.
È un modo per aiutarti a entrare nell'analisi e nella programmazione ad oggetti. Ricorda sempre che non è solo la... la programmazione ad oggetti ma anche l'analisi di un problema ad oggetti che va fatta.
Se io non so fare l'analisi ad oggetti non saprò fare la programmazione ad oggetti. Dobbiamo una volta per tutte svincolarci dal fatto che programmare ad oggetti voglia dire conoscere il costrutto della classe, conoscere come si fa una classe. Sì certo quella è la base fondamentale e la differenza tra conoscere l'alfabeto e saper scrivere. La differenza nella programmazione tra conoscere la programmazione ad oggetti e saper per usare la programmazione oggetti per risolvere un problema, in tanti mi stanno scrivendo che hanno dei problemi in questo, lo capisco benissimo, è un po'lo scopo di questi video, cercare di aiutarvi. L'idea è che io devo imparare come utilizzare questi costrutti, altrimenti ho un sacco di nozioni che non servono a niente.
L'incapsulamento ti deve servire per poter provare a prendere una classe, pensare a un problema semplice e dire cosa fa parte dell'interfaccia pubblica. Prima cosa. Provo a fare del codice che descriva come utilizzerei la classe. Quella è l'interfaccia pubblica. Come posso, senza implementarlo ovviamente, abbiamo già visto nell'esempio che ho lasciato le classi, i metodi vuoti.
Cosa mi serve per implementare questi metodi? Definisco la parte privata. Quella è soggetta a cambiamenti ed evoluzioni. Questi sono concetti un po'di base su cui ritorneremo sicuramente.
Per me è importante che tu finisca questo video con l'idea di cos'è un... Un metodo pubblico, un metodo privato. Cos'è un'interfaccia pubblica di una classe? Questo è fondamentale, perché pubblico è tutto quello che fa parte dell'interfaccia pubblica, appunto privato tutto il resto.
I linguaggi di programmazione ci mettono a disposizione dei costrutti per descrivere questa cosa, ma noi lavoriamo a livello più alto. Descriviamo una classe di oggetti, ok? E descriviamo la loro interfaccia pubblica prima di tutto.
e poi la implementiamo definendo anche la parte privata, quindi la parte di implementazione. Stiamo nascondendo l'informazione perché tendenzialmente i metodi di distanza sono privati. Non dobbiamo per forza mettere tutti i metodi in accesso pubblico, non c'è un getter per ogni variabile di distanza, non avrebbe senso. Devo pensare su quali sono le variabili di distanza davvero accessibili dall'esterno. e quali sono i metodi che devono essere accessibili dal nostro client, inteso come qualcuno che ci accede.
Quindi queste sono un po'le idee fondamentali. Uno potrebbe dire, ah sì, c'è anche Protected, ok, ci arriveremo. In un altro video parleremo di Protected perché dobbiamo parlare di ereditarietà.
Questa serie di video vuole essere un cammino nell'analisi ad oggetti che ti porti alla fine a saper scrivere il codice. Quindi ti invito a provare a prendere un esempio, una classe semplice. e provare a implementarla, la classe che preferisci. Potrebbe essere, non so, un libro, una collezione di libri, magari anche una collezione di cose da fare, la famosa to-do list, che è diventata l'hello-word della programmazione ad oggetti.
E prova a implementarla nel linguaggio che preferisci. Non c'è la scelta di linguaggio, non c'è il linguaggio migliore di un altro per fare la programmazione ad oggetti. Tutti i linguaggi che ci consentono di programmare ad oggetti, Java, C Sharp, C++, TypeScript, JavaScript, quello che volete. meglio TypeScript di JavaScript, e poi capiremo anche il perché in un altro video, ci consentono di descrivere con i costrutti del linguaggio queste cose di cui abbiamo parlato oggi.
Prova prendendo un esempio a realizzarlo. Detto questo è tutto, ti ringrazio per l'attenzione e alla prossima. Ciao!