À l'aide de l'essayer...enfin, pour éviter les fuites de ressource


Cet article traite de Delphi essayer..enfin construire, quand utiliser, et comment Castalia rend plus facile à utiliser.

(publié à l'Origine sur delphi-expert.com le 16 Mars 2004)

Dans une ligne de l'entreprise qui m'a l'examen de beaucoup de code source, j'ai parfois l'avis commun des habitudes et des tendances dans les gens du code. Parfois, ces habitudes sont bonnes, comme l'utilisation d'assertions. Parfois, les habitudes sont mauvaises, comme l'utilisation des étiquettes et des gotos. Parfois, le code est tout simplement pas certains éléments très importants, en raison à la paresse ou le manque de compréhension de la part du programmeur qui a écrit le code. L'une de ces constructions est très puissant, mais souvent négligés et parfois mal utilisé, est Delphi 'd'essayer' de construire. Au cours des deux prochaines semaines, nous allons regarder ce que ces constructions faire et comment bien les utiliser, et comment Castalia peut vous aider à les utiliser efficacement et de ne pas les négliger.

Cette semaine, nous allons nous concentrer sur le try..finally construire. La semaine prochaine nous allons entrer dans les détails avec essayer..sauf, y compris un peu d'histoire sur le concept d'exceptions. Il nous fera également plaisir de java, qui peut nous apprendre beaucoup de choses avec ses plus de-the-top exception d'un mécanisme de gestion.

Introduction

Parfois, vous devez vous assurer que certaines choses sont faites pour accomplir une tâche, indépendamment de toutes les erreurs qui ont eu lieu dans l'exécution de la tâche. Par exemple, si une routine prend le contrôle d'une ressource, il est généralement nécessaire pour la routine pour la libération de la ressource, même si des erreurs se produisent dans le processus. Par exemple, dans le code suivant, un fichier F est ouvert, un texte est écrit, et puis il est fermé. Oublier de fermer le fichier entraînerait une fuite de ressources et serait une première classe de bug.


Reset(F)
WriteLn(F, 'Hello, World!')
CloseFile(F)

Ce code fonctionne très bien aussi longtemps que chaque fonction s'exécute normalement, mais si quelque chose d'anormal se produit, alors il y aura des problèmes. Par exemple, si Reset(F) est un succès, mais pour une raison que l'appel à WriteLn échoue, la routine de sortie, sans jamais tenter d'CloseFile(F). En conséquence, le fichier ne sera jamais fermé, et une ressource a été divulgué.

Comment pouvons-nous résoudre ce problème? WriteLn ne pas fournir une vérification des erreurs mécanisme comme certaines routines de faire (plus que la semaine prochaine). Il exécute simplement, et si quelque chose va mal, il lève une exception (plus sur que la semaine prochaine aussi). En un mot, une exception est une condition anormale dans l'exécution d'un programme qui provoque l'écoulement du programme interrompu. Ce dont nous avons besoin est une façon de s'assurer que CloseFile(F) est appelée, même si une exception se produit. C'est exactement ce que l'essayer..enfin construire. Considérons le même code, mais avec le protégé de contrôle de flux d'un try-finally bloc:


Reset(F)

WriteLn(F, 'Hello, World!')
enfin
CloseFile(F)
fin

Maintenant, nous avons veillé à ce que CloseFile(F) seront appelés, peu importe ce qui se passe lors de l'appel à WriteLn. Maintenant, pour une définition plus formelle, directement à partir de Delphi aider:

La syntaxe de try..finally est

statementList1 enfin statementList2 fin

statementList est une séquence d'instructions délimité par des points-virgules. Le try..finally instruction exécute l'instruction statementList1 (le essayer l'article). Si statementList1 finitions sans soulever des exceptions, statementList2 (le enfin l'article) est exécutée. Si une exception est levée lors de l'exécution de statementList1, le contrôle est transféré à statementList2 statementList2 fini de s'exécuter, l'exception est sur-relancé. Si un appel à la Exit, Break ou Continuer procédure de la commande de causes de laisser statementList1, statementList2 est automatiquement exécutée. Ainsi, le enfin l'article est toujours exécuté, indépendamment de la façon dont le essayer l'article se termine.

Maintenant que nous avons une compréhension de l'essayer..enfin construire et quand l'utiliser, regardez comment Castalia peut aider.

les Modèles de Code

Castalia fournit un certain nombre de modèles de code qui impliquent l'essayer..enfin construire. Lors de la première installation, Castalia comprend le tryf et trycf modèles. Le tryf modèle crée un simple squelette pour un bloc try. Pour utiliser le tryf modèle, il suffit de taper 'tryf' dans l'éditeur et pousser la barre d'espace. Le squelette de code sera inséré:



|
enfin
|
fin

Le curseur se trouve à l'endroit approprié dans le essayer l'article. Après la création du code dans le essayer l'article, appuyez une fois pour sauter dans le enfin l'article. Créez ensuite votre code de nettoyage.

trycf modèle adresses particulièrement à l'utilisation commune de la try..finally construire en Delphi. C'est la dynamique de création et de destruction d'objets. Mauvais exemple:


MyStrings := TStringList.Créer
MyStrings.Ajouter('Bonjour')
MyStrings.Ajouter(Monde)
MyStrings.SaveToFile('hello.txt')
MyStrings.Gratuit

Ceci est similaire à la première exemple. Une ressource (mémoire) sont alloués - dans ce cas par un constructeur. La ressource est en cours de manipulation, puis le resoruce est libéré par la remise MyStrings.Gratuit. Si nous n'avons pas d'appel MyStrings.Gratuit, la mémoire ne serait pas libéré, et on serait en train de regarder encore une autre fuite de ressources. Encore une fois, le problème est le même. Si quelque chose se passe mal lors de la manipulation de la mémoire, le destructeur n'est jamais appelé et que la mémoire n'est jamais libéré. Voici le code:


MyStrings := TStringList.Créer

MyStrings.Ajouter('Bonjour')
MyStrings.Ajouter(Monde)
MyStrings.SaveToFile('hello.txt')
enfin
MyStrings.Gratuit
fin

Notez que MyStrings.Libre a été déplacé dans le enfin l'article, s'assurer que, peu importe ce qui se passe dans le essayer l'article, l'objet sera libéré. Castalia trycf modèle fournit un squelette de cette construction. Pour utiliser le trycf modèle, de type 'trycf' dans l'éditeur, et appuyez sur la barre d'espace. Le squelette de code sera inséré:


| := |.Créer

|
enfin
|.Gratuit
fin

Le curseur sera situé là où le premier caractère | est, et appuyez sur pour sauter pour chaque | dans l'ordre. (Le | caractères n'apparaissent pas dans le code, mais sont utilisés ici pour plus de clarté). Vous devez utiliser le trycf modèle à chaque fois que vous créez des objets dynamiquement.

Vous pouvez en apprendre plus à propos de Castalia de modèles de code ici.

Refactoring

les modèles de Code sont utiles quand on écrit le nouveau code, mais ne l'aide pas beaucoup quand nous sommes en train de modifier le code existant en conformité avec la nouvelle compréhension de la try..finally. Castalia de refactorings va vous aider. Le 'Surround Avec...' refactoring permet de sélectionner un bloc de code et de placer un try..finally bloc autour de lui avec juste quelques clics de la souris. Il suffit de sélectionner le code qui va dans le essayer l'article et cliquez dessus avec le bouton droit de la souris. À partir du 'Refactoring' dans le menu, choisissez 'Surround Avec...' et enfin choisissez 'essayer..enfin.' Votre code sera instantanément en retrait et placée dans une bonne try..finally.

Vous pouvez en apprendre plus à propos de Castalia automatisé de refactoring installations ici.

Cette semaine, nous avons appris comment utiliser Delphi try..finally construire pour éviter les fuites de ressource et d'autres problèmes de contrôle de débit. Nous avons aussi appris comment Castalia peut nous aider à utiliser ce concept de manière plus efficace à la fois avec le nouveau code et de code existant. La semaine prochaine, nous allons regarder les essayer..sauf et d'apprendre comment Castalia peut nous aider à mieux écrire le code de gestion des exceptions.









A l'aide de l'essayer...enfin, pour eviter les fuites de ressource


A l'aide de l'essayer...enfin, pour eviter les fuites de ressource : Plusieurs milliers de conseils pour vous faciliter la vie.


Cet article traite de Delphi essayer..enfin construire, quand utiliser, et comment Castalia rend plus facile a utiliser.

(publie a l'Origine sur delphi-expert.com le 16 Mars 2004)

Dans une ligne de l'entreprise qui m'a l'examen de beaucoup de code source, j'ai parfois l'avis commun des habitudes et des tendances dans les gens du code. Parfois, ces habitudes sont bonnes, comme l'utilisation d'assertions. Parfois, les habitudes sont mauvaises, comme l'utilisation des etiquettes et des gotos. Parfois, le code est tout simplement pas certains elements tres importants, en raison a la paresse ou le manque de comprehension de la part du programmeur qui a ecrit le code. L'une de ces constructions est tres puissant, mais souvent negliges et parfois mal utilise, est Delphi 'd'essayer' de construire. Au cours des deux prochaines semaines, nous allons regarder ce que ces constructions faire et comment bien les utiliser, et comment Castalia peut vous aider a les utiliser efficacement et de ne pas les negliger.

Cette semaine, nous allons nous concentrer sur le try..finally construire. La semaine prochaine nous allons entrer dans les details avec essayer..sauf, y compris un peu d'histoire sur le concept d'exceptions. Il nous fera egalement plaisir de java, qui peut nous apprendre beaucoup de choses avec ses plus de-the-top exception d'un mecanisme de gestion.

Introduction

Parfois, vous devez vous assurer que certaines choses sont faites pour accomplir une tache, independamment de toutes les erreurs qui ont eu lieu dans l'execution de la tache. Par exemple, si une routine prend le controle d'une ressource, il est generalement necessaire pour la routine pour la liberation de la ressource, meme si des erreurs se produisent dans le processus. Par exemple, dans le code suivant, un fichier F est ouvert, un texte est ecrit, et puis il est ferme. Oublier de fermer le fichier entraînerait une fuite de ressources et serait une premiere classe de bug.


Reset(F)
WriteLn(F, 'Hello, World!')
CloseFile(F)

Ce code fonctionne tres bien aussi longtemps que chaque fonction s'execute normalement, mais si quelque chose d'anormal se produit, alors il y aura des problemes. Par exemple, si Reset(F) est un succes, mais pour une raison que l'appel a WriteLn echoue, la routine de sortie, sans jamais tenter d'CloseFile(F). En consequence, le fichier ne sera jamais ferme, et une ressource a ete divulgue.

Comment pouvons-nous resoudre ce probleme? WriteLn ne pas fournir une verification des erreurs mecanisme comme certaines routines de faire (plus que la semaine prochaine). Il execute simplement, et si quelque chose va mal, il leve une exception (plus sur que la semaine prochaine aussi). En un mot, une exception est une condition anormale dans l'execution d'un programme qui provoque l'ecoulement du programme interrompu. Ce dont nous avons besoin est une façon de s'assurer que CloseFile(F) est appelee, meme si une exception se produit. C'est exactement ce que l'essayer..enfin construire. Considerons le meme code, mais avec le protege de controle de flux d'un try-finally bloc:


Reset(F)

WriteLn(F, 'Hello, World!')
enfin
CloseFile(F)
fin

Maintenant, nous avons veille a ce que CloseFile(F) seront appeles, peu importe ce qui se passe lors de l'appel a WriteLn. Maintenant, pour une definition plus formelle, directement a partir de Delphi aider:

La syntaxe de try..finally est

statementList1 enfin statementList2 fin

ou statementList est une sequence d'instructions delimite par des points-virgules. Le try..finally instruction execute l'instruction statementList1 (le essayer l'article). Si statementList1 finitions sans soulever des exceptions, statementList2 (le enfin l'article) est executee. Si une exception est levee lors de l'execution de statementList1, le controle est transfere a statementList2 statementList2 fini de s'executer, l'exception est sur-relance. Si un appel a la Exit, Break ou Continuer procedure de la commande de causes de laisser statementList1, statementList2 est automatiquement executee. Ainsi, le enfin l'article est toujours execute, independamment de la façon dont le essayer l'article se termine.

Maintenant que nous avons une comprehension de l'essayer..enfin construire et quand l'utiliser, regardez comment Castalia peut aider.

les Modeles de Code

Castalia fournit un certain nombre de modeles de code qui impliquent l'essayer..enfin construire. Lors de la premiere installation, Castalia comprend le tryf et trycf modeles. Le tryf modele cree un simple squelette pour un bloc try. Pour utiliser le tryf modele, il suffit de taper 'tryf' dans l'editeur et pousser la barre d'espace. Le squelette de code sera insere:



|
enfin
|
fin

Le curseur se trouve a l'endroit approprie dans le essayer l'article. Apres la creation du code dans le essayer l'article, appuyez une fois pour sauter dans le enfin l'article. Creez ensuite votre code de nettoyage.

trycf modele adresses particulierement a l'utilisation commune de la try..finally construire en Delphi. C'est la dynamique de creation et de destruction d'objets. Mauvais exemple:


MyStrings := TStringList.Creer
MyStrings.Ajouter('Bonjour')
MyStrings.Ajouter(Monde)
MyStrings.SaveToFile('hello.txt')
MyStrings.Gratuit

Ceci est similaire a la premiere exemple. Une ressource (memoire) sont alloues - dans ce cas par un constructeur. La ressource est en cours de manipulation, puis le resoruce est libere par la remise MyStrings.Gratuit. Si nous n'avons pas d'appel MyStrings.Gratuit, la memoire ne serait pas libere, et on serait en train de regarder encore une autre fuite de ressources. Encore une fois, le probleme est le meme. Si quelque chose se passe mal lors de la manipulation de la memoire, le destructeur n'est jamais appele et que la memoire n'est jamais libere. Voici le code:


MyStrings := TStringList.Creer

MyStrings.Ajouter('Bonjour')
MyStrings.Ajouter(Monde)
MyStrings.SaveToFile('hello.txt')
enfin
MyStrings.Gratuit
fin

Notez que MyStrings.Libre a ete deplace dans le enfin l'article, s'assurer que, peu importe ce qui se passe dans le essayer l'article, l'objet sera libere. Castalia trycf modele fournit un squelette de cette construction. Pour utiliser le trycf modele, de type 'trycf' dans l'editeur, et appuyez sur la barre d'espace. Le squelette de code sera insere:


| := |.Creer

|
enfin
|.Gratuit
fin

Le curseur sera situe la ou le premier caractere | est, et appuyez sur pour sauter pour chaque | dans l'ordre. (Le | caracteres n'apparaissent pas dans le code, mais sont utilises ici pour plus de clarte). Vous devez utiliser le trycf modele a chaque fois que vous creez des objets dynamiquement.

Vous pouvez en apprendre plus a propos de Castalia de modeles de code ici.

Refactoring

les modeles de Code sont utiles quand on ecrit le nouveau code, mais ne l'aide pas beaucoup quand nous sommes en train de modifier le code existant en conformite avec la nouvelle comprehension de la try..finally. Castalia de refactorings va vous aider. Le 'Surround Avec...' refactoring permet de selectionner un bloc de code et de placer un try..finally bloc autour de lui avec juste quelques clics de la souris. Il suffit de selectionner le code qui va dans le essayer l'article et cliquez dessus avec le bouton droit de la souris. A partir du 'Refactoring' dans le menu, choisissez 'Surround Avec...' et enfin choisissez 'essayer..enfin.' Votre code sera instantanement en retrait et placee dans une bonne try..finally.

Vous pouvez en apprendre plus a propos de Castalia automatise de refactoring installations ici.

Cette semaine, nous avons appris comment utiliser Delphi try..finally construire pour eviter les fuites de ressource et d'autres problemes de controle de debit. Nous avons aussi appris comment Castalia peut nous aider a utiliser ce concept de maniere plus efficace a la fois avec le nouveau code et de code existant. La semaine prochaine, nous allons regarder les essayer..sauf et d'apprendre comment Castalia peut nous aider a mieux ecrire le code de gestion des exceptions.


À l'aide de l'essayer...enfin, pour éviter les fuites de ressource

À l'aide de l'essayer...enfin, pour éviter les fuites de ressource : Plusieurs milliers de conseils pour vous faciliter la vie.
Recommander aux amis
  • gplus
  • pinterest

Messages récents

Commentaire

Laisser un commentaire

évaluation