Il modo migliore per affermare pre-condizione e post-condizione di argomenti e valori in .NET?

StackOverflow https://stackoverflow.com/questions/155422

  •  03-07-2019
  •  | 
  •  

Domanda

Ultimamente ho pensato al design per contratto e mi chiedevo quale fosse la gente il modo migliore per affermare i valori pre-condizione e post-condizione in .NET? vale a dire convalida dei valori degli argomenti in un metodo.

Alcune persone raccomandano Debug.Assert mentre altre parlano dell'uso di un'istruzione if e del lancio di un'eccezione. Quali sono i pro e i contro di ciascuno?

Quali framework sono disponibili che consigliate?

È stato utile?

Soluzione

Alla fine utilizzeremo i Contratti di codice quando verrà distribuito .NET 4.0. Tuttavia, nel nostro codice di produzione in questo momento abbiamo avuto un grande successo con un "Guard" " classe insieme al modo comune di generare eccezioni.

Per maggiori dettagli, vedi il mio post su questo .

Altri suggerimenti

Un'altra opzione è Spec # .

Spec # è un'estensione del linguaggio C # orientato agli oggetti. Estende il sistema dei tipi per includere tipi non nulli ed eccezioni verificate. Fornisce contratti di metodo sotto forma di pre e postcondizioni, nonché invarianti di oggetti.

Preferisco le eccezioni rispetto alle asserzioni perché se si suppone che sia così e non lo sia, voglio conoscerlo in modo da poterlo risolvere e la copertura che otteniamo in modalità debug non è affatto vicina all'utilizzo o alla copertura della vita reale , quindi basta usare Debug.Assert non fa abbastanza.

L'uso degli assert significa che non aggiungerai gonfiore al tuo codice di rilascio, ma significa solo vedere quando e perché questi contratti vengono infranti se li catturi in una build di debug.

L'uso delle eccezioni significa che il contratto si interrompe ogni volta che succede, debug o rilascio, ma significa anche che la build di rilascio contiene più controlli e codice.

È possibile utilizzare un approccio intermedio e utilizzare Traccia per tracciare le condizioni pre e post in un tipo di registro dell'applicazione, che è possibile utilizzare per eseguire il debug dei problemi. Tuttavia, avresti bisogno di un modo per raccogliere questi registri per sapere quali problemi stanno riscontrando i tuoi utenti. Esiste anche la possibilità di combatterlo con eccezioni in modo da ottenere eccezioni per i problemi più gravi.

Il modo in cui lo vedo, però, è che se vale la pena far rispettare il contratto, vale la pena lanciare un'eccezione quando si rompe. Penso che sia in qualche modo dovuto all'opinione e all'applicazione target. Se si generano eccezioni, probabilmente si desidera una qualche forma di sistema di segnalazione degli incidenti che fornisca segnalazioni sugli arresti anomali quando le eccezioni sollevate vengono lasciate non gestite.

Puoi dare un'occhiata al framework fluente su http://conditions.codeplex.com/ È open source e gratuito.

Spec # è il modo di farlo, che è un superset di C #. Ora hai " Contratti di codice " ;, che è la lingua- versione agnostica di Spec #, quindi ora puoi avere contratti di codice in VB.NET, per esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top