lunedì 12 maggio - 04:16
Google
 
Menù
  Home
  Come nasce IRC-Zone
  Glossario Informatico
  Servizio FreeBot
  News
  I nostri progetti
  I nostri servizi
  Partners
  Diventa un Partner

IRC
  Cos'è IRC
  Storia di IRC
  Netiquette su IRC
  Emoticons
  Gergo della chat
  Lista Servers
  RFC 1459
  Shell Hosting

mIRC
  Cos'è il mIRC
  FAQ mIRC
  Configurazione mIRC
  Download mIRC
  Novità
  Script Stranieri
  Script Italiani
  MTS
  MTS Engine

mIRC Addon
  mIRC addon Audio
  mIRC addon SMS
  mIRC addon Grafica
  mIRC addon Utility
  mIRC addon Uso Bot

Client IRC
  Client IRC Linux
  Client IRC Mac
  Client IRC Win

XChat
  Cos'è XChat
  XChat per Win
  XChat per Unix

KVirc
  Cos'è KVirc
  FAQ KVirc
  Installazione su Linux
  KVirc Scripting
  KVirc per Mac
  KVirc per Win
  KVirc per Unix
  KVirc addon

Eggdrop/Windrop
  Cos'è un Eggdrop
  Download Eggdrop
  Configurazione Eggdrop
  Download Windrop
  Installazione Windrop

Tcl
  Download TCL
  Tutorial TCL scripting
  Documenti/Guide

BNC
  Cos'è un psyBNC
  Download psyBNC
  Configurazione psyBNC
  Download sBNC
  Configurazione sBNC

Linkaci!

Credits


Statistiche
Ip: 38.103.63.16
Downloads: 246933 files
Totale: 287836 MB




Art of Scripting Vol. 2 - Oggetti, classi, array e dizionari

Autore: GrifisxData: 2005-11-17
Modificato: 2005-12-17 Letture: 336
Torna indietroStampa articoloInvia ad un amico

Start:

In questo tutorial ci occuperemo dei concetti di oggetto, classe
degli array, dei dizionari e della scrittura e lettura dei file,
anche questa volta daremo molto spazio a piccoli script, perché il
modo migliore per imparare è buttare giù codice.
Per prima cosa introdurremo il concetto di oggetto, cosa importante
da conoscere se si vuol scrivere codice più complesso.
Per capire cosa sia un oggetto, senza perderci in giri di parole,
vediamo il seguente codice:

%myobject = $new(object,0,oggetto);
if(%myobject)echo "Oggetto creato correttamente!";
else echo "Creazione dell'oggetto fallita!";

Mettetelo nello "script tester" (quello con l'icona della bomba a
mano nera) ed eseguitelo per vederne il risultato.
Adesso cominciamo subito l'esame di quello che abbiamo scritto:
%myobject = $new(object,0,nome_oggetto);
Per creare un oggetto bisogna usare la funzione $new() la quale
richiede 3 parametri:
- La classe dell'oggetto (dopo vedremo cosa si intente per classe)
- L'ID dell'oggetto padre, (che può essere 0 per gli oggetti toplevel
(cioè a dire oggetti che non hanno padre, questi concetti
verranno spiegati in seguito).
- Il nome dell'oggetto (può anche essere vuoto).
Gli oggetti possono essere trattare come pseudo-strutture (tipo le
strutture del c per intendersi), non preoccupatevi se non avete la
più pallida idea di cosa sia una struttura con il codice si chiarirà
tutto; mettiamo il caso che vogliamo creare un oggetto utente, che
abbia all'interno di se vari campi contenenti Nick, Username, etc.
etc.:

# Creiamo l'oggetto utente
%Utente = $new(object,0,descrizione_utente)
# Settiamo i campi
%Utente->%nickname = Grifisx
%Utente->%username = mDm-Team
%Utente->%hostname = non.disturbatemi.net
%Utente->%info = Grifisx ha preso questo es dal manuale del KVIrc
%Utente->%info << Tnx 2 Pragma

Mettiamo il codice nello script-tester ed eseguiamo, dopodiché
posizioniamoci sulla riga di input, di qualsiasi finestra, e
digitiamo:
/echo %Utente->%nickname
come vedrete ci ha dato l'echo del campo nickname, ovviamente farebbe
lo stesso con tutti gli altri campi, mentre se facciamo un echo
dell'oggetto in se tipo:
/echo %Utente
darebbe come output l'id dell'oggetto (nel mio caso 1710.1128236637).
Come potete vedere è molto comodo usare gli oggetti, soprattutto se
si devono creare script molto complessi.
Adesso passiamo ad esaminare le classi.
Una classe, come anche si legge sul manuale ufficiale, è una
collezione di metodi che definiscono le caratteristiche di un
oggetto, però così detto non è molto chiaro, quindi chiamiamo in
aiuto il codice:

class (calc,object)
{
constructor()
{
echo Usage\:
echo Per calcolare la somma di 2 numeri:
echo \/\%Calc\-\>\$somma2\(\x\,\y\)
echo Per calcolare il quoziente di 2 numeri:
echo \/\%Calc\-\>\$div\(\x\,\y\)
}
somma2()
{
# $0 e $1 sono i valori che noi passeremo alla funzione richiamandola
# ad esempio in "\%Calc->$somma2(8,6)" $0=8 e %1=6
echo $($0+$1)
}
div()
{
echo $($0/$1)
}
}
%Calc=$new(calc)

L'esecuzione di questo script avrà l'effetto di darvi la possibilità
di sommare o dividere 2 numeri tra di loro utilizzando le funzioni
che voi avrete creato $somma2() e $div().
Provate ad esempio a fare dalla riga di input
/%Calc->$div(10,5)
Come si può vedere per prima cosa è stata creata una classe calc che
è di tipo object (potrebbe anche essere di tipo widget, ad esempio,
per gli oggetti grafici, ma questo lo vedremo più avanti) e ,
all'interno della classe, sono state create 3 funzioni (o metodi come
preferite) $constructor(), $somma2() e $div(); dopo questo creiamo l'
oggetto con il codice "%Calc=$new(calc)" e a questo punto possiamo
usare le funzioni che ho realizzato all'interno della classe, come
vedete basta richiamarle tramite il simbolo "->".
Ricordiamo tra l'altro che la funzione $()
esegue il calcolo dell'espressione contenuta all'interno delle
parentesi.
Inoltre si noti che il codice dentro $constructor() viene eseguito
alla creazione della classe in modo automatico, questo è il posto
migliore dove, ad esempio, inizializzare variabili.
Altro esempio:

class(rubrica,object)
{
addName()
{
$$->%name=$0-
}
addSurname()
{
$$->%surname=$0-
}
addTel()
{
$$->%tel=$0-
}
}
%Rubrica=$new(rubrica)

Per prima cosa spieghiamo cosa sono quel $$-> e il $0-:
il $0- è il parametro che la funzione riceve (come gli alias
ricordate? Funziona allo stesso modo, cioè quando chiameremo la
funzione $addName() dovremo passargli il nome da aggiungere).
$$, invece, sta per "Variabile appartenente a questa classe", cioè se
dobbiamo creare una variabile di classe (visibile solo all'interno
della classe ed ad essa appartenente), dobbiamo crearla con $$->
oppure con $this->, allo stesso modo, se dovessimo chiamare una
funzione della stessa classe all'interno di un'altra funzione
dovremmo chiamarla con $$->$funzione().
Prima di passare a fare del codice più complesso dobbiamo chiarire
alcuni piccoli concetti, per l'esattezza quello di array e quello di
dizionario sono concetti importanti, perché ci permettono di creare
delle "collezioni" di valori, di stringhe o di oggetti, insomma di
dati.
Un array è una collezione di dati variabili indicizzati per numero,
il primo indice dell'array è 0 mentre l'ultimo è uguale alla
grandezza dell'array meno uno (poiché si parte da zero).
Per ottenere il numero di elementi che è contenuto in un array
possiamo usare l'espressione %ArrayEsempio[]#.
Non è necessario dichiarare la grandezza dell'array come in altri
linguaggi di programmazione, a mano a mano che si aggiungerà un
numero, la grandezza del nostro array varierà automaticamente e se il
primo elemento che assegneremo, lo assegneremo ad un indice maggiore
di 0, tutte le posizioni precedenti saranno vuote.
Proviamo ad esempio:

%Array[0]=Grifisx
%Array[1]=Noldor
%Array[2]=Pragma
#Stampo il contenuto di tutto l'array
echo %Array[]
#Stampo la grandezza dell'array
echo %Array[]#
#Stampo solo il primo elemento
echo %Array[0]

oppure proviamo questo codice:

%Array[0]=Grifisx
%Array[1]=Non mostrare questo
%Array[2]=Noldor
%Array[5]=Segreto shhhh..
%Array[8]=Pragma
for(%i=0;%i < %Array[]#;%i+=2)echo Entry %i: \"%Array[%i]\";

Come vedete è abbastanza semplice crearsi delle collezioni
indicizzate per numero, cosi come lo è anche muoversi all'interno di
esse, qui si è voluto usare un ciclo for ma ovviamente avremmo anche
potuto usare un foreach(%item,%Array[])echo %item =D, oppure un ciclo
while.
Un array potremmo anche inizializzarlo in questo modo
%Array[]=$array(Grifisx,Noldor,Pragma,Madero);
cioè utilizzando la funzione $array([el1],[el2],[el3],[el4],..).
Adesso è il momento di esaminare il fratello maggiore dell'array: il
dizionario.
I dizionari non sono altro che array associativi di stringhe, per
capire bene, riprendo l'esempio del manuale ufficiale:

%Songs{Jimi Hendrix} = Voodo child
%Songs{Shawn Lane} = Gray piano's flying
%Songs{Mina} = Brava
%Songs{Greg Howe} = "Full Throttle"
# Mostra tutto in una stringa
echo %Songs{}
# Mostra tutti gli elementi del dizionario
foreach(%var,%Songs{})echo %var

Ovviamente anche qui, come negli array %Songs{}# restituirà il numero
degli elementi del dizionario.
Mentre %Songs{}@ restituirà una lista degli elementi separata da
virgole.
Ovviamente potremmo unire dizionari e array insieme, per avere un
dizionario di array ad esempio.
Insomma possiamo gestirci le nostre collezioni come più ci piace.
Capisco che sono concetti un po' complicati ma vedrete che alla fine
diventerà "naturale" usarli.
Adesso è necessario fare cenno su come si possa salvare e leggere da
un file di testo, poiché se abbiamo delle collezioni, e vogliamo
conservarcele, la prima cosa da fare e metterle su file.
Vediamo:
$file.read("file_da_leggere")
file.write("file_da_scrivere")

la prima funzione ci permette di leggere da un file di testo mentre
il secondo (è un comando non una funzione, lo vedere dal fatto che
non inizia per $) ci permette di scriverci dentro
Quindi mettiamo il caso che avessimo un file di testo (tipo
"userdatabase") con dentro una lista di nomi separati da virgole
(tipo "Grifisx,Noldor,Pragma,Madero") e che volessimo mettere questi
nick in un array, come dovremmo fare? Niente di più semplice:
%users[] = $split(",",$file.read($file.localdir(usersdatabase)))
la funzione $split (tra non molto verrà cambiata in $str.split()
quindi occhio, se vi da errore) serve per dividere una stringa in
base ad un separatore che gli diamo (in questo caso la virgola ",");
mentre la funzione $file.localdir() restituisce la directory delle
configurazioni locali del KVIrc (provate subito uno "/echo
$file.localdir()"):
quindi, in questo modo, avremo creato l'array %users[], che al suo
interno ha i nick che abbiamo letto dal file.
Se volessimo scrivere sul file avremmo invece:
file.write $file.localdir(usersdatabase) %users[]
Vediamo di testare il tutto nello script tester:

%Users[]=$array(Grifisx,Noldor,Pragma,Madero);
file.write $file.localdir(usersdatabase) %Users[];
%UsersNew[] = $split(",",$file.read($file.localdir(usersdatabase)));
%idx=0;
while(%idx!=%UsersNew[]#)
{
echo Utente: %UsersNew[%idx];
%idx++;
}
file.remove $file.localdir(usersdatabase)

Come avrete potuto notare, eseguendo lo script, il file è stato
creato, letto e successivamente rimosso con il comando file.remove
(per vedere gli altri comandi disponibili per la gestione dei file,
controllate nel manuale alla voce Comandi e poi lettera f).

Adesso, con le nuove nozioni che abbiamo imparato, andiamo a fare
qualche cosa di più complesso ed allo stesso tempo più concreto: un
piccolo gestore di appunti =)

class(appunti,object)
{
constructor()
{
# Nel costruttore faccio apparire a video le istruzioni d'uso,
# ricordando che il costruttore è la prima cosa che viene eseguita
# appena la classe viene creata
echo $k(5,8) \-\-\-Appunti\-\-\-\
echo $k(5,8) Comandi manuali:
echo $k(5,8) \/\%Appunti\-\>\$viewApp $b
Visualizza gli appunti presenti
echo $k(5,8) \/\%Appunti\-\>\$addApp\(appunto\)$b
Aggiunge un nuovo appunto
echo $k(5,8) \/\%Appunti\-\>\$delApp\(appunto\)$b
Cancella un appunto
}
# Funzione per aggiungere un appunto
addApp()
{
# Creo un array e lo riempio con il contenuto del file
$$->%appuntos[] =
$split(",",$file.read($file.localdir(kvircAppuntidb)))
$$->%ap = 0
# Ora creerò un dizionario, perché è più semplice lavorare con
# stringhe e sono più facilmente individuabili, ma allo stesso tempo
# perché cosi avremo una applicazione pratica dell'uso dei dizionari,
# e dopo lo riempio con il contenuto dell'array, questo mi permetterà
# di avere una cosa del tipo:
# %Array{ciao}=ciao , in modo che, quando vorrò poi cancellarlo, non
# dovrò preoccuparmi del suo indice numerico dato che il mio indice è
# uguale all'elemento, in pratica lo rintraccerò sempre.
while($$->%ap < $$->%appuntos[]#)
{
$$->%ElencoAppunti{$$->%appuntos[$$->%ap]} = $$-
>%appuntos[$$->%ap]
$$->%ap++;
}
$$->%ProvaAP = $0-
$$->%ElencoAppunti{$$->%ProvaAP} = $$->%ProvaAP
# Visualizziamolo a schermo tutti gli appunti
foreach($$->%var,$$->%ElencoAppunti{}) echo $k(5,8)$$-
>%var
# Conserviamo sul file
file.write $file.localdir(kvircAppuntidb) $$-
>%ElencoAppunti{}
echo $k(5,8) Fine Lista : $$->%ElencoAppunti{}# \)
Appunti presenti
}
# Funzione per cancellare un appunto
dellApp()
{
# Come la funzione precedente
$$->%appuntos[] =
$split(",",$file.read($file.localdir(kvircAppuntidb)))
$$->%ap = 0
while($$->%ap < $$->%appuntos[]#)
{
$$->%ElencoAppunti{$$->%appuntos[$$->%ap]} = $$-
>%appuntos[$$->%ap]
$$->%ap++;
}
$$->%ProvaAP = $0
# Ecco che posso cancellarlo facilmente senza preoccuparmi dell'indice
# dato che utilizzo il suo stesso nome come indice
$$->%ElencoAppunti{$$->%ProvaAP} = ""
# svuotato =D
foreach($$->%var,$$->%ElencoAppunti{}) echo $k(5,8)$$-
>%var
file.write $file.localdir(kvircAppuntidb) $$-
>%ElencoAppunti{}
echo $k(5,8) Fine Lista : $$->%ElencoAppunti{}# \)
Appunti presenti
}
# Funzione per visualizzare gli appunti
viewApp()
{
# Tutto come sopra
$$->%appuntos[] =
$split(",",$file.read($file.localdir(kvircAppuntidb)))
$$->%ap = 0
while($$->%ap < $$->%appuntos[]#)
{
$$->%ElencoAppunti{$$->%appuntos[$$->%ap]} = $$-
>%appuntos[$$->%ap]
$$->%ap++;
}
foreach($$->%var,$$->%ElencoAppunti{})echo $k(5,8) $$-
>%var
echo $k(5,8) Fine Lista : $$->%ElencoAppunti{}# \)
Appunti presenti
}
}
# Creo il mio oggetto %Appunti
%Appunti=$new(appunti)

Non credo che ci sia molto da spiegare, poiché alla fine, se avete
capito bene i concetti di array, dizionario e di lettura e scrittura
dei file (e ovviamente di classe), lo script si spiegherà da solo.
Si potrebbe fare senza ombra di dubbio uno script migliore ( o
utilizzare costrutti certamente più funzionali di quelli utilizzati),
ma ci si è limitati ad usare tutti (e solo) gli argomenti trattati,
cercando di riunirli in un unico script.
Lo farete sicuramente migliore quando avrete maturato tutti gli altri
concetti che il linguaggio del KVIrc nasconde =).
/ECHO STOP.




Links utili

Newsletter
Iscriviti
Cancellati

Ci sono 57 iscritti

In rilievo..
  JackSMS v3
  Venom Script Lite

Documenti/Guide
  Sicurezza in rete
  Cos'è SSL
  FAQ Bot
  Documenti su IRC
  FAQ Ident
  RFC 2810
  RFC 2811
  IRCx RFC

Informatica libera
  Gli Hoaxes
  Hoaxes report
  Documenti vari
  CensorWare
  Windows
  Linux

mIRC Scripting
  Codice ASCII
  Snippet mIRC scripting
  Tutorial mIRC scripting
  Dll per mIRC
  Utilities

IRCd
  Cos'è un IRCd
  Download Unreal
  Download Hybrid 6
  Download Hybrid 7
  Download Ultimate
  Download Bahamut
  Configurazione IRCd

IRC Services
  Cosa sono i Services
  Download Anope
  Download Epona
  Ircservices 5.0
  Ircservices 5.1
  Configurazione Epona
  Configurazione Anope
  Comandi ChanServ
  Comandi NickServ
  Comandi MemoServ

NeoStats
  Cosa sono i NeoStats
  Download NeoStats
  Configurazione NeoStats
  Download Moduli

IPv6
  Cos'è IPv6
  IPv6 su Win2000
  IPv6 su WinXP
  IPv6 su Linux
  IPv6 su mIRC e Xchat

Programmazione
  Tutorial C++
  Tutorial C
  Compilatori C/C++

Altro
  Contatti
  Banners Gallery

RSS Feed




Progetti
Starlight
Linux

Sponsor
Eushells.net
TradeShell.it
EasyShell.org



©2004+ IRC-Zone | Webmaster | Sitemap
Created by Cesare 'Kaesar83' Lasorella
Designed by Manuel 'erkokki' Cabras
IRC-Zone non è responsabile del contenuto dei siti linkati
Pagina creata in: 0.063 sec con 26 queries