E per Esperti

Basi di OOP e sue implementazioni in AmigaE (Parte 2)


Uno dei principi piu' importanti della programmazione a oggetti e' di cercare di creare oggetti piccoli, compatti e specializzati. Ereditare un oggetto con queste caratteristiche sara' sempre facile e fruttuoso. Gli oggetti creati dovranno essere il piu' specializzati possibile: se create un oggetto "disco" che si occupa dell' input/output su di un disco, cercate di prevedere tutte le funzionalita' che un programmatore potrebbe richiedere e fate anche in modo che l'oggetto creato sia testato in tutte le condizioni, in modo da assicurare stabilita' anche se il programmatore che si accinge ad utilizzare il vostro oggetto commette degli errori.

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.


Un Primo Esempio

Iniziamo adesso a scrivere il nostro primo oggetto in Amiga E, per quello che riguarda la parte teorica della programmazione a oggetti, ci occuperemo dei vari aspetti man mano che li incontreremo. Il nostro primo oggetto sara' molto semplice e sicuramente non molto utile, ma servira' ad introdurci alla programmazione a oggetti. Ci occuperemo di scrivere un oggetto chiamato "person" che conterra' il nome, il cognome e il numero di telefono di una persona.

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...


Pagina Principale


    Scritto da: Fabio Rotondo      e-mail: fsoft@intercom.it
                C.so Vercelli 9
                28100 Novara
                ITALY               tel:    (ITA) - (0)321 459676