148 votes

Pratiques exemplaires de la programmation défensive favorite (intelligente)

Si vous aviez à choisir votre Favori (sage) des techniques pour se défendre de codage, quels seraient-ils? Bien que mes langues sont Java et Objective-C (avec de l'expérience en C++), n'hésitez pas à répondre dans n'importe quelle langue. L'accent ici sur les intelligent sur les techniques de défense autres que celles que 70%+ de nous ici connaissent déjà. Alors maintenant, il est temps de creuser profondément dans votre sac à malices.

En d'autres termes, essayez de penser à autre chose qu'à ce inintéressant exemple:

  • if(5 == x) au lieu de if(x == 5): pour éviter les imprévus affectation

Voici quelques exemples de certains intrigante meilleure défense pratiques de programmation (un langage spécifique, en sont des exemples en Java):

- Verrouillez vos variables jusqu'à ce que vous savez que vous avez besoin de les changer

Qui est, vous pouvez déclarer toutes les variables final jusqu'à ce que vous savez que vous aurez besoin de la changer, à quel point vous pouvez supprimer l' final. Généralement inconnu fait est que c'est aussi valable pour la méthode params:

public void foo(final int arg) { /* Stuff Here */ }

- Quand quelque chose de mauvais arrive, laissez une trace de preuves derrière

Il y a un certain nombre de choses que vous pouvez faire lorsque vous avez une exception: évidemment, la journalisation et de l'exécution de certaines de nettoyage serait un peu. Mais vous pouvez aussi laisser une trace de preuve (par exemple, la définition de variables de sentinelle des valeurs comme "IMPOSSIBLE DE CHARGER le FICHIER" ou 99999 serait utile dans le débogueur, dans le cas où vous arrive de souffler passé une exception catch-bloc).

- Quand il s'agit de la cohérence: le diable est dans les détails

Être compatibles avec les autres bibliothèques que vous utilisez. Par exemple, en Java, si vous créez une méthode qui extrait une gamme de valeurs de la limite inférieure inclusive et la limite supérieure exclusif. Cela va le rendre compatible avec des méthodes comme String.substring(start, end) qui fonctionne de la même façon. Vous trouverez toutes ces type de méthodes dans le JDK Sun à se comporter de cette façon qu'elle le fait diverses opérations, y compris l'itération des éléments compatibles avec les tableaux, où les indices sont à partir de Zéro (inclusive) pour la durée de la matrice (exclusif).

Donc, quels sont les favoris des pratiques défensives de la vôtre?

Mise à jour: Si vous ne l'avez pas déjà, n'hésitez pas à carillon. Je suis de donner une chance à plus de réponses à venir en avant-je choisir l' officiel de la réponse.

103voto

Joe Soul-bringer Points 1890

En c++, une fois, j'ai aimé la redéfinition de nouveaux, de sorte qu'il a fourni à certains de mémoire supplémentaire pour attraper de la clôture des erreurs post.

Actuellement, je préfère éviter de programmation défensives en faveur du Développement Piloté par les tests. Si vous attrapez rapidement les erreurs et à l'extérieur, vous n'avez pas besoin de muddy votre code avec des manoeuvres défensives, votre code est à SEC-er et vous wind-up avec moins d'erreurs que vous avez à défendre contre.

Comme WikiKnowledge A Écrit:

Éviter Une Programmation Défensive, Ne Parviennent Pas Rapidement À La Place.

Par une programmation défensive j' dire l'habitude d'écrire du code qui tente de compenser pour certains l'échec dans les données, de l'écriture de code qui suppose que les appelants peuvent fournir des données qui ne sont pas conformes le contrat entre l'appelant et l' sous-routine et que la sous-routine doit en quelque sorte à faire face avec elle.

75voto

John MacIntyre Points 9255

SQL

Quand je dois supprimer des données, j'écris

 select *    
--delete    
From mytable    
Where ...
 

Quand je l'exécuterai, je saurai si j'ai oublié ou bâclé la clause where. J'ai une sécurité. Si tout va bien, je surligne tout après les jetons de commentaires '-' et je l'exécute.

Edit: si je supprime beaucoup de données, je vais utiliser count (*) au lieu de simplement *

48voto

Allouer un raisonnable segment de mémoire au démarrage de l'application - je pense que Steve McConnell parle d'un mémoire en parachute dans le Code Complet.

Ceci peut être utilisé dans le cas où quelque chose de grave va mal et que vous êtes tenu de mettre fin.

L'allocation de ce mémoire, avant de vous fournit un filet de sécurité, comme vous pouvez le libérer, puis utiliser la mémoire disponible pour effectuer les opérations suivantes:

  • Enregistrer toutes les données persistantes
  • Fermez tous les fichiers appropriés
  • Messages d'erreur d'écriture dans un fichier journal
  • Présenter un véritable erreur à l'utilisateur

42voto

Diomidis Spinellis Points 8417

Dans chaque instruction switch qui n'a pas de cas par défaut, j'ajoute un cas qui annule le programme avec un message d'erreur.

 #define INVALID_SWITCH_VALUE 0

switch (x) {
case 1:
  // ...
  break;
case 2:
  // ...
  break;
case 3:
  // ...
  break;
default:
  assert(INVALID_SWITCH_VALUE);
}
 

41voto

Kyralessa Points 76456

Lorsque vous manipulez les divers états d'un enum (C#):

enum AccountType
{
    Savings,
    Checking,
    MoneyMarket
}

Puis, à l'intérieur d'une certaine routine...

switch (accountType)
{
    case AccountType.Checking:
        // do something

    case AccountType.Savings:
        // do something else

    case AccountType.MoneyMarket:
        // do some other thing

    default:
-->     Debug.Fail("Invalid account type.");
}

À un certain point, je vais ajouter un autre compte de type enum. Et quand je le fais, je vais oublier de fixer cette instruction switch. Si l' Debug.Fail accidents horriblement (en mode Debug) pour attirer mon attention sur ce fait. Quand j'ajoute de l' case AccountType.MyNewAccountType:, le terrible accident de la route s'arrête...jusqu'à ce que j'ajoute encore un autre type de compte et d'oublier de mettre à jour le cas ici.

(Oui, le polymorphisme est probablement mieux ici, mais c'est juste un exemple sur le dessus de ma tête.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X