Amiga Foundation Classes
Una libreria FreeWare e Public Domain di Classi di Oggetti per lo sviluppo di software su Amiga e macchine future Amiga Compatibili.
$VER: Amiga Foundation Classes - White Paper V1.15
1. Sommario:
2.0 - Introduzione
2.1 - Cosa sono le Amiga Foundation Classes
2.2 - Scopo della creazione delle Amiga Foundation Classes
2.3 - Chi potrà usare le Amiga Foundation Classes
2.4 - Futuro delle Amiga Foundation Classes
2.5 - Interfacciamento con i nuovi Amiga-Compatibili OS
3.0 - Specifiche di implementazione
3.1 - Come scrivere una Classe per Amiga Foundation Classes
3.1.1 - Nome della Classe
3.1.2 - Node dei Metodi
3.1.3 - Object Inheritance
3.1.4 - Object Initialization e Object Destruction
3.1.5 - Librerie e versione minima di OS
3.1.6 - Tags
3.2 - Definizione dei codici di errore
3.2.1 - Quando segnalare un codice d'errore
3.2.2 - Come segnalare i codici di errore
3.2.3 - Classificazione dei codici di errore
4.0 - Possibilità di "Porting" delle Classi.
4.1 - Specifiche di Porting.
4.2 - Limiti del Porting.
5.0 - Distribuzione
5.1 - Le Classi compilate
5.2 - Il sorgente delle Classi
5.3 - Disponibilità
5.4 - Informazioni e siti WEB
2.0 - INTRODUZIONE
2.1 - Cosa sono le Amiga Foundation Classes
Con "Amiga Foundation Classes" (per brevità
AFC) si intendono una libreria di Classi di Oggetti per la gestione dei più
svariati aspetti di Amiga.
Ogni Classe facente parte degli AFC si occuperà di "interfacciare"
il programmatore con uno specifico aspetto del Sistema Operativo di Amiga,
cercando di rendere più semplice la progettazione e la creazione di
applicazioni per i computer Amiga OS.
Le AFC sono state concepite anche per garantire un porting più rapido
delle applicazioni Amiga sui prossimi Sistemi Operativi Amiga-Compatibili.
Vedi il punto 2.4 per ulteriori spiegazioni.
2.2 - Scopo della creazione delle Amiga Foundation Classes
Le motivazioni che ci hanno spinto a progettare le AFC
sono svariate: prima di tutto, la necessità di sfruttare appieno la
programmazione orientata agli oggetti (OOP), che permette di "riciclare"
il codice già scritto e di inglobarlo all'interno di altre Classi
o, più genericamente, di utilizzarlo per più programmi.
Grazie alla ricompilazione delle AFC anche sulle prossime macchine con
un OS Amiga-Compatibile sarà, inoltre possibile eseguire rapidamente
il porting dei propri prodotti in modo rapidissimo. Vedi il punto 2.4 per
ulteriori informazioni.
2.3 - Chi potrà usare le Amiga Foundation Classes
Le AFC saranno disponibili per tutti i programmatori che utilizzino un linguaggio che supporti la OOP. Le AFC potranno essere utilizzate liberamente in programmi sia FreeWare, che ShareWare, PD o Commerciali, senza alcun pagamento di royalties o altro. Probabilmente, nella stesura definitiva del (C)Copyright delle AFC verrà richiesto al programma che utilizza le AFC di inserire un messaggio tipo "Questo programma utilizza le AFC", anche se questo punto non sia ancora stato definito.
2.4 - Futuro delle Amiga Foundation Classes
Le AFC sono anche state sviluppate per garantire una solida
base di Oggetti da utilizzare nelle prossime macchine Amiga-compatibili:
ricompilando il codice sorgente delle AFC, sarà infatti possibile
avere subito un'ottima libreria di Classi sulla quale costruire le applicazioni
per i prossimi computer. Il vantaggio derivante dall'utilizzo delle Classi
di oggetti, rispetto all'uso diretto delle chiamate al Sistema Operativo,
sta appunto nel fatto che le Classi fungono da "intefaccia" tra
l'OS e il programmatore: chi ha programmato su Amiga utilizzando le AFC,
potrà portare il codice dei propri programmi sulle nuove macchine
semplicemente ricompilando i sorgenti ed utilizzando la versione di AFC presenti
per la nuova piattaforma sulla quale sta sviluppando.
Grazie alle AFC, i programmatori non saranno più costretti a perdere
mesi di sviluppo per imparare a programmare un nuovo OS, ma continueranno
ad utilizzare le stesse Classi, con la stessa sintassi e, più in generale,
lo stesso comportamento.
Questo dovrebbe portare, almeno nelle nostre intenzioni, ad una netta diminuzione
dei tempi di sviluppo a favore di una maggiore e migliore produzione di software.
Il pericolo che incombe su ogni nuovo Sistema Operativo sta proprio nella
mancanza, già al momento del suo lancio, di software professionale.
Grazie alle AFC, sarà possibile fornire in brevissimo tempo programmi
professionali per questi nuovi OS.
2.5 - Interfacciamento con i nuovi Amiga-Compatibili
OS
E' nostra intenzione fornire gratuitamente i sorgenti
delle AFC agli sviluppatori di OS compatibili con quello attuale di Amiga.
Siano essi Phase5, VISCorp, Be Inc., AROS, p-OS, PIOS, ecc.
Siamo infatti convinti che il futuro di una nuova piattaforma, non legata
a Micros*ft, sia da ricercarsi nella possibilità di avere in breve
tempo del software professionale e stabile.
I sorgenti di AFC verranno quindi forniti gratuitamente a tutti gli sviluppatori
di OS che ne faranno richiesta. La loro implementazione, dovrà però
essere successivamente analizzata dai responsabili di AFC per garantire il
loro effettivo funzionamento e permetterne la distribuzione.
Per ulteriori informazioni, vedi paragrafo 5.0 e successivi.
3.0 - SPECIFICHE DI IMPLEMENTAZIONE
3.1 - Come scrivere una Classe per Amiga Foundation Classes
3.1.1 - Nome della Classe
· La Classe deve avere un nome univoco e chiaro.
· Il nome della classe deve essere tutto in minuscolo.
· Il nome della classe deve essere in inglese.
· Il nome della classe NON deve confondersi con il nome
di una struttura di Amiga. Nel caso sia necessario utilizzare un nome uguale
ad una struttura Amiga, si dovrà aggiungere il suffisso "_obj",
anche se il linguaggio usato non lo richiederebbe. Per es. una Classe per
gestire le bitmap, si dovrà chiamare "bitmap_obj".
· Nel caso si sia in dubbio se l'eventuale nome di una Classe potrebbe
collidere con il nome di una struttura, sarà conveniente terminare
il nome della classe con "_obj" in ogni caso.
3.1.2 - Nome dei Metodi
· Il Nome dei Metodi deve essere il più corto
e più chiaro possibile. Per es. in una classe che gestisce una lista
di nodi, il metodo per aggiungere un nodo NON si dovrà
chiamare "addnode", ma semplicemente "add".
· Il nome dei Metodi deve essere tutto in minuscolo.
· Il nome dei Metodi deve essere in inglese.
3.1.3 - Object Inheritance
La caratteristica di Object Inheritance propria della OOP deve essere utilizzata IL MENO POSSIBILE. Questo perchè la Object Inheritance viene implementata in modo differente nei vari linguaggi. Nei sorgenti di AMF, per semplificare la leggibilità e l'eventuale Porting, tutto deve essere il più chiaro e lineare possibile. E' quindi VIETATO l'utilizzo di particolari strutture o costrutti delle classi caratteristici di un particolare linguaggio. Ad es. costrutti di tipo "friend" o la Multiple Inheritance del C++ NON sono consentiti.
Al posto della Object Inheritance è consigliabile creare un'istanza della Classe che si desirera "riutilizzare" all'interno della nuova Classe. Per esempio, se creiamo la Classe "picture" (notate: tutto in minuscolo e in inglese) che "potrebbe" ereditare una Classe "bitmap_obj", è consigliabile inserire un'istanza della Classe "bitmap_obj" all'interno della classe "picture".
3.1.4 - Object Initialization e Object Destruction
· L'inizializzazione e la distruzione di una Classe
deve sempre avvenire tramite due Metodi particolari: quello di Inizializzazione
e quello di distruzione.
· Il metodo di inizializzazione DEVE chiamarsi col nome
della Classe stessa. Per esempio, il metodo di inizializzazione della Classe
"picture" dovrà chiamarsi "picture()" (con eventuali
parametri tra parentesi, qui omessi per leggibilità).
· Il metodo di distruzione di una classe, invece, DEVE
chiamarsi "end()" e NON deve ricevere alcun parametro.
· Questi due metodi di Inizializzazione e Distruzione devono essere
invocati in maniera ESPLICITA dal programma che utilizza la
Classe: non bisogna assolutamente fare affidamento sulle routine di Inizializzazione
e Distruzione presenti nel linguaggio ospitante.
· Nel caso che una Classe ne "inglobi" un'altra, dovrà
chiamare nel proprio Metodo di inizializzazione il Metodo di inizializzazione
della Classe "inglobata". Per es. la Classe "picture",
che contiene "bitmap_obj", dovrà chiamare, all'interno
di "picture()" il metodo "bitmap_obj()" legato all'istanza
della Classe "bitmap_obj".
3.1.5 - Librerie e Versione minima di OS
· Le Classi create devono appoggiarsi il meno possibile su librerie fornite da terz parti, che non facciano parte, cioè, di quelle normalmente fornite con AmigaOS. Una Classe "picture" che si basi sulla "iff.library", ad esempio, non verrà presa in considerazione, in quanto è possibile caricare le immagini anche tramite la "iffparse.library" e poi scrivere l'algoritmo di ByteRun-deconding.
· L'utilizzo di librerie di terze parti, tra l'altro, penalizza le Classi, dal momento che è possibile che queste librerie non vengano poi aggiornate per funzionare correttamente con i nuovi Sistemi Operativi.
· La versione minima supportata dalle AFC è
la 2.04. Se delle Classi risulteranno compatibili anche OS1.3, questo potrà
essere segnalato, ma non è una caratteristica fondamentale.
· Nel caso che alcune Classi richiedano esplicitamente una versione
più recente di OS per funzionare correttamente, dovrà essere
segnalato all'interno della documentazione.
3.1.6 - Tags
Dove possibile, la Classe dovrà essere modificabile tramite dei Tags, propri del sistema AmigaOS. I Metodi di "modifica" standard, tramite Tags si devono chiamare:
· "setattrs(tags)" per il settaggio dei tags.
· "getattr(tag)" per ricevere UN singolo valore
di ritorno, fornendo un tag come parametro.
· "getattrs(tags)" nel caso si desideri implementare un Metodo
che ritorni più risultati con una singola chiamata.
3.2 - Definizione dei codici di errore
3.2.1 - Quando segnalare un codice d'errore
Le AFC devono garantire un'ottima risposta a comportamenti
non previsti durante la loro progettazione. Per dirla in parole povere, devono
essere "a prova di scemo". Se l'utente sbaglia a chiamare un Metodo,
o lo chiama prima di aver concluso un processo di inizializzazione o cose
del genere, la Classe deve essere in grado di intercettare l'errore e segnalarlo,
magari cercando anche di continuare comunque.
E' per questo che è necessario classificare e segnalare all'utente
il maggior numero di errori possibili. Cercando, dove è possibile,
di essere chiari, per facilitare la sessione di debug.
3.2.2 - Come segnalare i codici di errore
Per segnalare un errore, in tutti i linguaggi che lo supportano, è preferibile utilizzare le "Eccezioni", nei linguaggi a oggetti che non supportano le "Eccezioni", sarà necessario creare una Classe "error_obj" nella quale verrà memorizzato il codice di errore e i Metodi che verranno chiamati erroneamente dovranno ritornare False, dopo aver settato "error_obj" con il codice di errore appropriato.
3.2.3 - Classificazione dei codici di errore
Il codice di errore di una Classe viene contenuto in una variabile a 32Bit
di tipo long. Nella parte alta della variabile (i primi 16 bit) viene memorizzato
il "valore di identificazione" della Classe. Questo "valore
di identificazione" è univoco ed è assegnato dalla AFC
al momento della creazione. Questo valore deve comunque essere tenuto in
una costante all'interno del sorgente della Classe stessa e si deve chiamare
con il nome della Classe (scritto completamente in MAIUSCOLO) e il
suffisso "_BASE". Per es. l'oggetto "picture" avrà
il "valore di identificazione" chiamato "PICTURE_BASE".
La seconda parte della variabile di errore contiene l'errore vero e proprio.
Gli errori di ogni Classe partono da $0000 e terminano a $FFFF (sempre che
una Classe sia in grado di fornire ben 65535 messaggi di errore differenti!)
L'errore $0000 è sempre "No Memory". La corrispondenza "valore
errore"/descrizione deve essere fornita nella documentazione.
4.0 - POSSIBILITA' DI "PORTING" DELLE CLASSI
4.1 - Specifiche di Porting.
Le AFC possono (e devono) essere portate su più linguaggi possibile. Il porting deve seguire tutti i punti riportati nei capitoli 2 e 3. Eventuali modifiche funzionali sulla Classe NON SONO AMMESSE, mentre, nel caso che la Classe esegua delle operazioni non impementabili (per es. fornire più di un valore di ritorno da una funzione) queste cose potranno essere "adattate" da colui che eseguirà il "Porting".
4.2 - Limiti del Porting
Una Classe "portata" da un programmatore esterno NON potrà
essere distribuita fino a quando la stessa Classe non sia stata controllata
ed approvata dalla AFC. Questo per garantire che una determinata Classe funzioni
effettivamente anche dopo il porting. Noi di AFC NON vogliamo
in alcun modo penalizzare un linguaggio a favore di un altro. I programmatori
che NON accetteranno queste condizioni non riceveranno ulteriori
Classi da convertire e le Classi da loro create verranno segnalate sulle
pagine WEB di AFC come "NON FUNZIONANTI".
5.0 - DISTRIBUZIONE
5.1 - Le Classi compilate
Le Classi compilate, i file ".obj" del C++ o i file ".m" di Amiga E per intenderci, potranno essere liberamente distribuite e dovranno essere inserite in una directory chiamata "AFC".
All'interno di ogni file ".lha" contenente la Classe sarà presente anche la documentazione in formato Amiga Guide e dei sorgenti d'esempio.
5.2 - Il sorgente delle Classi
Il sorgente delle Classi NON è Pubblico
Dominio e per tanto NON viene distribuito assieme alla versione compilata
delle Classi. Tuttavia, sarà sempre a disposizione dei programmatori
che intenderanno eseguire il prorting di una determinata Classe.
Il gruppo di controllo di AFC avrà sempre a disposizione tutti i
sorgenti aggiornati e, a sua completa discrezione, potrà decidere
se fornire o meno ad un determinato programmatore il sorgente delle Classi.
5.3 - Disponibilità
Le versioni compilate delle AFC potranno essere trovate in questi luoghi:
FTP:
ftp.intercom.it/pub/afc - Sito ufficiale delle Amiga Foundation Classes
5.4 - Informazioni e siti WEB
Per eventuali informazioni aggiuntive o aggiornamenti (anche del testo che state leggendo in questo momento) potrete sempre fare riferimento a:
http://www.intercom.it/~fsoft/afc.html
La pagina ufficiale delle AFC.
Oppure, iscrivetevi alle AFC mailing list, mandando un messaggio a:
con nel SUBJECT del messaggio:
subscribe