asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 3870
ASPCode.it - Store

  > > Articoli

La potenza degli operatori binari

Data di pubblicazione: 21/07/2003        Voto della community: 4,33 (Votanti: 12)


Gli operatori (AND OR XOR e i loro corispondenti & | ^) nascono per confrontare due espressioni, ma, sfruttando la loro applicazione su variabili di tipo numerico, possiamo migliorare gestione e scalabilitá della nostra base dati e rendere piú leggibile il codice.

Teoria

Il principio di funzionamento si basa sul fatto che gli operatori logici, su variabili di tipo numerico, eseguono il confronto dei due operandi su singolo bit occupante la medesima posizione (confronto bit a bit). Detto cosí puó sembrare molto complesso, ma un piccolo esempio puó essere chiarificatore:
prendiamo la rappresentazione binaria del numero 17: 1 0 0 0 1
e quella del numero 16: 1 0 0 0 0
se si esegue il confronto bit a bit il risultato é true come mostrato in figura 1 (presentano 1 nella medesima posizione).


Figura 1.

In Visual Basic e in ASP la sintassi utilizzata per l'operatore booleano é AND (in javascript e nelle stored procedure di SqlServer é &).
Nel nostro esempio precedente, in ASP, avremmo scritto:
(17 AND 16) = true
(17 AND 8) = false

N.B.: le parentesi sono necessarie altrimenti il test viene eseguito sull'uguaglianza.

Pratica

Utilizzando le potenze di 2, é quindi possibile gestire piú casistiche con un solo parametro di passaggio ed una serie di if indipendenti.
Poniamo il caso di dover gestire un sondaggio sui gusti degli utenti.
Nel nostro database avremo una tabella gusti come mostrato in figura 2.


Figura 2.

Senza l'utilizzo degli operatori binari, saremmo costretti ad inserire nella nostra tabella preferenze_utente un campo booleano per ogni gusto, con la conseguenza di dover aggiungere un campo al database ogni qualvolta vogliamo inserire un nuovo gusto (figura 3).


Figura 3.

Con l'utlizzo degli operatori binari ci basterá un solo campo numerico contenente la somma algebrica dei gusti scelti (figura 4).


Figura 4.

Nella tabella di figura 4 l'idUtente 1 ha come gusti: Telefonia (1) + Computer (2) + Multimedia (4) = 7, l'idUtente 2 ha come gusti: sport (32) + viaggi (64) = 96.

Se vogliamo interrogare il database sui gusti di un determinato utente scriveremo:

<%
'codiceGusti di un determinato utente é stato ricavato da una variabile di sessione o dalla lettura di un cookie
dim strsql, rs
set rs = Server.CreateObject("ADODB.Recordset")
strsql = "SELECT codice, descrizione FROM tabGusti"
rs.open strsql, conn, adReadOnly, adLockOptimistic
response.write "i tuoi gusti sono:<hr>"
do while not rs.EOF
  if (codiceGusti AND rs("codice")) > 0 then
    response.write rs("descrizione") & "<br>"
  end if
  rs.moveNext
loop
rs.close
set rs = nothing
%>

Conclusioni

Ad un primo impatto, questo modo di gestire i dati, puó sembrare ostico, ma se ci soffermiamo a riflettere su quante applicazioni utilizzano giá gli operatori binari, ci rendiamo immediatamente conto di quali siano le potenzialitá applicative di questo sistema.
Ne é un esempio la gestione degli attributi, sia dell'oggetto field del recordset (chiave primaria, campo annullabile, ecc.), che degli oggetti del FileSystemObject.
Se si osservano i valori assunti dalla proprietá attributes del FileSystemObject, si noterá che sono potenze in base 2.

Costante Valore Descrizione
Normal 0 File normale. Non viene impostato alcun attributo.
ReadOnly 1 File di sola lettura. L'attributo é di lettura/scrittura.
Hidden 2 File nascosto. L'attributo é di lettura/scrittura.
System 4 File di sistema. L'attributo é di lettura/scrittura.
Volume 8 Etichetta del volume dell'unitá disco. L'attributo é di sola lettura.
Directory 16 Cartella o directory. L'attributo é di sola lettura.
Archive 32 Il file é stato modificato dall'ultimo backup. L'attributo é di lettura/scrittura.
Alias 64 Collegamento. L'attributo é di sola lettura.
Compressed 128 File compresso. L'attributo é di sola lettura.

Per testare se un file é contemporaneamente nascosto e di sistema, si puó quindi fare:

<%
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(filespec)
If f.attributes and (2+4) Then
  response.write "Il file é nascosto e di sistema"
End If
%>

Considerazioni finali

Gli operatori binari possono avere svariate applicazioni nella gestione dei dati. Vale la pena di capire quando e come strutturare i dati con questa logica affinché si possa ricorrere ad un sistema semplice ed efficiente di gestione.




Utenti connessi: 3870