16.06.2013 Views

posta - Amiga Magazine Online

posta - Amiga Magazine Online

posta - Amiga Magazine Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

usare due trucchi: il primo è tenere la catena dei file ".pn,<br />

che contengono solo la definizione dei campi, nell'ordine<br />

giusto, da genitore a figlio, a figlio ecc.; il secondo è usare<br />

i cast, infatti anche una struttura così risponde a tale mecca-<br />

nismo, come se si fosse in presenza di due strutture nidifi-<br />

cate, proprio perché i campi sono posti nell'ordine richiesto<br />

dalle diverse strutture.<br />

L'ereditarietà dei metodi si realizza invece mediante le<br />

classi: diventa quindi decisiva la funzione che effettua<br />

fisicamente il dispatch dei messaggi:<br />

if( messaggio == OGGETTO->CLASSE-<br />

>VETTOREMETODI[indice].ID)<br />

ESEGUI VETTORE-METODI[indice].METODO( OGGETTO );<br />

else<br />

~ndlce++;<br />

e infine:<br />

if( VETTORE-FINITO-MESSAGGIO-NON-TROVATO )<br />

CERCA IN:<br />

OGGETTO->CLASSE->ANTENATO->VETTOREOGGETTO->CLASSE->ANTENATO->VETTOREMETODIMETODI;<br />

Come vedete, è in pseudocodice, cioè senza nomi e tipi, e<br />

potete certamente capire che il codice corrispondente è a<br />

dir poco "intricato". Si noti che, risalendo di classe, si deve<br />

passare alla funzione l'oggetto giusto, utilizzando il cast<br />

appropriato. Siamo, dunque, rimasti con un oggetto arric-<br />

chito da un sistema di classi, la cui catena, beninteso, viene<br />

indicata dal programinatore "a mano", ma che funziona<br />

egregiamente.<br />

Ci sono due grossi vantaggi in questo secondo metodo,<br />

almeno secondo il mio modo di scrivere il codice. I1 campo<br />

ogt-pData di un oggetto, cioè quello dei dati pubblici, è<br />

esplicito, cioè è indicato e spiegato nel file include dell'og-<br />

getto cui appartiene; la struttura che ospita i dati può e deve<br />

essere scritta in modo da contenere i possibili parametri e<br />

risultati, tanto le estensioni si possono sempre fare, purché<br />

in coda, ma ci si guadagna per il fatto di non dover più<br />

dichiarare parametri e risultati per ogni riga di metodo. E'<br />

vero che così le funzioni chiamanti vengono legate all'og-<br />

getto, ma in mancanza di una vera sintassi "oggettiva"<br />

ritengo che il gioco valga la candela. L'ideale sarebbe stata<br />

una sintassi del tipo:<br />

ed esisterebbe anche la possibilità di implementarla usan-<br />

do funzioni con un numero variabile di argomenti, presenti<br />

nel C ANSI e documentate nella nuova edizione del K&R (il<br />

libro: "The C programming language", di Kernighan &<br />

Ritchie). Ma, in definitiva, mi è sembrato più semplice e<br />

immediato usare una struttura dati pubblica, almeno per<br />

questo codice di base. Prima di vedere gli aspetti più pratici<br />

della codifica, concludo evidenziando il fatto che, comun-<br />

que si vogliano utilizzare le tecniche esposte, in modo<br />

originale o meno, i vantaggi si fanno sensibili, soprattutto<br />

su <strong>Amiga</strong>, il cui sistema operativo prevede sin dall'origine<br />

le librerie, delle quali gli oggetti possono usare lo schema.<br />

Un esempio di codifica pratica secondo<br />

entrarpbi i metodi<br />

I->roviamo finalmente a costruire un oggetto. Per iniziare<br />

lavoreremo su un vecchio conoscente, il BUFFER. Ho<br />

indicato con BUFFER un'area di memoria semplice, da cui<br />

è possibile derivare vettori, matrici, bitplane e così via;<br />

eccone le proprietà:<br />

typedef struct buffer-data<br />

i<br />

/* campi provenienti dal f ~le buffer.p */<br />

BYTE *bdb-pBuf; /* indirizzo */<br />

LONG bdb-Len; /* lunghezza */<br />

/* fine del file buffer.p */<br />

) BUFD;<br />

BUFFER è stato sviluppato secondo entrambe le tecniche,<br />

ma i punti in comune sono molti; è quindi il caso di<br />

descrivere il codice generale, evidenziando le differenze<br />

più avanti. In primo luogo va chiarito che BUFFER è un<br />

oggetto di livello molto basso, basti pensare che nella<br />

libreria dei compilatori Borland, quella dei linguaggi Turbo<br />

per MS-DOS, viene addirittura definito un oggetto TEdit,<br />

che è un vero e proprio editor. Creando un oggetto TEdit si<br />

ottiene, nel proprio programma, un editor WordStar-like. I1<br />

basso livello di BUFFER ha reso necessario fornire metodi<br />

anomali, come M-GIVEP-OR, metodo che chiede I'indiriz-<br />

zo, cioè il normale puntatore del buffer.<br />

Ma perché questo strano nome, M-GIVEP-OR? Esso segue<br />

la sintassi della prima tecnica per i messaggi. "M-" sta per<br />

metodo, così "F-" può essere preposto alle funzioni;<br />

"GIVEP" è il nome, che dice: "Dimmi il valore del puntatore<br />

(campo bdb-pBuf)"; "-ORn dice che quel messaggio indica<br />

un metodo i cui parametri devono essere l'oggetto e la<br />

struttura Result. Possiamo trovare ''_On, "-OP" e "-ORn.<br />

Questa convenzione fa parte di un piì~ vasto schema il cui<br />

scopo è quello di nominare variabili e funzioni secondo un<br />

metodo che aiuta a riconoscerne il significato. E' detta<br />

convenzione ungherese e il codice che la rispetta sembra a<br />

prima vista scritto in una lingua incomprensibile, ma basta<br />

farci l'abitudine. In America ci credono molto, se è vero che<br />

tutto il codice di Microsoft Word per Windows è stato scritto<br />

così! Comunque io ho voluto chiarirlo perché altrimenti i<br />

listati sembrano inutilmente confusi; nei file header ci sono<br />

i commenti necessari per venirne a capo.<br />

Chiudiamo questa lunga parentesi e torniamo ai metodi. Le<br />

tecniche di emulazione di oggetto descritte non vincolano<br />

il modo in cui gli oggetti sono creati e distrutti, ma solo la<br />

loro gestione. I1 caso più semplice è quello in cui si dichiara<br />

un oggetto come variabile, poi si im<strong>posta</strong>no campi, riferi-<br />

menti e valori di default con metodi opportuni.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!