2010-11-19 9 views
5

Attualmente sto sviluppando un piccolo framework AI (algoritmi genetici/reti neurali) in C#, per un progetto universitario.Come si asserisce nel codice algoritmico in .NET?

La mia prima preoccupazione è lo sviluppo di un framework riutilizzabile, quindi sto progettando tutto per essere piuttosto modulare. So che sto pagando un prezzo per questo (spettacolo), ma sento che ho più da guadagnare che da perdere con esso (preferibile avere il codice due volte più lento di dover perdere due volte tanto tempo dopo cercando di trovare impossibile trova bug e perdi un sacco di tempo cercando di aggiungere cose nuove che sono difficili da introdurre in un blocco di codice monolitico).

Mi piacerebbe avere un sacco di controlli su diverse parti del mio codice, asserzioni, in sostanza. Verifica se durante l'esecuzione del metodo XI sono effettivamente in uno stato corretto, ecc. Quelle tipologie di asserzioni sono utili quando si sviluppano, ma mi piacerebbe che stessero lontano dal codice di rilascio (cioè, quando deciderò che voglio andarmene questo lavoro per la notte per ottenere i miei risultati finali di ricerca).

posso vedere diversi modi di realizzare questo:

  1. System.Diagonists.Assert famiglia di metodi.
  2. Codice Contratti
  3. Avere se (x) poi gettare InvalidStateException() circondato da #if DEBUG/#endif

Come faresti e perché?

Sono anche a conoscenza dei Test di unità (li sto usando), ma mi piacerebbe anche avere qualche tipo di asserzione sul codice.

risposta

8

è possibile utilizzare un metodo statico come questo:

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

e affermare in questo modo, supponendo che il metodo è definito in una classe chiamata Util:

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

Le chiamate a questo metodo sarà solo emesso dal compilatore quando viene impostato il simbolo DEBUG, grazie all'Account Condizionale. Quindi non è necessario avvolgere tali chiamate in qualsiasi direttiva #if. Ciò condurrà a meno confusione di codice.

(Si noti che il metodo stesso verrà comunque compilato. Questo permette di utilizzare tali metodi in diversi assiemi!)

+1

I contratti con codice non funzionano in modo simile? Ho avuto l'idea che potessi spegnerli completamente in modalità Release, o qualcosa del genere. –

+0

Forse. Onestamente non ho familiarità con esso. La tecnica nella mia risposta è quella che uso, quindi ho pensato di condividerlo. Non posso dire se sia meglio o peggio dei Contratti di codice. – cdhowie

+0

Vorrei andare con quello che dice cdhowie. il contratto di codice offre molto di più ma probabilmente non è quello che ti serve nel tuo caso. Quindi penso che lo strumento giusto stia usando metodi decorati con l'attributo Conditional piuttosto che inline # if, # else o Debug.Asset() che ingombrano il tuo codice in linea. –

0

Il vantaggio di #if/#endif è che non solo è la chiamata alla funzione assert eliminato, ma anche tutto il lavoro che prepara i suoi parametri (che si spera non abbiano effetti collaterali ...).

+2

Lo stesso con '[Condizionale (...)]'. – cdhowie

Problemi correlati