[OOP]Dubbi. postato il 15/11/2008 14:08:00 nel forum programmazione, gdrcd e open source
Salve a tutti. Oggi ho deciso, avendo un po di tempo, di approfondire la mia davvero scarsa conoscenza sulla OOP di php e sulla OOP in generale. Le mie conoscenze si basano su due ore di lezione con un professore che non sapeva affatto spiegare (basti pensare che io avevo che la OOP fosse un metodo di chiamate asincrone al server -.-).
Mi rimangono dunque parecchi dubbi sulla OOP.
Il primo riguarda la OOP del php. Allora a quanto ne so per "utilizzare" la OOP bisogna creare una classe contenente delle funzioni in una pagina esterna che poi andiamo ad includere nel file:
Pagine → 1
15/11/2008 15:23:02
Beh, allora, parliamone un po in generale, perche' il brutto della programmazione odierna e' che si usano ed abusano gli oggetti ma si e' perso un po il senso, a mio avviso, di cosa si sta usando :)
Allora, intanto cos'e' un oggetto?
E' una specie di "super variabile" composta, che contiene in se un certo numero di variabili, detti attributi, ed un certo numero di funzioni interne, dette metodi.
L'idea che stava alla base della programmazione a oggetti era quello di creare degli aggregati che potessero essere usati come degli strumenti a se stanti all'interno di un programma.
Ad esempio, se io volessi fare dei conti potrei voler utilizzare una calcolatrice, e mi aspetto che questa sia uno strumento che io "accetto" a scatola chiusa, qualcuno mi garantisce che funziona, non mi interessa come, e so come si fa a scriverci i numeri, a scegliere le operazioni perche' mi offre un "interfaccia" a me nota, che e' il tastierino. Quindi, quando vado a fare i miei conti so di poter prendere una calcolatrice, posarmela sulla scrivania, ed usarla in base alla sua interfaccia.
Gli oggetti fanno piu' o meno la stessa cosa. Il contenuto di un oggetto non e' necessariamente noto, e' nota la sua interfaccia, ovvero un certo numero di metodi (spesso non tutti) che puoi usare, di cui qualcuno ti ha detto cosa fanno e ti ha garantito che funzionano, e tu li "chiami" nel tuo programma per utilizzarli a scatola chiusa.
Se ti dovessi fare una calcolatrice (per semplicita' ipotiziamo che faccia solo un operazione alla volta) in procedurale dovresti:
dichiarare 4 variabili (e se e' un linguaggio serio occorre dichiararle davvero, con tanto di tipo di dato) operando A, operando B, soluzione, operatore.
Poi sviluppare una funzioncina che richiede a video l'inserimento degli operatori e dell'operazione.
Poi, per ciascuna delle operazioni che e' in grado di svolgere la calcolatrice sviluppare una funzione del tipo:
tiposoluzione operatore( tipooperandoA A, tipooperandob B){...}
E poi una funzioncina che ti stampa i risultati.
Ogni volta che in un programma volessi usare questa funzione dovresti trasformare questo blocco di roba in una libreria e includerla nel corpo del programma.
A oggetti quello che fai e' dichiararti una roba del genere:
classe (di oggetti) calcolatrice {
Attributi privati:
A, B, stampa, risultato
Metodi:
costruttuttore() {A=B=0}
stampa(risultato)
---- Interfaccia ----
assegnaA (valore)
assegnaB (valore)
operazione1()
...
operazioneN()
---- Fine Interfaccia ---
}
Quindi, se nel tuo programma volessi usare la calcolatrice dovresti includerla come tipo di dato, dopo di che istanziarla, ovvero crearti una variabile che abbia per tipo la classe di oggetto, allocarla in memoria e inizializzarla, che si fa piu' o meno cosi':
calcolatrice Mia_Calcolatrice = new (calcolatrice);
Ovvero "dichiato un oggetto di tipo calcolatrice, lo chiamo Mia_Calcolatrice, e richiedo che sia riservato uno spazio apposta nella memoria.
a quel punto fare un operazione si basa sull'utilizzare i metodi dell'oggetto
tipo
A=leggitastiera();
B=leggitastiera();
Mia_Calcolatrice.assegnaA(A);
Mia_Calcolatrice.assegnaB(B);
stampa Mia_Calcolatrice.somma();
Una delle cose belle del farlo a oggetti e' che, per esempio, puoi passare il tuo oggetto ad un tuo amico che ha lo stesso problema, senza dirgli minimamente come l'oggetto funzioni dentro, ma dicendogli semplicemente
"allora, con assegnaA(), assegnaB() gli dai i valori, poi se vuoi fare la somma fai somma()...."
Ovvero semplicemente dicendogli quali sono i metodi dell'interfaccia e come si usano.
L'esempio ovviamente e' tirato via, poi il codice e' molto piu' elegante e si possono fare soluzioni molto migliori, pero' nota che ho messo solo variabili (attributi) privati, quando potrei metterli anche pubblici o protetti, e ci sono due metodi che non fanno parte dell'interfaccia.
Questo perche'?
Perche' le variabili dentro l'oggetto e' meglio se gli utenti non le toccano. L'utente non e' tenuto a sapere bene come funziona l'oggetto dentro quindi e' il caso che non ne cambi a mano lo stato, ovvero non possa assegnare a mano valori alle variabili con sistemi tipo Mia_Calcolatrice.a=3, cosa che se l'attributo fosse pubblico si potrebbe fare. Se una variabile dev'essere assegnabile dall'utente allora occorre fare un metodo che assegna il valore alla variabile (assegnaA()) cosi' puoi controllare cosa entra e cosa esce dall'oggetto.
Alcuni metodi servono all'interno dell'oggetto, ma non e' il caso che ci si possa accedere dall'esterno. Tipo, stampa(risultato) puo' essrre benissimo richiamato all'interno del metodo somma(), ed e' bene che l'utente non richiami a mano questo metodo, perche', ad esempio, il risultato di un operazione non dovrebbe essere stampato prima di farla.
Un metodo particolare e' il costruttore. Il costruttore quello che fa e' assegnare un valore "sicuro" a tutte le variabili. A chi ha imparato a spippolare dal PHP questa non sembrera' una gran cosa, perche' il PHP quando usi una variabile (che neppure hai bisogno di dichiarare) te la inizializza lui a NIL (nessun valore, spazio, zero), ma nei linguaggi piu' seri la variabile pippo se non la inizializzi te prima di stamparla e la stampi probabilmente contiene:
25,96438954e10^(-12)
Qundi se ti aspettavi di stampare 0 forse era il caso che la inizializzassi. Gli oggetti non si possono permettere di questi lussi, perche' DEVONO funzionare sempre, quindi occorre progettare bene questo metodo particolare, che si richiama da solo quando fai:
oggetto pippo=new(oggetto);
Assegnando valori di base agli attributi.
Fatta questa lunga premessa, ti dico:
ogni volta che vedi this dentro un oggetto, quello e' un puntatore a "se stesso". Ovvero un riferimento all'indirizzo di memoria dove e' finito il tuo oggetto quando lo hai istanziato.
se tu ti trovi nel tuo programma, e l'oggetto si chiama pippo, il metodo Metodo1() di pippo si richiama:
pippo.Metodo1()
Ma quando stai scrivendo la tua classe, e non sai che un giorno l'oggetto verra' istanziato con il nome di pippo, come lo richiamo il metodo? Cosi':
me-stesso.Metodo1()
ovvero
(indirizzo-dove-mi-trovo).Metodo1()
ovvero
this->Metodo1()
Dove -> e' un operatore del linguaggio di programmazione che si traduce piu' o meno come:
"vammi a ravanare quel che c'e' all'indirizzo this".
Il vantaggio di lavorare a oggetti, invece, checche' ne dicano non esiste. Gli oggetti son belli, gli oggetti son ordinati, gli oggetti sono solidi, ma fanno le stesse cose che faresti in programmazione procedurale, solo piu' colplicatamente e con piu' codice.
Gli unici vantaggi sono l'ereditarieta' ed il polimorfismo (non che non ci sia verso di farli anche proceduralmente) ma per ora mi fa fatica spiegarli, magari alla propssima puntata :D
15/11/2008 21:53:11
16/11/2008 00:28:11
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Aggiungi ai Preferiti Inoltra Discussione Forum Programmazione, GDRCD e Open Source Elenco Forum
Il gestore di Age of Crystals ha risposto alla recensione di moak