25 messaggi dal 24 marzo 2003
Ciao a tutti,
sto studiando da qualche settimana il fantastico libro di Steve McConnell intitolato "Ingegneria del Codice". Nell'applicare le sue teorie al mio codice mi sono trovato di fronte ad un problema e cioè riguardante la buona progettazione di classi e routine(metodi).
Nel libro l'autore consiglia di frammentare e ridurre le routine hai minimi termini questo per diminuire la complessità del codice e quindi per una serie di vataggi. Applicando queste teorie al Web ho creato una classe che effettua l'autenticazione tramite una stored procedure del Db.
Prima avevo un metodo che effettuava una chiamata alla stored procedure che verificava l'esistenza di username e password nel db e tramite join sulla tabella "ruoli" restituiva il nome del ruolo come risultato del metodo. Ora questo metodo in realtà effettua due funzioni: la prima verifica la corrispondenza delle credenziali e la seconda trova il corrispondente ruolo. Stando alla teoria sopracitata dovrei fare due metodi: TrovaCorrispondenza(user, pass):bool e l'altro IdentificaRuolo(user, pass):string dove il secondo metodo include il primo. Il problema è che nel metodo consigliato io effettuo due chiamate al database mentre con il metodo vecchio ne effettuavo una sola.
Nel web questo non potrebbe essere uno spreco di risorse?
In un intranet dove l'accesso è limitato a un numero calcolato di utenti potrei non fare questa considerazione?
Modificato da lucas80 il 22 febbraio 2006 10.51 -
Modificato da lucas80 il 22 febbraio 2006 10.58 -
io a grandi linee faccio così, o ad esempio classe User.

metodo statico Validate(nome, pass).

il metodo restituisce un oggetto User con eventuali ruoli già assegnati.

quindi un ipotetico metodo GetRoles non fa altro che leggere le informazioni contenute nella classe.

successivamente decidi il meccanismo da te preferito per ricreare ad ogni richiesta il la classe User.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
25 messaggi dal 24 marzo 2003
Questo è il sistema che usavo anche io e sembra buono, comunque collaudato, ma i dubbi me li ha messi in testa la lettura di questo libro che suggerisce che ogni metodo deve fare una cosa mentre in questo caso ne fa già due. Una è quella di verificare l'esistenza dell'utente e l'altra e di verificarne il ruolo. Sembra una pippa mentale , in realtà fare un join sulla tabella utenti e quella ruoli è il massimo: riempio la classe utente e sono apposto.Ma metti caso che hai le informazioni di login su un database e i ruoli in un file xml. In questo caso dovresti cambiare il tuo metodo "validate" quindi rivedere tutto il codice del metodo e della query al db. Nell'altro caso hai un metodo che è validateUser che controlla l'esistenza nel db e un metodo getRuolo che controlla l'esistenza nell'xml. in uno pseudocodice tipo questo:

metodo ValidaUtente(username, password)
controllo che esista nel db
se esiste restituisco il suo id

metodo TrovaRuolo(username, password)
uso ValidateUtente(username, password)
faccio una query sul xml in base all'id che mi è stato restituito

in questo caso la mia prima funzione fa solo una cosa specifica e se un giorno devo cambiare qualche fonte non cambio la logica di un metodo o del database ma modifico solo un metodo. Questo è il vantaggio indiscusso a livello di manutenzione e di "Riduzione della complessità"
ma il problema è che nel caso specifico io cosi faccio due query al db quando potrei farne una.. Che pippa...
Modificato da lucas80 il 22 febbraio 2006 15.32 -
mi spiemgo meglio.
il metodo statico che ho chiamato ValidateUser come ho detto restituisce un oggeto User.

la Classe User espone una proprietà Roles, una ipotetica collezione di oggetti Role.

in genere nel get di tale proprietà inserico qualcosa del genere


public virtual RoleCollecion Roles
        {
            get
            {
                if (role== null)
                {
                    role = CreateRoleCollection();
                }
                return role;
            }
        }


il metodo CreateRoleCollection(); valorizza la collezione quando necessario

per variare l'oggetti User creati e di conseguenza i metodi che implementa in genere uso il provider e il plugin pattern.

in definitiva il metodo Validate fa una cosa sola restituire un oggetto User dai dati presenti nel db.

il Metodo Validate può chiamarne altri a sua volta a seconda dell'implementazione.

ammetto di essere stato un pò confuso nell'esposizione l'erchitettura non è proprio il mio settore, se hai altre domande comunque sono quà

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
25 messaggi dal 24 marzo 2003
Grazie Marco ho capito perfettamente ed è molto simile a ciò che faccio io di solito, ma questo libro mi ha scombussolato. Potremmo andare avanti fino all'infinito ad esempio il metodo ValidateUser che tu implementi fa due cose: verifica e nel caso restiuisce una select giusto?
Ecco secondo lui questo è sbagliato e credo di aver capito anche i motivi vantaggiosi di tale affermazione ma il problema è che diventa troppo meticolo fare un lavoro del genere..Comunque ti consiglio la lettura di questo libro. In pratica per uno smanettone quale sono io è stata una bella scoperta. Da quando seguo i consigli il codice è diventato molto limpido e semplice da gestire anche se ancora ho problemi di questo tipo(pippe come quella che ho postato).
:) l'ipotetico metodo ValidateUser restituisce un oggetto User se nel db esiste questo utente.

è poi la classe User a caricare i ruoli al momento giusto.

il discorso diventa complesso e non so se a parole riesco ad esprimerlo bene.

dalle risposte che mi hai dato ho capito che non ti ho fatto capire

in pratica seguo anchio i consigli che hai trovato nel libro.

sempre nel metodo ValidateUser faccio solo la Select in caso ci siano righe restituire posso istanziare il mio Oggetto User.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
575 messaggi dal 23 giugno 2003
www.padovaboy.it
Le regole di best pratiQue sono molto interessanti.
Ma io non le prenderei come oro colato.
Insomma non c'è nessun manuale finale che contiene tutte le regole, costrutti e comportamenti da assumere per programmare al meglio.
Ci sono delle regole di buon senso, di buona "calligrafia" se vogliamo ...ma non delle regole da seguire al 100%.
Ricordo il mio prof di c che spaccava la $%"%$" dicendo che una funzione non doveva avere più di 7 righe.
Che dovevi utilizzare al 50% i puntatori e che i cicli negativi sono più performanti.
Valanga di cavolate :P

Ps: visione mia della cosa.

www.padovaboy.it dal 2001 con furore :D
he he i prof sono una categoria a parte.

per anni sono stato terrorizzato dal GOTO del'assembler perche non doveva essere usato

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.