2012-01-30 14 views
11

In precedenza ho visto una discussione su StackOverflow che ha avuto qualche discussione in merito, tuttavia non riesco a trovarla di nuovo!Uso di System.Diagnostics.Contract in build di versioni

Sono interessato a sapere se le classi System.Diagnostics.Contract devono essere utilizzate in "codice reale", ovvero una versione build del codice di produzione? Lo chiedo perché, in base alla descrizione dello spazio dei nomi, sembra che il contratto sia destinato al debug o ai fini dell'analisi.

Sembra una libreria utile in cui le condizioni di pre/post per la funzionalità sono importanti e può evitare un po 'di sforzo nello scrivere molti controlli if/then/else, quindi se questo è il caso, c'è un'alternativa in le librerie principali?

+1

Si prega di non prefisso i titoli con "C#" e così via. Ecco a cosa servono i tag. –

risposta

11

Sezione 5.1 (argomento di convalida e contratti) del documentation dettagli i tre principali modalità di utilizzo si potrebbe considerare di utilizzo di contratti: convalida

  1. argomento tramite contratti solo in build di debug, non in build di rilascio.
  2. Validazione anche nelle versioni Release.
  3. Convalida argomento personalizzata in build di versioni, contratti solo in build di debug.

Quindi esiste almeno una modalità di utilizzo in cui si utilizzano Contratti nelle versioni di Release, almeno per quanto riguarda la documentazione ufficiale.

Citazione:

Prima di iniziare a utilizzare i contratti nel proprio codice, è necessario fare alcune decisioni che le forme di influenza quello contratto da utilizzare per la convalida degli argomenti e dove (vedi figura 2). Nota che puoi prendere queste decisioni indipendentemente per ogni assembly gestito che produci (ogni progetto):

L'uso più semplice degli strumenti del contratto è se decidi che non è necessario eseguire la convalida degli argomenti in fase di runtime nelle versioni di rilascio (Utilizzo 1). In tal caso, si utilizzano gli strumenti del contratto durante lo sviluppo, ma non sui bit spediti. Ricorda, puoi spedire un assembly di riferimento del contratto insieme ai tuoi bit di release in modo che i client possano ottenere il controllo in fase di esecuzione delle convalide dei parametri sui loro build di debug tramite il controllo del sito di chiamata.

Il secondo approccio più semplice se è necessaria la convalida dell'argomento nella build di rilascio è di attivare la verifica del contratto in tutti i build (Uso 2). Approfitta quindi degli strumenti per produrre le stringhe di runtime delle tue condizioni e per eseguire l'ereditarietà del contratto per te. È possibile scegliere di produrre eccezioni specifiche per le convalide dei parametri o avere l'eccezione ContractException predefinita. Il rischio di utilizzare gli strumenti del contratto nel build di release è che dipendono da strumenti che non hanno raggiunto il livello di qualità della produzione.

La combinazione più difficile è quando si vuole la convalida degli argomenti in build di rilascio, ma si utilizza lo strumento del contratto per la fase di esecuzione il controllo solo nel build di debug, ma non nella build di rilascio (Uso 3). In tal caso, devi continuare a scrivere la convalida del tuo argomento nel modo in cui lo fai già, cioè usare le istruzioni if-then-throw (le chiamiamo legacy-richiede). Se si desidera che questi siano rilevabili dallo strumento, aggiungere altri contratti (come ad esempio Ensures) dopo di essi oppure utilizzare Contract.EndContractBlock(), se non sono presenti altri contratti. Si noti che poiché non si utilizzano gli strumenti di verifica del runtime nella build di rilascio, non si otterrà alcuna eredità dei contratti e sarà necessario ripetere manualmente la legacy, ovvero in base alle sostituzioni e alle implementazioni dell'interfaccia.Per i metodi di interfaccia e di astrazione, si ottiene comunque il massimo se si scrivono classi di contratto con richieste normali e si assicurano i moduli in modo da ottenere il controllo delle build di debug e compaiono negli assembly di riferimento del contratto e sono quindi visibili a progetti dipendenti e a controllori statici.

Questo suggerisce anche quale alternativa utilizzare solo le altre parti del framework: Il modo usuale di utilizzare se-poi-lanciare.

Problemi correlati