Basi di OOP e sue implementazioni in AmigaE (Parte 2)
La OOP ha delle caratteristiche esaltanti e riesce a mettere nelle mani del programmatore una serie di strumenti per lo sviluppo rapidissimo di applicazioni complesse. Tutto questo ha pero' un prezzo: bisogna pianificare accuratamente le caratteristiche e i comportamenti dell'oggetto PRIMA di iniziare a scrivere del codice. Questo accorgimento, che di per se' potrebbe sembrare banale, riesce invece ad assicurare un notevole risparmio di tempo nella stesura definitiva e permettera' poi di ereditare l'oggetto proficuamente.
Per prima cosa, inizializziamo descriviamo la struttura dell'oggetto persona, in Amiga E scriveremo:
OBJECT person name:PTR TO CHAR surname:PTR TO CHAR phone:PTR TO CHAR ENDOBJECT
come vedete abbiamo definito un OBJECT standard di E, che normalmente si utilizza per la creazione delle strutture. Come abbiamo detto in precedenza, un oggetto non e' altro che un inseme di dati organizzati in una struttura e delle funzioni particolari apposite per la loro manipolazione, non c'e' da stupirsi, quindi, che un oggetto in Amiga E inizi proprio con la definizione della struttura OBJECT, cosi' come siamo sempre stati abituati a fare.
Tra le funzioni piu' importanti legate ad un oggetto, troviamo il "costruttore", che serve ad inizializzare un oggetto durante la sua creazione, e il "distruttore", che invece si occupa di liberare tutte le risorse eventualmente allocate dall'oggetto. Solitamente, al "costruttore" si assegna lo stesso nome dato all'oggetto che deve costruire, quindi nel nostro caso si chiamera' "person()". Il "distruttore", invece, deve avere il nome fisso "end()" e non dovrebbe MAI essere chiamato, in quanto e' Amiga E stesso che si occupa di invocarlo quando decideremo di "uccidere" un oggetto. Ricordatevi di chiudere tutti gli oggetti creati durante il programma, prima di uscire definitivamente, altrimenti potreste lasciare della memoria allocata.
Creiamo adesso il costruttore e il distruttore del nostro oggetto person. Il costruttore si occupera' di allocare una stringa di 25 caratteri per ogni campo. Normalmente, non bisognerebbe dare dei limiti "rigidi" ai nostri oggetti, ma per ora ci limiteremo a descrivere il costruttore e lo faremo anche in modo non del tutto "corretto", in seguito miglioreremo anche questo fattore. Per creare una funzione legata ad un oggetto, in E, basta scrivere PROC nomeproc() OF nomeogg e cosi' noi faremo adesso per il costruttore (notate che si chiamera' esattamente come l'oggetto).
PROC person() OF person self.name:=String(25) self.surname:=String(25) self.phone:=String(25) ENDPROC
come potete notare, le variabili "interne" ad un oggetto vengono referenziate con il suffisso "self.".
Adesso possiamo creare il distruttore, che si dovra' chiamare per forza end() e che si occupera' di liberare tutte le risorse prima che l'oggetto venga ucciso:
PROC end() OF person DisposeLink(self.name) DisposeLink(self.surname) DisposeLink(self.phone) ENDPROC
Ora che il nostro oggetto e' in grado di inizializzarsi e di distruggersi, possiamo iniziare a scrivere le routines necessarie a gestire i dati interni. Cominciamo con la creazione di due metodi: set() e get() che, rispettivamente, si occupano di settare e leggere una determinata inforazione all'interno. All'inizio del nostro codice scriviamo la seguente linea per creare delle costanti numeriche:
ENUM MODE_NAME=1, MODE_SURNAME, MODE_PHONE
e poi scriviamo, il seguente metodo set():
PROC set(s:PTR TO CHAR, mode=MODE_NAME) OF person SELECT mode CASE MODE_NAME StrCopy(self.name, s) CASE MODE_SURNAME StrCopy(self.surname, s) CASE MODE_PHONE StrCopy(self.phone, s) ENDSELECT ENDPROC
e di seguito il metodo get():
PROC get(mode=MODE_NAME) OF person DEF s:PTR TO CHAR SELECT mode CASE MODE_NAME s:=self.name CASE MODE_SURNAME s:=self.surname CASE MODE_PHONE s:=self.phone ENDSELECT ENDPROC s
Con questa ultima procedura, possiamo gia' testare il nostro oggetto e vederne il funzionamento, per farlo, sara' necessario una procedura main() e una istanza dell'oggetto person. Il codice che segue, crea un oggetto person, tramite set() inserisce dei dati e li rilegge con get(). Per quanto riguarda la descrizione approfondita del sorgente e dei comandi NEW e END, la eseguiremo nel prossimo articolo.
PROC main() DEF p:PTR TO person NEW p.person() -> Notate l'utilizzo del costruttore assieme a NEW p.set("Fabio") -> Settiamo il nome della persona p.set("Rotondo", MODE_SURNAME) -> Settiamo il cognome della persona p.set("(ITA)-(0)321 - 459676", MODE_PHONE) -> Settiamo il numero di telefono. WriteF("Name:\s\nSurname:\s\nPhone:\s\n", p.get(), p.get(MODE_SURNAME), p.get(MODE_PHONE)) END p -> Uccidendo l'oggetto, automaticamente liberiamo anche la memoria allocata da questo. CleanUp(0) -> Questo comando e' necessario per ripulire tutto, lo dice Wouter ;) ENDPROC -> Fine del programma.
continua nel prossimo numero...
Scritto da: Fabio Rotondo e-mail: fsoft@intercom.it C.so Vercelli 9 28100 Novara ITALY tel: (ITA) - (0)321 459676