2010-11-19 22 views
5

Je développe actuellement un petit framework AI (algorithmes génétiques/réseaux de neurones) en C#, pour un projet universitaire.Comment affirmez-vous en code algorithmique dans .NET?

Ma première préoccupation est de développer un framework réutilisable, donc je suis en train de tout concevoir pour être assez modulaire. Je sais que je paye un prix pour cela (performance), mais je sens que j'ai plus à gagner qu'à perdre (il est préférable d'avoir deux fois plus de code que de perdre deux fois plus de temps à essayer de trouver impossible trouver des bugs et perdre beaucoup de temps à essayer d'ajouter de nouvelles choses qui sont difficiles à introduire dans un bloc de code monolithique).

Je voudrais avoir beaucoup de vérifications sur différentes parties de mon code, assertions, fondamentalement. Vérifie si la méthode XI est bien dans un état correct, etc. Ce genre d'assertions est utile lors du développement, mais je voudrais qu'ils restent à l'écart du code de version (c'est-à-dire quand je décide que je veux partir ce travail pour la nuit pour obtenir mes résultats de recherche finaux).

Je peux voir plusieurs façons d'y parvenir:

  1. famille System.Diagonists.Assert des méthodes.
  2. code des marchés
  3. Avoir si (x) puis jeter InvalidStateException() entouré de #if DEBUG/#endif

Comment feriez-vous et pourquoi?

Je suis également au courant des tests unitaires (je les utilise), mais j'aimerais aussi avoir une sorte d'assertions sur le code.

Répondre

8

Vous pouvez utiliser une méthode statique comme ceci:

[Conditional("DEBUG")] 
public static void Assert(bool condition, string message) 
{ 
    if (!condition) 
     throw new InvalidStateException("Assertion failed: " + message); 
} 

Et affirmer comme si, en supposant que la méthode est définie dans une classe appelée Util:

Util.Assert(a == b, "a == b"); 

appels à cette méthode ne sera émis par le compilateur lorsque le symbole DEBUG est défini, grâce à l'attribut ConditionalAttribute. Vous n'avez donc pas besoin d'inclure ces appels dans les directives #if. Cela entraînera moins d'encombrement de code.

(Notez que la méthode elle-même sera toujours compilé. Cela vous permet d'utiliser de telles méthodes dans les différentes assemblées!)

+1

Les contrats de code ne fonctionnent-ils pas de la même manière? J'ai eu l'idée que vous pouviez les désactiver complètement en mode Release, ou quelque chose comme ça. –

+0

Peut-être. Honnêtement, je ne le connais pas. La technique dans ma réponse est celle que j'utilise, alors j'ai pensé que je la partagerais. Je ne peux pas dire si c'est meilleur ou pire que les contrats de code. – cdhowie

+0

J'irais avec ce que cdhowie dit. contrat de code offrent beaucoup plus mais probablement pas ce dont vous avez besoin dans votre cas. Je pense donc que le bon outil utilise des méthodes décorées avec l'attribut Conditional plutôt que inline # if, # else ou Debug.Asset() encombrant votre code inline. –

0

L'avantage de #if/#endif est que non seulement l'appel à la fonction assert éliminé, mais aussi tout le travail préparant ses paramètres (qui, espérons-le, n'ont pas d'effets secondaires ...).

+2

Même chose avec '[Conditionnel (...)]'. – cdhowie