Newsgroup: it.comp.www.php
Titolo: OOP...ops!! :(

Ciao a tutti
Eh già....
Quando si parla di programmazione a oggetti, riesco sempre a sentirmi più
stupido della macchina che ho davanti :(
Per me è un problema capire cos'è un oggetto perché il computer lavora su
due numeri: 0 e 1 punto, non ci sono altre cose, il computer capisce solo
questo.
E allora, per favore, cos'è un oggetto?
Per favore non me lo spiegate facendo dei paragoni, perché non li capisco...
Forse sono OT, ma sto parlando della programmazione a oggetti implementata
da php. Dovete tenere presente che programmo in c e in assembly (o
assembler come volete chiamarlo), comprendetemi e perdonate le sciocche
domande che farò su questo argomento.
Roberto.
-- 
enter_region:
 tsl register,lock
 cmp register,#0
 jne enter_region
 ret
leave_region:
 move lock,#0
 ret

> E allora, per favore, cos'è un oggetto?
Vediamo se riesco a risponderti...
Un Oggetto è una Istanza di una Classe.
Una Classe è un prototipo (una sorta di progetto) che implementa Metodi 
(funzioni) e Proprietà (variabili). Per funzionare tale Classe deve 
essere istanziata cioè il prototipo deve essere "realizzato" e assegnato 
ad una variabile (fanno eccesione i metodi statici... ma di questo 
magari parliamo più avanti).
Sei ancora più confuso?

 Sei ancora più confuso?
Più o meno... :(
grazie per la risposta.
roberto.


 realizzazione della classe (istanza), o no?
In fin dei conti direi proprio di sì...
Nota: la mia è una semplificazione e non prende in considerazione cose 
come Prova::Metodo(), classi estese, metodi e varialibili protette ...
Altro?

 Altro?
Per la semplificazione no.... :)
Se dovessi trovare un argomento più avanzato mi ripresenterò... :)
grazie,


 realizzazione della classe (istanza), o no?
Se prendi l'esempio della macchina qualcosa capisci. In pratica, per
poter usare l'oggetto automobile devi realizzarlo "copiando" la sua
classe, e poi personalizzarlo (cambiargli colore, numero di sedili,
cilindrata) ma mantenendo i suoi metodi (accelerare, frenare, sterzare)
che si adatteranno (nel caso informatico) in modo automatico alle
caratteristiche che dai alla macchina.
Gli attributi puoi cambiarli durante l'uso (per esempio puoi colorarla
di verde o di blu, o elaborare il motore, o togliere i sedili posteriori
per caricare piu` roba), ma il principio (la classe) rimane la stessa.
Puoi cambiare le gomme ma non togliere le ruote, altrimenti non
funziona. Non puoi toglierle la possibilita` di accelerare e frenare,
ecc.)
Bene, quando crei una classe "informatica" devi definire cosa saranno le
porprieta` e i metodi non modificabili di un "oggetto". Quando li hai
pronti, puoi creare diversi oggetti di quella classe e personalizzarli.
Bye.

Quello che mi incasina, quando cercano di spiegarmi gli oggetti in questo
modo č:
Il computer come lo riconosce l'oggetto?
Che ne sa il computer che si trova di fronte all'oggetto?
Il computer capisce una serie di 0 e 1 (e a quanto pare piů di me
sull'argomento oggetti), č il concetto che mi sfugge... non lo comprendo...
tengo per buono l'esempio di prima, se no mi vado a impicciare su
ragionamenti che m'incasinano soltanto.
Grazie.
Roberto.


 sull'argomento oggetti), è il concetto che mi sfugge... non lo comprendo...
Se ragioni in questo modo, devi pensare anche a "come fa il computer a
capire che una serie di 0 e 1 e` un pdf? O una png?". E come fa capire
che la pallina del mouse che rotola significa che la freccina si deve
muovere?
Sono tutta una serie di livelli di astrazione successivi che non
dovrebbero interessarti fino a quando non decidi di creare un linguaggio
o un compilatore per un linguaggio OO.
Parlando a livello di "hardware" il computer non sa niente di oggetti.
Sa che alla tot locazione di memoria c'e` un pezzo di codice. Quando tu
istanzi una classe, creando un oggetto, riserva un'area di memoria per
gli attributi dell'oggetto, ma quando richiami un metodo dell'oggetto
lui salta all'indirizzo del metodo dentro la classe, usando come
"namespace" la locazione dell'oggetto.
Se hai mai programmato in C, potresti vedere la classe come una struct,
con tutti i campi definiti dentro, e i metodi sono sempre membri della
struct, definiti al suo interno come puntatori a funzioni gia` definite.
Quando dici
struct macchina {
 char colore[20],
 void *accelera(int)
};
Definisci l'oggetto.
Con
void * mia_accelera(int i)
{
  fa qualcosa con i;
}
definisci il metodo. Poi con
struct macchina fiatpunto;
crei l'oggetto dalla classe. Poi fai
fiatpunto.accelera = mia_accelera;
Questo, nella programmazione a oggetti, e` automatico e definito in fase
di definizione della classe. Poi, per richiamare il metodo:
fiatpunto.accelera(10);
(Nota che ho sempre avverso i puntatori del C, quindi potrebbe andarci
qualche -> al posto di .)
Tra l'altro mi pare che questa sia l'idea da cui e` nata la gestione
degli oggetti del C++ rispetto al C, ma il C++ l'ho usato molto meno del
C e non ne so quasi niente... :)
Bye.

 Bye.
Ok, grazie, questa volta sei stato veramente di grandissimo aiuto.


> Come faccio a riempire il metodo? :)
Un metodo è in tutto e per tutto una funzione e la sintassi è 
esattamente la stessa (purchè all'interno della definizione della classe).

Franco Ponticelli wrote:

grazie.
Roberto.


 Per favore non me lo spiegate facendo dei paragoni, perché non li
capisco...
Un oggetto? E' un insieme di bit ovviamente.
E non è un paragone.

>
Ci vuole un po' di intelligenza, se non hai compreso il paragone fatto 
nessun problema, proviamo con un altro esempio:
Immagina di essere in una stanza in cui.  Dentro questa stanza trovi delle 
"cose" ad esempio: sedie, quadri, orologio, armadio, libri, scatole, 
bottiglie, scarpe etc.
Tutte queste cose come le chiami? semplicemente oggetti :)
Ciascun oggetto che vedi in questa stanza è caratterizzato da alcune 
proprietà, ad esempio, l'armadio è caratterizzato da alcune dimensioni 
(larghezza e altezza) da un colore, da una proprietà del materiale che lo 
compone e cosi.
Alcune di queste proprietà sono comuni a tutti o in buona parte di oggetti, 
altre invece esclusive di uno specifico oggetto.
In particolare poi con questi oggetti è possibile compiere delle operazioni 
ad esempio, dentro una scatola è possibile inserire delle bottiglie o un 
altra tipologia di oggetti  che la scatola può contenere e cosi via.
E' possibile definire delle operazioni aritmetiche che rispecchiano la 
realtà, ad esempio, se abbiamo due scatole, la cui capienza massima è 12 
bottiglie, e nella prima scatola abbiamo 6 bottiglie e nella seconda scatola 
abbiamo 5 bottiglie, la somma di questi due oggetti produrrà una terza 
scatola avente 11 bottiglie.
Se è chiaro fino a qui allora possiamo provare a trasportare questo concetto 
nell'ambito di un sistema informatico.
In pratica, un oggetto non è altro che: una struttura dati caratterizzata da 
proprietà e da operazioni".
Sono strutture dati elementari, ad esempio le variabili, gli array, etc, 
sono strutture dati più complesse i record di un file, etc.
Una variabile per esempio, può essere rappresentata come una scatola dove, 
le proprietà della variabile sono le proprietà della scatola e dove il tipo 
della variabile denota il tipo di oggetto che quella scatola è finalizzata a 
contenere.
I record di un file (o di un database) è una struttura dati, un oggetto 
caratterizzato da campi che definiscono delle proprietà e da operazioni che 
definiscono come è possibile interagire con queste proprietà.
Se ti è adesso chiaro il concetto di struttura dati, e ti è chiaro il 
concetto di algoritmo (insieme di operazioni ordinate in modo logico) 
arriverai alla definizione di programma quale entità in cui tali operazioni 
interagiscono con le strutture dati consentendo di arrivare a risolvere un 
problema.
Cooper.
-- 
BlueWare Web Agency
   [http:] 
www.blueware.it
   [msn:] 
coo...@blueware.it
   [icq:] 146781935 

Stefano wrote:

Grazie :)


 
roberto.



D'accordo, ma tieni conto che ti ho risposto in un newsgroup, in un 
newsgroup non ci sei solo te, ma ci sono anche altre persone.
Ho risposto in modo completo, anche per coloro che, nell'avere il tuo stesso 
dubbio, non siano ugualmente esperti come nel tuo caso.
Avrei potuto evitare di esporre la cosa in termini "didattici" se mi 
anticipavi che eri già nel settore e nel caso in cui ti avessi risposto per 
email privata.
Quindi prendi atto che non hai considerato questo aspetto. Il newsgroup non 
è un botta-risposta a due, in conseguenza di ciò il tuo "richiamo" è privo 
di ogni fondamento logico.


 
Roberto.



Non so cosa ci sia da vedere vista l'evidenza della natura del newsgroup, ma 
cmq starò ad aspettare non ho fretta.


Mi dispiace che continui a credermi così stupido, io invece ho una grande
stima per te.
Questo è l'ultimo messaggio di questo tread perché non ti risponderò più.



Io non capisco ancora perchè sei cosi prevenuto, non ho mai pensato quello 
che sostieni che possa pensare.
Cmq non sei obbligato a credermi, ti sto solo dicendo che non penso 
minimamente quello che credi, poi fai te.
Cooper.
PS: Non è necessario che mi rispondi nuovamente, quanto dovevo dirti ti ho 
detto.


 da php. Dovete tenere presente che programmo in c e in assembly (o
<cut>
e vorresti dirmi che in c non hai mai usato gli oggetti?
siam messi maluccio ...
cmq vedo che ti han illustrato un pò.
-- 
[ Running Linux Suse 9.1 Professional ]
 ~ 
http://www.lasteden.it
 ~ ICQ: 61670579
 ~ Coltiva Linux che tanto Windows si pianta da solo

 E allora, per favore, cos'è un oggetto?
[cut]
Ho letto brevemente le risposte che ti sono state date, ma visto che
la programmazione ad oggetti e' il mio settore di studi principale,
ci provo anch'io a darti una risposta (anche perche' come te vengo da
una tradizione di programmazione a basso livello)
Farei pero' una distinzione:
"Cos'e' un oggetto?" = Come viene rappresentato a basso livello?
"Cos'e' un oggetto?" = Cosa s'intende concettualmente per oggetto?
Nel primo caso, in generale possiamo dire che una *classe* e' la
definizione di tutti gli "oggetti" che verranno da essa creati o
meglio "istanziati". Se programmi in c, puoi vedere:
- una classe come un dato strutturato (struct)
- gli attributi e i metodi della classe come campi della struttura.
Solo che gli attributi sono a loro volta dei dati (int, float, altre
strutture, ecc..) e i metodi sono dei puntatori a funzione.
La creazione di un oggetto, anche detta istanziazione dell'oggetto,
viene fatta attraverso l'operatore *new* applicato al nome di una
classe (nel nostro caso Foo). In php risulta una cosa del tipo:
<code type="php">
$obj =  new Foo();
</code>
Che tradotto in c risulta una cosa del tipo (prendila con le pinze
perche' non e' una traduzione letterale, ci sono delle differenze e
anche grosse)
<code type="c">
struct Foo* obj = malloc(sizeof(struct Foo));
</code>
Quindi l'*oggetto* e' la rappresentazione in memoria della struttura,
l'istanziazione e' l'allocazione e l'inizializzazione di quella
memoria. 
Gli attributi sono i dati contenuti nell'oggetto
<code type="php">
$obj->a;
</code>
equivale a
<code type="c">
obj->a;
</code>
I metodi sono puntatori a funzioni
<code type="php">
$obj->hello();
</code>
equivale a
<code type="c">
(*(obj->hello))();
</code>
Riferimenti piu' precisi li puoi trovare sicuramente nel codice stesso
del php, capire come e' stata implementata l'OOP in php sicuramente
ti aiutera'. In generale ti consiglio questo
http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
Spiega come implementare i costrutti dell'OOP in c, scommetto che ti
piacera :-)
Nel secondo caso invece, ovvero la nozione concettuale di oggetto,
riguarda il come rappresentare il problema in termini di oggetti. Gli
esempi che ti hanno fatto chiariscono il concetto, se vuoi
approfondire comprati un buon libro che parli di programmazione ad
oggetti :-)
Ciao a tutti e buone feste
-- 
{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}
SunGray aka Gabriele Lana
contact me @ 
gabrie...@fastwebnet.it
See you space cowboy ...

 "Cos'e' un oggetto?" = Cosa s'intende concettualmente per oggetto?
Mi sono espresso male io, infatti... le domande che volevo fare erano
esattamente queste.

Grazie, sei stato gentilissimo.


 
Roberto.
