12
votes

Quand devrait-on affirmer () être utilisé?

Dans le développement d'un grand projet de programmation C ++ avec de nombreux développeurs, nous avons rencontré des problèmes avec une utilisation inappropriée de Assert () dans le code qui entraîne une mauvaise qualité lorsque l'affirmation se produit effectivement et le produit se bloque.

La question est de savoir ce qui sont de bons principes à appliquer pour utiliser Aster () de manière appropriée? Quand est-ce approprié d'utiliser une assertion () et quand n'est-ce pas? Existe-t-il une liste de critères que chaque assertion devrait réussir pour être légitime? Comment pouvons-nous encourager une utilisation appropriée de Aster ()?

comme une première fissure à cela, je dirais que cela ne devrait être utilisé que pour documenter une condition qui est considérée comme impossible à atteindre et qui devrait être identifiée comme une défaillance d'affirmation () au moment de l'exécution du moment où elle surgir parce que les hypothèses de programmation sont violées.

Les gens peuvent-ils faire mieux que cela? Quelle est votre expérience avec assert ()?


3 commentaires

Utilisez ASPERT lorsque vous savez que certaines conditions doivent prévaloir pour que le code soit considéré comme "bon". Si l'affirmation échoue, alors par définition, le code doit être corrigé.


@RObert: convenu +1, mais il doit y avoir une considération donnée à la quantité de travail que l'utilisateur perdra si l'affirmation de tir collait le programme. Il est gênant lorsqu'un navigateur perd un ensemble d'onglets ouverts, mais pas généralement une catastrophe; C'est un désastre si un traitement de texte perd une journée de travail en raison d'une affirmation. Les parties dures sont (a) de déterminer s'il est prudent de faire quoi que ce soit, et (b) de garder le système dans un état où il peut être récupéré si quelque chose ne va pas.


Celui qui va toute une journée sans sauver son travail obtient ce qu'il mérite quand une affirmation se produit.


4 Réponses :


1
votes

Vous devez utiliser ASSERT pour vérifier toutes les conditions qui ne devraient jamais arriver:

  • Conditions préalables sur les paramètres d'entrée
  • résultats de calculs intermédiaires
  • postconditions sur l'état d'objet

    Mais vous devez inclure ces affirmations uniquement dans les bâtiments de débogage ou lorsqu'ils sont explicitement activés pour la libération (pas dans les bâtiments libérés aux clients).


1 commentaires

Si les mauvaises conditions préalables, etc. sont du code complètement sous votre contrôle que d'échouer une affirmation conviennent parfaitement. Mais qu'en est-il des situations comme celles-ci: DLL manquantes / mauvaises DLL, mauvaises entrées de registre, etc.



13
votes

Utilisez Exceptions pour la condition d'erreur qui proviennent de extérieur (en dehors de la méthode ou en dehors du programme) comme le contrôle des paramètres et manquants / défectueux Ressources externes comme des fichiers ou des connexions ou une entrée utilisateur.

Utilisez assertions pour indiquer un défauts tels que des erreurs de programmation, des conditions qui ne devraient pas se produire, par ex. Invariants de classe / de méthodes et de l'état de programme invalide.


0 commentaires

1
votes

J'utilise des asserts pour vérifier tout état de programme indésirable :

  • Fonction Conditions préalables
  • parfois je les insère dans une macro après chaque appel d'API: GLDRAWARRAY (); CheckopenglLerror (); - CheckOpenglLerror () appelle getglerror () si allumé
  • Intégrité de la structure de données: affirmation (quelque chose == null);
  • parfois gdb me mène (iOS SDK 3.2). J'utilise des asserts pour le prouver.

    Notez que "l'état du programme indésirable" exclut les erreurs qui se produisent naturellement au moment de l'exécution, telles que la possibilité d'ouvrir un fichier sélectionné par l'utilisateur en raison de l'autorisation ou de l'échec HD. Dans ces cas, il n'est pas sage d'utiliser des assertions.


0 commentaires

0
votes

Beaucoup de code de nos jours a beaucoup de dépendances externes et de connexions. Je n'ai pas tendance à utiliser beaucoup d'affirmations traditionnelles ces jours-ci, je privilégie les exceptions. Je n'ai pas envie de pouvoir assumer "cela ne peut jamais arriver" et les chèques peuvent être supprimés en toute sécurité dans une construction sans débogage.


0 commentaires