Questo articolo discute Delphi Proviamo .. finalmente costruire, al momento di utilizzare, come Castalia e rende più facile da usare.

(Originariamente pubblicato in Delphi-expert.com il 16 marzo 2004)

In una linea di business che mi ha esaminato un sacco di codice sorgente, a volte mi avviso comune delle abitudini e delle tendenze nel campo della gente di codice. Talvolta queste abitudini sono buone, come con affermazioni. A volte sono cattive abitudini, come utilizzare le etichette e gotos. A volte, il codice è semplicemente mancano alcuni elementi molto importanti, sia a causa di pigrizia o insufficiente comprensione da parte del programmatore che ha scritto il codice. Uno di questi costrutti che è molto potente, ma spesso trascurato e, talvolta, in modo abusivo, Delphi è la "prova" costruire. Nel corso delle prossime due settimane, stiamo andando a guardare a ciò che questi costrutti di fare e come usare bene, e come può aiutare Castalia si utilizza in modo efficace e non ignorarli.

Questa settimana, ci si concentrerà sulla provare .. finalmente costruire. La prossima settimana andremo in dettaglio con .. provare ad eccezione, tra cui alcuni sulla storia del concetto di eccezioni. Renderemo inoltre più divertente di java, che ci può insegnare molto con la sua over-the-top meccanismo di gestione delle eccezioni.

Introduzione

A volte è necessario per far sì che certe cose sono fatte per completare un compito, indipendentemente degli errori che si sono verificati nel maggio l'esecuzione del compito. Ad esempio, se uno prende il controllo di routine di una risorsa, di solito è necessario per il rilascio di routine per la risorsa, anche se gli errori si verificano nel processo. Ad esempio, nel codice seguente, un file viene aperto F, il testo viene scritto, e poi si è chiusa. In mancanza di archiviare il fascicolo si tradurrebbe in una perdita di risorse e sarebbe un errore di prima classe.

 
Reset (F);
WriteLn (F, 'Ciao, mondo!');
CloseFile (F);

Questo codice funziona bene finché ogni funzione esegue normalmente, ma se succede qualcosa di anormale, poi ci saranno problemi. Per esempio, se Reset (F) è riuscito, ma per qualche motivo, la chiamata alla WriteLn non ha esito positivo, la routine di uscita senza mai tentare di CloseFile (F). Come risultato, il file non sarà mai chiuso, e una risorsa è stata soffiata.

Come possiamo risolvere questo problema? WriteLn non fornisce alcun meccanismo di controllo degli errori, come una routine di fare (più che sulla prossima settimana). Si esegue semplicemente, e se qualcosa va storto, si solleva un'eccezione (più su che anche la prossima settimana). In poche parole, l'eccezione è una condizione anomala, in esecuzione di un programma che fa sì che il flusso del programma deve essere interrotto. Quello di cui abbiamo bisogno è un modo per assicurarsi che CloseFile (F), viene chiamato, anche se si verifica un'eccezione. Questo è esattamente ciò che la provi .. finalmente è di costruire. Si consideri lo stesso codice, ma con la protezione di controllo di flusso di un blocco try-infine:

 
Reset (F);
provare
WriteLn (F, 'Ciao, mondo!');
finalmente
CloseFile (F);
fine
;

Ora, ci hanno assicurato che CloseFile (F), saranno chiamati, non importa quello che succede durante la chiamata a WriteLn. Ora per una definizione più formale, direttamente dal Delphi aiuto:

La sintassi di una prova .. finalmente è

provare statementList1 finalmente fine statementList2

dove ogni statementListè una sequenza di dichiarazioni delimitato da punti e virgola. La provi .. infine esegue la dichiarazione in statementList1 (la clausola di provare). Se statementList1 finiture senza sollevare eccezioni, statementList2 (finalmente la clausola) viene eseguito. Se è sollevata un'eccezione durante l'esecuzione del statementList1, il controllo viene trasferito al statementList2; una volta statementList2finiture di esecuzione, l'eccezione è nuovamente sollevata. Se una chiamata di uscita, Break, o cause Continua procedura di controllo per lasciare s tatementList1, statementList2 viene automaticamente eseguito. Pertanto, la clausola è infine sempre eseguito, indipendentemente dal modo in cui la clausola di provare termina.

Ora che abbiamo una comprensione del provi .. finalmente costruire e quando utilizzarlo, diamo un'occhiata a come Castalia può essere d'aiuto.

Codice dei modelli

Castalia fornisce una serie di modelli di codice che prevede la costruzione di provare .. finalmente. Quando installato per la prima volta, comprende la tryf Castalia e trycf modelli. Il tryfcrea un modello semplice scheletro per una prova di blocco. Per utilizzare il modello tryf, è sufficiente digitare "tryf" nel editor e premere la barra spaziatrice. Il codice scheletrici sono inseriti:

 
provare
|
finalmente
|
fine;

Il cursore si trova nel luogo appropriato nel cercare clausola. Dopo aver creato il codice nella clausola di provare, premere una volta per passare infine nella clausola. Poi creare il tuo codice di pulitura.

trycf il modello si rivolge a un particolare uso comune delle provare .. finalmente costruire in Delphi. Questa è la creazione dinamica e la distruzione di oggetti. Cattivo esempio:


MyStrings: = TStringList. Crea;
MyStrings. Aggiungi ( 'Ciao');
MyStrings. Aggiungi ( 'World');
MyStrings.
SaveToFile ( 'hello.txt');
MyStrings. Libera;

Questo è simile al primo esempio. Una risorsa (memoria) è stato assegnato - in questo caso da un costruttore. La risorsa viene manipolato, il resoruce è deallocated dal chiamante MyStrings.Free. Se non abbiamo chiamata MyStrings.Free, la memoria non sarebbe deallocated, e ci sarebbe ancora esaminando un'altra risorsa fuga. Anche in questo caso, il problema è lo stesso. Se qualcosa va storto durante la manipolazione della memoria, la distruzione non è mai chiamato e la memoria non è mai deallocated. Ecco il codice:

 
MyStrings: = TStringList. Crea;
provare
MyStrings. Aggiungi ( 'Ciao');
MyStrings. Aggiungi ( 'World'
);
MyStrings. SaveToFile ( 'hello.txt');
finalmente
MyStrings. Libera;
fine;

Si noti che MyStrings.Free è stato spostato nella infineclausola, che non importa ciò che accade nel cercare clausola, l'oggetto sarà liberato. Castalia's trycf modello prevede uno scheletro di questo costrutto. Per utilizzare il trycf modello, di tipo "trycf" nel editor e premere la barra spaziatrice. Il codice scheletrici sono inseriti:

 
|: = |. Crea;
provare
|
finalmente
|. Libera;
fine;

Il cursore si trova in cui il primo | carattere, e premendo tornerá a ciascun | in ordine. (Il | caratteri non verranno visualizzati in codice, ma sono qui utilizzate a fini di chiarezza). È necessario utilizzare il trycfmodello ogni volta che si stanno creando oggetti dinamicamente.

È possibile saperne di più sui modelli Castalia codice qui.

Refactoring

Codice modelli sono utili quando si sta scrivendo nuovo codice, ma non aiutano molto quando si modifica il codice esistente in conformità con la nostra nuova comprensione di provare finalmente ... Castalia's refactorings aiuterà in questo. Il "Surround con ..." refactoring consente di selezionare un blocco di codice e provare a mettere un blocco .. finalmente intorno ad esso con pochi clic del mouse. Basta selezionare il codice che va a cercare ilclausola e fare clic con il tasto destro del mouse. Dal "Refactoring", scegli "Surround con ..." e infine scegliere "provare finalmente ..". Il codice sarà immediatamente rientrato e racchiuso in un vero e proprio provare .. finalmente blocco.

È possibile saperne di più su Castalia's impianti automatizzati refactoring qui.

Questa settimana abbiamo imparato ad utilizzare Delphi Proviamo finalmente ..costruire al fine di evitare perdite di risorse e di altri problemi di controllo di flusso. Abbiamo anche imparato Castalia ci può aiutare a costruire per l'utilizzo di questo in modo più efficace sia con nuovo codice e codice esistente. La prossima settimana ci sarà a provare .. tranne imparare Castalia e ci può aiutare a scrivere codice migliore gestione delle eccezioni.

Average rating: