Newsgroup: it.comp.programmare
Titolo: [Neofita - oop] - la classe utente e il db

Salve a tutti,
spero di non fare una domanda banale ma è da poco che mi sn avvicinato 
alla programmazione ad oggetti e vorrei un vostro consiglio.
Se ho una classe utente con attributi:
nome, cognome e userid
è + corretto implementare un metodo per la lettura di ogni attributo
(es.
public function get_nome($userid){
     echo $nome;
}
....
ecc...
)
oppure è meglio scrivere un metodo che restituisce un array contenente 
tutti i valori di tutti gli attributi?
Volendo salvare e recuperare i dati da un db,
gli attributi della classe devono/possono/è_meglio_che corrispondano ai 
campi del db?
es.
se il mio db ha una tabella utenti con i campi:
nome
cognome
cod_fiscale
email
anche la mia classe deve prevedere tutti gli attributi 
nome,cognome,cod_fiscale,email ??
inoltre è preferibile far fare una select * from utenti
al costruttore, assegnare i risultati agli attributi e aggiornare il db 
ad ogni chiamata a metodi  set_ (per es. set_nome() che modificano gli 
attributi e aggiornano automaticamente il db)
e utilizzare nei get_ solo l'accesso agli attributi della classe
oppure conviene
far fare una select * from utenti
al costruttore, assegnare i risultati agli attributi e aggiornare SOLO 
gli attributi ad ogni chiamata a metodi  set_ (per es. set_nome() )
e far fare un update degli attributi sul db al distruttore?
Spero di essermi spiegato decentemente :-)
grazie a tutti
Ciaooo

 e far fare un update degli attributi sul db al distruttore?
Dipende. Come prestazione è sicuramente meglio utilizzare i campi degli 
oggetti finchè si può limitando l'accesso al db. In questo caso però 
subentrano altri tipi di problemi legati alla coerenza del db e degli 
attributi specialmente se più client possono accedere contemporaneamente 
al db.
In sintesi, sono scelte che devi prendere tu in base ai dettagli del 
progetto.
Saluti

e far fare un update degli attributi sul db al distruttore?
Assolutamente no. Vedi sopra: la classe rappresenta il modello. Ci
dovrà poi essere una classe controller che si preoccupa di istanziare
la classe modello ed ottenere quindi un oggetto da inizializzare con i
valori del dataset (la cui gestione è - auspicabilmente - delegata ad
un'altra classe più specifica ancora). Non aver paura di far
proliferare le classi (senza esagerare, ovviamente). L'importante è
suddividere bene le responsabilità tra le varie entità coinvolte nel
tuo sistema e disaccoppiare i compiti.

 tuo sistema e disaccoppiare i compiti.
Vi ringrazio per le esaurienti risposte.
Quindi, se ho ben capito, nel caso io debba gestire un'anagrafica (nome 
cognome.. ecc)
creo una classe di gestione del db (singleton??) che provvede a 
stabilire connessione, eseguire query, restituirmi risultati...
creo la classe utente con attributi (privati) nome, cognome, ecc...(in 
pratica "copiando" i campi del db)
creo tanti metodi get_ e put_ quanti sn gli attributi
e ad ogni metodo faccio chiamare i metodi della classe db, sia per i 
get_ che per i put_
ho capito bene?
Grazie ancora.
Saluti
MaoX

 ho capito bene?
Oh, yes!
E ricordati di chiudere tutto quello che apri, nel distruttore della
classe.
Inoltre quando vai ad aggiornare il db (put_) devi valutare, in base alle
tue necessita' se effettuare contestualmente una COMMIT, oppure se fare
una COMMIT unica all'uscita (eventualmente un ROLLBACK in caso di errori).
Magari puoi definire nella tua classe ad alto livello una proprieta'
booleana su cui basarti per fare COMMIT ogni volta o solo alla fine.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

ho capito bene?
No, niente affatto. La classe modello - come detto prima - NON deve
conoscere la classe che contiene i dati da db. Assegna alle singole
classi compiti MOLTO specifici e fa' in modo che non si conoscano tra
loro. L'unica che deve conoscere entrambe le classi è la classe
controller, che si occupa di travasare le informazioni dall'istanza
della classe che ha letto da DB (la classe Query di cui prima)
all'istanza modello (chiamato, mettiamo, "BusinessPartner").

Oh, yes!
Non propriamente. Innanzitutto lo standard č get/set e sarebbe bene,
per coerenza, seguirlo. Poi, non č sul set degli attributi
dell'istanza del modello che bisogna accedere al DB, affatto.
La gestione della transazione andrebbe assegnata all'oggetto
Connection di cui parlavo nel mio messaggio. A voler fare una cosa
(quasi) perfetta, si potrebbe studiare un modello bookcase analogo a
quello usato da Delphi con DataSnap e cioč avere una catena di classi:
DataSet <-> DataSetProvider <-> Query <-> Connection
Per il recupero dei dati, viene aperto il DataSet, che si rifa quindi
al DataSetProvider, il quale interfaccia l'istanza di Query
(contenente l'SQL), la quale a sua volta interpella Connection. 
A questo punto i dati sono presenti, in locale, sull'istanza di
DataSet e l'istanza di Query puň anche essere chiusa. L'utente puň
lavorarci sopra e poi, all'atto dell'applicazione delle modifiche
globali, attivare nuovamente il DataSetProvider, che tramite la Query
e quindi la Connection, scrive i dati su DB, tenendo aperta una
transazione nel tempo piů breve possibile.
Quest'ultimo aspetto č cruciale, nel disegno delle applicazioni
database. Il modello DataSnap di Delphi ha, inoltre, anche un sistema
sofisticato (ma neanche troppo) per gestire i conflitti tra utenti.

 
[CUT]
Ok...ehm...
intanto GRAZIE per le vostre risposte.
Purtoppo, però, non ho ben capito il da-farsi perchè sn un neofita e di 
oop ne capisco ancora poco... :-(
Qlcn potrebbe consigliarmi risorse on-line dalle quali apprendere 
informazioni su l'uso di classi/interfacce per la gestione dei db?
Ho provato a cercare in rete googolando un po' ma la quantità di siti è 
impressionante e finisco sempre col perdermi :-(
se qlcn di voi conoscesse risorse mirate gliene sarei grato.
Grazie ancora a tutti.
Saluti
MaoX
P.S. l'applicazione devo svilupparla in php5... ce ne dite?
Grazie ancora