Rieccoci con un nuovo capitolo del nostro corso di programmazione generale. L’ultima volta avevamo parlato degli oggetti spiegando che gli oggetti sono un astrazione del mondo. Per ogni sostantivo che potete immaginare potete costruire l’oggetto corrispondente.
Oggi vedremo che gli oggetti si dividono in due macro categorie: le entità e i valori.
Le entità corrispondono agli oggetti che rappresentano qualcosa di reale, di concreto. Ad esempio sono entità gli oggetti che rappresentano persone, case, luoghi di lavoro, file musicali, cd, videocassette, automobili e tutto il resto.
I valori corrispondono invece agli oggetti che rappresenta qualcosa di immateriale, che ha significato, appunto, solo per il suo valore. Sono valori gli oggetti che rappresentano numeri, punti nel piano, numeri cartesiani, segmenti, date, colori, note musicali e altro ancora.
Vi chiederete il perché di questa differenza. E’ molto semplice: quando programmerete un oggetto dovrete fare molta attenzione a quale tipo di oggetto state programmando perché a seconda dei casi dovrete fare implementazioni notevolmente differenti.
La più importante di queste differenze è l’uguaglianza. Tutti i linguaggi a oggetti includono di default un metodo che controlla se due oggetti sono uguali. Questo metodo va molto spesso ridefinito per evitare comportamenti anomali. Ma cosa significa che due oggetti sono uguali? La risposta cambia a seconda se si tratti di un oggetto che rappresenta valori o entità.
Se un oggetto rappresenta un valore è uguale ad un altro oggetto della stessa classe se e solo se sono uguali gli attributi dei due oggetti.
Ad esempio consideriamo due oggetti della classe Colore. Questa classe è definita come Colore(Rosso,Verde,Blu) dove Rosso, Verde e Blu sono tutti numeri interi compresi fra 0 e 255. Intuitivamente ci rendiamo conto che due colori sono uguali se hanno entrambi la stessa quantità di Rosso, di Verde e di Blu.
Se un oggetto, invece, rappresenta un entità è uguale ad un altro oggetto della stessa classe se e solo se i due oggetti sono, in realtà, lo stesso oggetto.
Per capire meglio questo concetto consideriamo la classe Persona definita come Persona(Nome, Cognome). Ovviamente non possiamo considerare che due persone sono uguali se hanno lo stesso nome e lo stesso cognome. Possiamo dire che sono onomine me certo non possiamo affermare che siano la stessa persona. Quindi gli oggetti che rappresentano entità sono, in linea di massima, uguali solo a se stessi.
Ovviamente potete obbiettare che una classe Persona(DNA) in cui DNA è la codifica del DNA della persona rientri nello stesso caso di un oggetto di valori. Però converrete con me che una classe siffatta sia un tantino inconsueta. Inoltre una classe così fatta è proprio una classe che rappresenta valori (sorpesi eh? dopotutto se si considera una persona solo per il DNA è normale che la persona diventi soltanto un “valore”).
Questo perché la condizione di uguaglianza è una condizione necessaria e sufficiente per catalogare una classe.
Un altra differenza importante consiste nella modificabilità.
Una classe che rappresenta entità è mutabile. Ovvero uno o più paramentri possono (non “devono”) cambiare durante l’uso dell’applicazione.
Un oggetto della classe Persona(Nome, Cognome, Indirizzo) può cambiare Indirizzo nell’arco della sua esistenza rimanendo la stessa persona. Quando ci trasferiamo e cambiamo indirizzo non ci “trasformiamo” mica in una nuova persona, i nostri familiari non ci trattano come estranei e la rappresentazione informatica deve tenerne conto. Inoltre una persona può cambiare anche Nome ma non per questo è una persona diversa.
Una classe che rappresenta valori invece non è mutabile. Ovvero tutti i suoi attributi, scelti al momento della creazione, rimangono uguali a se stessi per tutta la vita dell’oggetto.
Un oggetto della classe NumeroComplesso(R, I) , ad esempio (3, 4) corrispondente a 3+i4, rimane sempre lo stesso. Supponiamo che cambi la parte reale da 3 a 8, non avrei lo stesso numero ma, semplicemente, avrei un altro numero.
Questo influisce molto sulle azioni invocate su di un oggetto.
Le azioni invocate su un oggetto-entità restituiscono lo stesso oggetto modificato (side-effect).
Le azioni invocate su un oggetto-valore restituisce un nuovo oggetto con il risultato dell’operazione invocata.
Quindi se fate un metodo che somma due numeri questo metodo non deve modificare uno dei due numeri ma deve creare un nuovo oggetto contenente il risultato.
Sulle questo aspetto torneremo successivamente quando parleremo del side-effect.
RICAPITOLANDO:
- Se un oggetto rappresenta entità allora è uguale solo a se stesso ed è mutabile.
- Se un oggetto rappresenta valori allora è uguale ad un altro oggetto se sono uguali fra loro gli attributi ed è immutabile.
Questo concetto ci servirà inoltre nella prossima puntata quando parleremo di ereditarietà. Quindi spero vi sia ben chiaro.
Per oggi è tutto. Al prossimo capitolo. 🙂 Mi raccomando segnalatemi con i commenti i punti poco chiari e le eventuali domande.