Newsgroup: it.comp.lang.delphi
Titolo: Chiamata interna di proprietà

poniamo il caso di una classe con una property dichiarata in questo modo:
private
    fNumero: integer;
    procedure SetNumero(valore: integer);
public
    property Numero: integer read fNumero write SetNumero;
    ...
    procedure X;
e che dalla procedura X voglio leggere il valore di Numero. E' più corretto 
leggere Numero o direttamente fNumero? In pratica è indifferente, ma quale 
sarebbe meglio formalmente? Il collegamento che esiste tra la property 
Numero e la variabile fNumero è diretto, quindi è indifferente quale 
chiamare, o c'è sotto qualche passaggio in più che il processore deve 
eseguire?


Si tratta piu' che altro di una questione di stile. Io preferisco
accedere sempre alla proprieta', gli unici momenti in cui e' legittimo
accedere direttamente al campo e' nel costruttore/distruttore e nei
metodi get/set. Salvo rare eccezioni faccio sempre cosi' perche' mi
sembra piu' pulito: la classe deve essere disaccoppiata anche da
se' stessa e non deve sapere nemmeno lei cosa si nasconde dietro
una proprieta', a meno che non sia strettamente necessario.
Comunque so che ci sono altre scuole di pensiero! :)
ciao
Giacomo


Beh, se vai a spulciare il codice della VCL ti renderai conto che
dall'interno della classe si accede alle proprietà sempre tramite il loro
corrispondente valore privato FVariabile. Ovviamente questo oltre a essere
uno stile come diceva Giacomo, secondo me puo' essere considerato una
specie di convenzione, così come lo è il fatto di dichiarare un tipo con
la T iniziale o un puntatore con la P iniziale ecc., ciao.
--- posted by geoForum on 
http://www.delphiedintorni.it

 la T iniziale o un puntatore con la P iniziale ecc., ciao.
Più che di stile o convenzione, mi interessava sapere il funzionamento 
interno del compilatore. Per accedere a Numero o fNumero c'è bisogno dello 
stesso numero di clock, o no? 

 stesso numero di clock, o no? 
Nel tuo caso direi proprio di si. Se ci fosse una GetNumero immagino che 
  ci sarebbe l'overhead della chiamata a funzione.
ciao
Giacomo


E qui sono in difficoltà :-). Mi dispiace ma non so risponderti :-( ciao.


 stesso numero di clock, o no?
Onestamente, cosi a basso livello non so dirti nulla per la quantità
di cicli clock...
Quello che so è che dovendo ottimizzare le performances generali di
una applicazione non partirei dalla lettura di un valore di una
property....
Per il caso specifico, io userei il get e non l'accesso diretto al
membro private.
Fermo restando che quoto la tesi del disaccoppiamento, non sai se
quello che oggi è un semplice "get" di un valore un giorno potrebbe
diventare altro, tipo un calcolo piuttosto complesso, magari da
eseguire una sola volta per ottimizzare i tempi per poi magari
rieseguirlo in funzione di altri fattori...
In un contesto del genere, aver scritto FPippo al posto di Pippo in n
punti del codice comporterebbe un refactoring, cosa non necessaria se
si usa il getter della property.

 sarebbe meglio formalmente? 
A mio avviso, la questione è semplice: se il campo attualmente contiene 
il valore della proprietà, accedi direttamente a quello; in futuro, se 
la proprietà diviene più complessa e il suo valore viene determinato 
attraverso un metodo di Get(), ti basta modificare il codice della tua 
procedura X() affinché legga il valore tramite il metodo piuttosto che 
direttamente dal campo privato.
L'aspetto importante è, comunque tu intenda procedere, tutte queste 
modifiche non impattano sugli oggetti che leggono o scrivono il valore 
della proprietà o che richiamano la procedura; per il resto, penso tu 
possa decidere in piena libertà.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

"Nurax" <no.r...@no.spam.invalid> ha scritto nel messaggio 
news:ghmcov$har$1...@tdi.cu.mi.it...

Dal momento che nel tuo caso specifico FNumero e Numero dovrebbero puntare 
allo stesso indirizzo, presumo che per il compilatore non cambi nulla,
giorgio