Nutile

domenica, febbraio 26, 2006

Chi comprerà Delphi?

Pare che Borland abbia deciso di cambiare rotta: mette in vendita tutte le sue soluzioni IDE (da JBuilder a Delphi), concentrandosi solo su soluzioni per la gestione del ciclo di vita della applicazioni (ALM - Application Lifecycle Management).
Fa un certo effetto: ricordo nei primi anni 90 quando Borland era sinonimo di programmazione rubusta ed efficiente, epoca in cui MS Quick Basic rincorreva il migliore Turbo Basic, il Turbo Pascal creava un rivoluzione....e un giovane, innamorato della programmazione, comprava il suo primo "ambiente di sviluppo" OOP: Turbo C++ 1.0 . . . come cambia il mondo!

Sun rende disponibile Studio Creator 2

Sun ha annunciato la disponibilità gratuita dell'attesissimo tool di sviluppo applicativo Sun Java™ Studio Creator 2, un pacchetto che fornisce ai progettisti software un ambiente completo e intuitivo per la realizzazione e il deployment visuale di applicazioni WEB.

Comunicato stampa

Java Studio Creator - Downloads

Inolte è possibile "fare un giro" sulle nuove versioni enterprise di Java e della piattaforma di sviluppo NetBeans: J2EE 5 e NetBeans Enterprise Pack 5.5.

martedì, febbraio 07, 2006

VB.NET e "Try Catch When"

Ho scoperto una caratteristica di VB.NET, nella gestione delle eccezioni, assai singolare: la possibilità di aggiungere una condizione alla clausola Catch!
In pratica l'eccezione viene catturata solo se si verifica la condizione espressa con l'istruzione When.
Esempio:

Try
...
Catch Ex as Exception When myCondition
...
End Try


Penso che se usata male tale condizione servirebbe solo a confondere le acque.
Ci sarà un motivo per cui non è stata implementata in C# o in JAVA? :)

lunedì, febbraio 06, 2006

Un'introduzione alla gestione delle eccezioni

Nella progettazione di moduli riusabili riveste grande importanza la gestione delle eccezioni.

Ma cos'è un eccezione e come si distingue da un errore?

  • un eccezione è una rottura delle assunzioni predefinite dell’applicazione
    esempio: l’assunzione che la connessione al database sia disponibile;

  • un errore è un'assunzione non definita in modo corretto
    esempio: inserimento di un valore null in un campo del database che non prevede l’inserimento di valori null.


Gli errori devono essere tutti gestiti, cioè evitati, scrivendo del buon codice. Le eccezioni, che con una buona progettazione possono essere tutte previste, devono essere gestite in modo opportuno.

Non mi soffermerò sull’uso del costrutto try,catch, finaly, ma piuttosto su come gestire un eccezione e come tentare di progettare un’applicazione rubusta e scalabile in riferimento alle eccezioni.

Al verificarsi di un eccezione si possono scegliere tre opzioni:

  1. Ignorare l’eccezione ed eseguire l’istruzione seguente, come se non ci fosse stata nessuna anomalia.

  2. Catturare l’eccezione ed eseguire del codice che gestisce l’anomalia.

  3. Catturare l’eccezione ed incapsularla in un’altra eccezione che è rilevante per la nostra applicazione, o per il modulo/layer chiamante che a sua volta si troverà davanti alla 3 opzioni descritte.


Quest’ultimo caso ovviamente, fa la differenza e necessità di un set di eccezioni personalizzate.

Sia .Net che Java permettono l' estensione della classe exception, creando eccezioni che possono essere usate per fornire informazioni più dettagliate, e/o per incapsulare una determinata eccezione, e/o per agevolare la sua gestione.

Per una efficiente gestione è opportuno quindi creare un set di eccezioni per ogni "componente" o "layer". Così gli altri componenti che usano tale oggetto, una volta catturato l'errore potranno decidere se e come gestirlo oppure propagarlo a sua volta all'eventuale altro modulo chiamante (magari incapsulando il messaggio in un'eccezione di sua competenza).

Di fondamentale importanza è il giusto ordine delle eccezioni nel blocco Catch: vanno indicate dal più specifico al più generico.



Riassumendo, è necessario:

  • evitare richieste all’utente su come gestire un eccezione;

  • evitare di nascondere eccezioni al chiamante, diminuisce la visibilità e la chiarezza sugli algoritmi applicati. Meglio generare un eccezione, sarà il modulo chiamante a gestire l’anomalia;

  • evitare errori generici, ma creare o usare eccezioni specifiche che migliorano la conoscenza dell’anomalia generata e quindi la sua gestione da parte di moduli chiamanti;

  • usare il costrutto finally;

  • creare una gestione dell’eccezione in grado di ripristinare uno stato consistente in caso di anomalia.