Domanda

Sto eseguendo il debug con punti di interruzione e realizzo la chiamata di asserzione? Ho pensato che fosse solo per i test unitari. Cosa fa di più del breakpoint? Dal momento che posso interrompere il punto di interruzione, perché dovrei usare Assert?

È stato utile?

Soluzione

In una compilazione di debug, Assert accetta una condizione booleana come parametro e mostra la finestra di dialogo di errore se la condizione è falsa. Il programma procede senza alcuna interruzione se la condizione è vera.

Se compili in Release, tutti i Le Debug.Assert vengono automaticamente escluse.

Altri suggerimenti

Da Codice completo

  

8 Programmazione difensiva

     

8.2 Asserzioni

     

Un'asserzione è il codice utilizzato durante lo sviluppo, in genere una routine   o macro: che consente a un programma di controllarsi mentre viene eseguito. Quando un   l'affermazione è vera, ciò significa che tutto funziona come previsto.   Quando è falso, significa che ha rilevato un errore imprevisto nel file   codice. Ad esempio, se il sistema presuppone che le informazioni sui clienti   il file non avrà mai più di 50.000 record, il programma potrebbe   contiene un'asserzione che il numero di record è inferiore o uguale   a 50.000. Finché il numero di record è inferiore o uguale a   50.000, l'asserzione sarà silenziosa. Se incontra più di   50.000 registrazioni, tuttavia, "asseriranno" fortemente che esiste un   errore nel programma.

     

Le asserzioni sono particolarmente utili in programmi complessi e di grandi dimensioni   in programmi ad alta affidabilità. Consentono ai programmatori di farlo più rapidamente   eliminare ipotesi di interfaccia non corrispondenti, errori che si insinuano quando il codice viene modificato e così via.

     

Un'asserzione di solito prende due argomenti: un'espressione booleana che   descrive il presupposto che dovrebbe essere vero e un messaggio a   visualizza se non lo è.

     

(...)

     

Normalmente, non si desidera che gli utenti visualizzino i messaggi di asserzione   codice di produzione; le affermazioni sono principalmente da utilizzare durante lo sviluppo   e manutenzione. Le asserzioni sono normalmente compilate nel codice all'indirizzo   tempo di sviluppo e compilato fuori dal codice per la produzione. Durante   lo sviluppo, le asserzioni eliminano le ipotesi contraddittorie,   condizioni impreviste, valori errati passati alle routine e così via.   Durante la produzione, vengono compilati fuori dal codice in modo che il file   le affermazioni non peggiorano le prestazioni del sistema.

Dovresti usarlo per i momenti in cui non vuoi spezzare ogni piccola riga di codice per controllare le variabili, ma vuoi ottenere una sorta di feedback se sono presenti determinate situazioni, ad esempio:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");

Assert ti offre anche un'altra opportunità di ridere delle capacità di progettazione dell'interfaccia utente di Microsoft. Voglio dire: una finestra di dialogo con tre pulsanti Annulla, Riprova, Ignora e una spiegazione su come interpretarli nella barra del titolo!

Assert ti consente di affermare che nel tuo codice si applica una condizione (post o pre). È un modo per documentare le tue intenzioni e fare in modo che il debugger ti informi con una finestra di dialogo se le tue intenzioni non sono soddisfatte.

A differenza di un punto di interruzione, l'Assert si accompagna al tuo codice e può essere utilizzato per aggiungere ulteriori dettagli sulla tua intenzione.

Assert può aiutarti a fornire un comportamento di messaggistica separato tra test e rilascio. Ad esempio,

Debug.Assert (x > 2)

attiverà una pausa solo se stai eseguendo un " debug " build, non una build di rilascio. C'è un esempio completo di questo comportamento qui

Innanzitutto il metodo Assert () è disponibile per le classi Trace e Debug .
Debug.Assert () viene eseguito solo in modalità Debug.
Trace.Assert () è in esecuzione in modalità Debug and Release.

Ecco un esempio:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

Esegui questo codice in modalità Debug e quindi in modalità Rilascio.

 inserisci qui la descrizione dell'immagine

Noterai che durante la modalità Debug il tuo codice Debug.Assert fallisce, otterrai una finestra di messaggio che mostra la traccia dello stack corrente dell'applicazione. Ciò non accade in modalità Rilascio poiché la condizione Trace.Assert () è vera (i == 4) .

Il metodo

WriteLine () ti dà semplicemente la possibilità di registrare le informazioni nell'output di Visual Studio. inserisci qui la descrizione dell'immagine

Il modo in cui penso a questo è Debug.Assert è un modo per stabilire un contratto su come dovrebbe essere chiamato un metodo, concentrandosi su dettagli specifici sui valori di un parametro (anziché solo sul tipo). Ad esempio, se non si prevede di inviare un valore nullo nel secondo parametro, aggiungere l'Assert attorno a quel parametro per dire al consumatore di non farlo.

Impedisce a qualcuno di utilizzare il codice in modo ossuto. Ma permette anche a quel modo spericolato di passare alla produzione e non dare il cattivo messaggio a un cliente (supponendo che tu costruisca una build di rilascio).

Le asserzioni sono fortemente presenti in Design by Contract (DbC) che, a quanto ho capito, è stato introdotto / approvato da Meyer, Bertand. 1997. Contruction software orientato agli oggetti.

Una caratteristica importante è che non devono produrre effetti collaterali, ad esempio è possibile gestire un'eccezione o intraprendere un'azione diversa con un'istruzione if (programmazione difensiva).

Le asserzioni vengono utilizzate per verificare le condizioni pre / post del contratto, il rapporto cliente / fornitore - il cliente deve assicurarsi che siano soddisfatte le condizioni preliminari del fornitore, ad es. invia £ 5 e il fornitore deve assicurarsi che siano soddisfatte le condizioni postali, ad es. consegna 12 rose. (Solo una semplice spiegazione del cliente / fornitore - può accettare di meno e fornire di più, ma riguardo alle asserzioni). C # introduce anche Trace.Assert (), che può essere utilizzato per il codice di rilascio.

Per rispondere alla domanda sì, sono ancora utili, ma possono aggiungere complessità + leggibilità a codice e tempo + difficilmente da mantenere. Dovremmo ancora usarli? Sì, Li useremo tutti? Probabilmente no, o nella misura in cui descrive Meyer.

(Anche il corso OU Java su cui ho appreso questa tecnica mostrava solo semplici esempi e il resto del codice non applicava le regole di asserzione DbC sulla maggior parte del codice, ma si presumeva fosse usato per assicurare la correttezza del programma!)

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