Quando le asserzioni dovrebbero rimanere nel codice di produzione? [chiuso]


166

C'è una discussione in corso su comp.lang.c ++. Moderata sull'opportunità che le asserzioni, che in C ++ esistono solo nelle build di debug per impostazione predefinita, debbano essere mantenute nel codice di produzione o meno.

Ovviamente, ogni progetto è unico, quindi la mia domanda qui non è tanto se le affermazioni debbano essere mantenute, ma in quali casi è consigliabile / non è una buona idea.

Per affermazione, intendo:

  • Un controllo di runtime che verifica una condizione che, se falsa, rivela un bug nel software.
  • Un meccanismo mediante il quale il programma viene interrotto (forse dopo un lavoro di pulizia davvero minimo).

Non sto necessariamente parlando di C o C ++.

La mia opinione è che se sei il programmatore, ma non possiedi i dati (come nel caso della maggior parte delle applicazioni desktop commerciali), dovresti tenerli attivi, perché un'asserzione fallita mostra un bug e non dovresti andare con un bug, con il rischio di corrompere i dati dell'utente. Questo ti costringe a testare con forza prima della spedizione e rende più visibili i bug, quindi più facili da individuare e correggere.

Qual è la tua opinione / esperienza?

Saluti,

Carl

Vedi la domanda correlata qui


Risposte e aggiornamenti

Ehi Graham,

Un'affermazione è un errore, pura e semplice e quindi dovrebbe essere gestita come una. Dal momento che un errore dovrebbe essere gestito in modalità di rilascio, non hai davvero bisogno di asserzioni.

Ecco perché preferisco la parola "bug" quando parlo di asserzioni. Rende le cose molto più chiare. Per me, la parola "errore" è troppo vaga. Un file mancante è un errore, non un bug, e il programma dovrebbe gestirlo. Cercare di dereferenziare un puntatore nullo è un bug e il programma dovrebbe riconoscere che qualcosa ha un cattivo odore.

Pertanto, è necessario testare il puntatore con un'asserzione, ma la presenza del file con il normale codice di gestione degli errori.


Leggero fuori tema, ma un punto importante nella discussione.

Come avvertimento, se le tue affermazioni si infrangono nel debugger quando falliscono, perché no. Ma ci sono molte ragioni per cui un file potrebbe non esistere completamente al di fuori del controllo del tuo codice: diritti di lettura / scrittura, disco pieno, dispositivo USB scollegato, ecc. Dato che non hai il controllo su di esso, penso che le affermazioni siano non è il modo giusto di affrontarlo.

Carl


Tommaso,

Sì, ho il codice completo e devo dire che non sono assolutamente d'accordo con quel particolare consiglio.

Supponi che l'allocatore di memoria personalizzato si rovini e azzeri un pezzo di memoria ancora utilizzato da qualche altro oggetto. Mi capita di azzerare un puntatore che questo oggetto dereferenzia regolarmente e uno degli invarianti è che questo puntatore non è mai nullo e hai un paio di affermazioni per assicurarti che rimanga tale. Cosa fai se il puntatore è improvvisamente nullo. Hai solo () intorno, sperando che funzioni?

Ricorda, stiamo parlando del codice prodotto qui, quindi non è possibile entrare nel debugger e ispezionare lo stato locale. Questo è un vero bug sul computer dell'utente.

Carl


3
C'è un interessante post correlato al Software Engineering SE (anche se la discussione è focalizzata sul c ++): Dovrebbero esserci affermazioni nelle build di rilascio
sonny

Risposte:


84

Le asserzioni sono commenti che non diventano obsoleti. Documentano quali stati teorici sono previsti e quali stati non dovrebbero verificarsi. Se il codice viene modificato in modo da consentire la modifica degli stati, lo sviluppatore viene presto informato e deve aggiornare l'asserzione.


16
@jkschneider: i test unitari servono per testare le cose nell'ambito del codice del programma. le asserzioni servono a garantire che le assunzioni su cui si basa il codice siano effettivamente vere nella realtà, prima che il codice continui a essere elaborato in base a tali assunzioni. Sono "documentazione" nel senso che, se si rivelano non essere il caso, il programma si interromperà, affermerà l'assunzione e indicherà che l'assunzione non ha resistito. Naturalmente puoi anche leggere l'affermazione come documentazione di ciò nel codice.

2
Questa è la risposta migliore perché si riferisce alle affermazioni ai commenti, che è un modo utile di pensarci. Sono un passo avanti rispetto ai commenti perché sono costantemente testati a macchina durante lo sviluppo, ma dovrebbero sempre essere significativi prima per i lettori umani. Proprio come i commenti, non dovrebbero far parte della logica o dell'esecuzione finale. Proprio come i commenti, puoi lasciarli o eliminarli a seconda che la lingua sia compilata o interpretata, i tuoi piani di implementazione, la strategia di offuscamento, ecc. Ho visto un caso in cui un commento ha effettivamente causato un bug, ma quello era uno strano.
DaveWalley,

1
Più specificamente, le asserzioni sono informative e non funzionali . Un'affermazione di per sé non ha alcun effetto sul flusso o sui risultati del programma. D'altra parte, un'eccezione altera il flusso del programma e quindi i risultati.
yoyo

59

Consentitemi di citare il codice completo di Steve McConnell. La sezione sulle asserzioni è 8.2.

Normalmente, non si desidera che gli utenti vedano i messaggi di asserzione nel codice di produzione; le affermazioni servono principalmente durante lo sviluppo e la manutenzione. Le asserzioni vengono normalmente compilate nel codice in fase di sviluppo e compilate fuori dal codice per la produzione.

Tuttavia, più avanti nella stessa sezione, viene fornito questo consiglio:

Per un codice altamente affidabile, asserire e quindi gestire l'errore comunque.

Penso che fintanto che le prestazioni non sono un problema, lasciate l'asserzione, ma piuttosto che visualizzare un messaggio, fatelo scrivere in un file di registro. Penso che il consiglio sia anche in Codice completo, ma non lo trovo in questo momento.


7
Penso che la seconda citazione da Code Complete sia che dovresti avere l'asserzione - che verrà compilata nel codice di produzione - e dovresti anche avere "if (! Condition) {AttemptGracefulRecovery ();}", cioè don lasciare che la violazione degli invarianti del programma blocchi il programma.
yoyo

34

Lascia le asserzioni attivate nel codice di produzione, a meno che tu non abbia misurato che il programma funziona in modo significativamente più veloce con quelle disattivate.

se non vale la pena misurarlo per dimostrare che è più efficiente, non vale la pena sacrificare la chiarezza per una scommessa da esibizione ". - Steve McConnell 1993

http://c2.com/cgi/wiki?ShipWithAssertionsOn


11
In realtà, la cosa peggiore che succede è quando il codice si blocca a causa di qualcosa che NON è un'affermazione. Se il codice si bloccherà definitivamente in seguito con una probabilità del 100%, l'asserzione deve essere assolutamente lì. Se deref un puntatore, allora devi implicitamente affermare che non è null prima. Se dividi per un numero, affermi che non è zero. Elimina le asserzioni e tutte le posizioni degli arresti anomali sono SENZA DOCUMENTI. Il vero problema non è strutturare il programma in modo che i sottosistemi si blocchino e vengano riavviati da un cane da guardia.
Rob,

5
assert ref != null;è diverso da if (ref == null) throw new IllegalArgumentException();Non dovresti usare il primo per precondizioni che potrebbero essere false. Devi usare assertcose che non possono essere false. Esempio, int i = -1 * someNumber; i = i * i;poi più tardi per ricordare alle persone che iè positivo,assert i > 0;
Captain Man

1
"In realtà, la cosa peggiore che succede è quando il codice si arresta in modo anomalo a causa di qualcosa che NON è un'asserzione. Se il codice si bloccherà definitivamente in seguito con una probabilità del 100%, l'asserzione deve essere assolutamente lì." - questa è una falsa dicotomia.
Rob Grant

2
@RobertGrant: per molti programmi, l'arresto anomalo è tutt'altro che la cosa peggiore che possa accadere. Per un programma che dovrebbe verificare la solidità di un progetto di un edificio o di un ponte, riferire erroneamente che un progetto è valido può essere la cosa peggiore che potrebbe fare. Per un programma esposto al mondo esterno ma che ha accesso in sola lettura a dati riservati, la perdita di tali dati potrebbe essere peggiore di qualsiasi altra cosa il programma potrebbe fare. L'idea che un incidente senza un'indicazione significativa della causa sia "la cosa peggiore che potrebbe accadere" ignora molti pericoli che sono molto peggio.
supercat

@supercat Non ero d'accordo con il commento che stavo citando.
Rob Grant,

21

Se stai anche pensando di lasciare affermazioni in produzione, probabilmente stai pensando a loro in modo sbagliato. Il punto centrale delle affermazioni è che è possibile disattivarle durante la produzione, perché non fanno parte della soluzione. Sono uno strumento di sviluppo, utilizzato per verificare che i tuoi presupposti siano corretti. Ma nel momento in cui entri in produzione, dovresti già avere fiducia nei tuoi presupposti.

Detto questo, c'è un caso in cui accenderò le asserzioni in produzione: se incontriamo un bug riproducibile in produzione che stiamo facendo fatica a riprodurre in un ambiente di test, può essere utile riprodurre il bug con asserzioni attivate in produzione, per vedere se forniscono informazioni utili.

Una domanda più interessante è questa: nella fase di test, quando disattivi le affermazioni?


4
Penso che le asserzioni non debbano mai essere incluse nel codice di produzione. le asserzioni NON sono errori, sono progettate per gli sviluppatori. Le asserzioni dovrebbero vivere solo nel codice di prova. Avere un arresto anomalo dell'app è a causa e l'asserzione fallisce in uno sviluppo inaccettabile e trascurato. Gli sviluppatori devono fare il possibile per gestire gli errori con grazia.
Iksnae,

9
Se è inevitabile che ti arresti in modo anomalo dato un puntatore nullo passato in un fn; non c'è scelta di affrontarlo in modo esplicito. O hai un modo di gestire con garbo la condizione (perché può provenire dall'input proveniente dal mondo esterno), oppure ti schianti in una posizione DOCUMENTATA con un'affermazione, piuttosto che in un punto casuale che potrebbe aver corrotto le cose lungo la strada. tuttavia, la modalità di gestione dell'asserzione dovrebbe essere una decisione per modulo. Forse il tuo watchdog riavvia il processo, oppure cancelli un pezzo di memoria per quel modulo per resettarlo allo stato iniziale (oggetto software "reboot").
Rob,

1
Penso che questa sia una visione limitata dell'uso delle asserzioni. Registro sempre le asserzioni sia su console che su cloud storage e le lascio in produzione. Lasciare affermazioni su conferma che le mie ipotesi rimangono corrette anche nel codice di produzione e nell'uso della produzione. Solo perché il codice è stato eseguito con successo alcune volte nel debug con assert su non significa che gli utenti non troveranno un modo per passare valori diversi attraverso lo stesso percorso di codice.
SafeFastExpressive

Il punto centrale della dichiarazione di asserzione è che puoi attivare o disattivare i controlli. Se li lasci in produzione, perché usare la dichiarazione di asserzione?
MiguelMunoz,

1
Le asserzioni spesso rallentano il sistema. Poiché non sono progettati per la produzione, sono liberi di essere lenti e inefficienti, il che potrebbe essere necessario per eseguire determinati test. Ad esempio, una volta Microsoft ha aggiunto a Excel una funzionalità di ricalcolo rapido. Quando una cella è cambiata, questa funzione ha limitato il ricalcolo solo alle celle che ne avevano bisogno. Lo hanno testato con un'affermazione che ha ricalcolato l'intero foglio di calcolo e confrontato i risultati. Ciò ha reso la versione di sviluppo molto lenta, ma ha anche eliminato molti bug. Quando hanno rilasciato questa funzione, si è rivelato molto affidabile.
MiguelMunoz,

16

Le asserzioni non dovrebbero mai rimanere nel codice di produzione. Se una particolare asserzione sembra che potrebbe essere utile nel codice di produzione, allora non dovrebbe essere una asserzione; dovrebbe essere un controllo di errore fase di esecuzione, vale a dire qualcosa di codice come questo: if( condition != expected ) throw exception.

Il termine "asserzione" significa "un controllo del solo tempo di sviluppo che non verrà eseguito sul campo".

Se inizi a pensare che le asserzioni potrebbero arrivare sul campo, allora inevitabilmente inizierai anche a fare altri pensieri pericolosi, come chiederti se vale davvero la pena dare una determinata asserzione. Non vi è alcuna affermazione che non valga la pena di fare. Non dovresti mai chiederti "dovrei affermarlo o no?" Dovresti solo chiederti "C'è qualcosa che ho dimenticato di affermare?"


6

A meno che la profilazione non mostri che le asserzioni stanno causando problemi di prestazioni, dico che dovrebbero rimanere anche nella versione di produzione.

Tuttavia, penso che ciò richieda anche che tu gestisca i fallimenti delle asserzioni in modo piuttosto elegante. Ad esempio, dovrebbero tradursi in un tipo generale di finestra di dialogo con l'opzione di segnalare (automaticamente) il problema agli sviluppatori e non semplicemente chiudere o arrestare il programma. Inoltre, dovresti stare attento a non usare le asserzioni per le condizioni che in realtà permetti, ma possibilmente non ti piacciono o consideri indesiderate. Tali condizioni dovrebbero essere gestite da altre parti del codice.


A mio avviso, lo scopo principale di un'asserzione di produzione è come un backstop di emergenza: consentire al programma di proseguire è molto probabile che provochi un danno sufficientemente grave da impedirlo è più importante di qualsiasi altra cosa il programma potrebbe fare. Avere un buon messaggio di errore sarebbe bello, se possibile, ma è solo di secondaria importanza.
supercat

5

Nel mio C ++ definisco REQUIRE (x) che è come assert (x) tranne per il fatto che genera un'eccezione se l'asserzione fallisce in una build di rilascio.

Poiché un'asserzione non riuscita indica un bug, dovrebbe essere trattata seriamente anche in una build di rilascio. Quando le prestazioni del mio codice sono importanti, userò spesso REQUIRE () per un codice di livello superiore e assert () per un codice di livello inferiore che deve essere eseguito rapidamente. Uso anche REQUIRE invece di affermare se la condizione di errore potrebbe essere causata da dati trasmessi dal codice scritto da una terza parte o dalla corruzione dei file (in modo ottimale progetterei il codice specificamente per comportarsi bene in caso di corruzione dei file, ma noi non sempre ho tempo per farlo.)

Dicono che non dovresti mostrare quei messaggi di asserzione agli utenti finali perché non li capiranno. Così? Gli utenti finali possono inviarti un'e-mail con una schermata o del testo del messaggio di errore, che ti aiuta a eseguire il debug. Se l'utente dice semplicemente "si è bloccato", hai meno possibilità di risolverlo. Sarebbe meglio inviarti automaticamente i messaggi di errore di asserzione su Internet, ma questo funziona solo se l'utente ha accesso a Internet e puoi ottenere il suo permesso.


Dicono anche che non dovresti mostrare quei messaggi di asserzione agli hacker perché sono indizi preziosi per irrompere.
DaveWalley

4

Se si desidera mantenerli, sostituirli con la gestione degli errori. Niente di peggio di un programma che sta scomparendo. Non vedo nulla di male nel trattare alcuni errori come bug gravi, ma dovrebbero essere indirizzati a una sezione del programma che è attrezzata per gestirli raccogliendo, registrandoli e informando l'utente che la tua app ha avuto delle condizioni indesiderate e sta uscendo.


2

A condizione che vengano gestiti proprio come qualsiasi altro errore, non vedo alcun problema. Tieni presente, tuttavia, che le asserzioni non riuscite in C, come con altre lingue, usciranno semplicemente dal programma, e questo di solito non è sufficiente per i sistemi di produzione.

Esistono alcune eccezioni: PHP, ad esempio, ti consente di creare un gestore personalizzato per errori di asserzione in modo da poter visualizzare errori personalizzati, effettuare registrazioni dettagliate, ecc. Invece di uscire.


2

Il nostro software per database server contiene affermazioni sia di produzione che di debug. Le asserzioni di debug sono proprio questo: vengono rimosse nel codice di produzione. Le asserzioni di produzione si verificano solo se (a) esiste una condizione che non dovrebbe mai esistere e (b) non è possibile recuperare in modo affidabile da questa condizione. Un'asserzione di produzione indica che si è verificato un errore nel software o si è verificato un tipo di danneggiamento dei dati.

Poiché si tratta di un sistema di database e stiamo archiviando dati potenzialmente importanti per l'azienda, facciamo tutto il possibile per evitare dati corrotti. Se esiste una condizione che potrebbe indurci a memorizzare dati errati, affermiamo immediatamente, ripristiniamo tutte le transazioni e arrestiamo il server.

Detto questo, cerchiamo anche di evitare asserzioni di produzione in routine critiche per le prestazioni.


5
Definirei "asserzione di produzione" una "eccezione" e la codificherei come tale.
DaveWalley,

1
Probabilmente hai ragione, ma il prodotto è stato originariamente scritto in C. Anche quando lo abbiamo cambiato in C ++, i compilatori che abbiamo usato su alcune delle nostre piattaforme non supportavano correttamente le eccezioni. Gran parte del vecchio codice non è stato riscritto in C ++, quindi queste asserzioni sono ancora utilizzate.
Graeme Perrow,

1

Vedo asserzioni come test unitari in linea. Utile per un test rapido durante lo sviluppo, ma alla fine quelle affermazioni dovrebbero essere rifatte da essere testate esternamente in test unitari.


Asserire: dichiarare un fatto o una convinzione. Non sono per il test (solo), ma per affermare ciò che pensi sia vero (cioè i tuoi presupposti), in modo che il tuo programma non continui se i tuoi presupposti sono sbagliati per qualche motivo. Ad esempio, questo è un uso valido delle asserzioni: assert (pow (1,0) <1). Non è davvero un posto adatto per il controllo degli errori, perché se ciò non fosse vero, allora praticamente tutta la matematica moderna è sbagliata e ... beh, come inizieresti a gestirlo? Gestire tale presupposto errato non rientra nell'ambito del programma; lo prendi per fede. Ma tu lo verifica, comunque.

1

Trovo che sia meglio gestire tutti gli errori che rientrano nell'ambito e utilizzare le asserzioni per le ipotesi che stiamo affermando SONO vere.

cioè, se il tuo programma sta aprendo / leggendo / chiudendo un file, non essere in grado di aprire il file è nell'ambito - è una possibilità reale, che sarebbe negligente da ignorare, in altre parole. Quindi, dovrebbe avere un codice di controllo degli errori associato ad esso.

Tuttavia, supponiamo che fopen () sia documentato come sempre restituendo un handle di file aperto e valido. Si apre il file e lo si passa alla funzione readfile ().

Quella funzione di readfile, in questo contesto, e probabilmente secondo le sue specifiche di progettazione, può praticamente supporre che otterrà un file ptr valido. Pertanto, sarebbe inutile aggiungere un codice di gestione degli errori per il caso negativo, in un programma così semplice. Tuttavia, dovrebbe almeno documentare l'assunto, in qualche modo - assicurarsi in qualche modo - che questo sia effettivamente il caso, prima di continuare la sua esecuzione. NON dovrebbe REALMENTE presumere che sarà sempre valido, nel caso in cui venga chiamato in modo errato, o sia copiato / incollato in qualche altro programma, ad esempio.

Quindi, readfile () {assert (fptr! = NULL); ..} è appropriato in questo caso, mentre la completa gestione degli errori non lo è (ignorando il fatto che la lettura effettiva del file richiederebbe comunque un sistema di gestione degli errori).

E sì, quelle affermazioni dovrebbero rimanere nel codice di produzione, a meno che non sia assolutamente necessario disabilitarle. Anche allora, probabilmente dovresti disabilitarli solo nelle sezioni critiche per le prestazioni.


1

Supponiamo che un pezzo di codice sia in produzione e colpisca un'asserzione che normalmente verrebbe attivata. L'asserzione ha trovato un bug! Tranne il contrario, perché l'affermazione è disattivata.

Quindi cosa succede adesso? O il programma (1) si arresterà in modo non informativo in un punto ulteriormente rimosso dalla fonte del problema o (2) funzionerà allegramente fino al completamento, probabilmente dando il risultato sbagliato.

Nessuno dei due scenari è invitante. Lascia le asserzioni attive anche in produzione.


0

Raramente uso asserzioni per qualsiasi altra cosa che compili il controllo del tipo di tempo. Vorrei usare un'eccezione anziché un'asserzione solo perché la maggior parte delle lingue sono costruite per gestirle.

Offro un esempio

file = create-some-file();
_throwExceptionIf( file.exists() == false, "FILE DOES NOT EXIST");

contro

file = create-some-file();
ASSERT(file.exists());

In che modo l'applicazione gestirà l'affermazione? Preferisco il vecchio try catchmetodo di gestione degli errori fatali.


2
Le eccezioni sono per situazioni insolite che ti aspetti di incontrare in un'applicazione funzionante, come nel tuo esempio qui. Le asserzioni riguardano situazioni che non ti aspetti di incontrare. Quindi, se li incontri, ci deve essere un bug nel tuo codice. Nel tuo esempio, e l'eccezione è chiaramente l'approccio giusto. Ma le affermazioni sono ancora molto utili per catturare i bug.
MiguelMunoz,

0

Il più delle volte, quando uso l'asserzione in java (la parola chiave assert), aggiungo automaticamente alcuni codici di produzione dopo. Secondo il caso, può essere un messaggio di registrazione, un'eccezione ... o niente.

Secondo me, tutte le tue affermazioni sono fondamentali nella versione dev, non nella produzione relase. Alcuni devono essere tenuti, altri devono essere scartati.


0

Le asserzioni non sono errori e non devono essere gestite come errori. Quando viene lanciata un'asserzione, ciò significa che c'è un bug nel tuo codice o in alternativa nel codice che chiama il tuo codice.

Vi sono alcuni punti da evitare per abilitare le asserzioni nel codice di produzione: 1. Non si desidera che l'utente finale visualizzi un messaggio del tipo "ASSERZIONE non riuscita MyPrivateClass.cpp riga 147. L'utente finale NON è un ingegnere addetto al controllo qualità. 2. L'ASSERENZA potrebbe influenza le prestazioni

Tuttavia, esiste un motivo valido per abbandonare le asserzioni: ASSERTION potrebbe influenzare le prestazioni e i tempi, e purtroppo questo a volte è importante (specialmente nei sistemi embedded).

Tendo a votare per aver lasciato l'affermazione nel codice di produzione ma assicurandomi che queste stampe non siano esposte all'utente finale.

~ Yitzik


No, le asserzioni sono per fatti supposti. Se il nostro codice restituisce 27 quando si presume che restituirà SEMPRE 25, il problema potrebbe anche essere un bug nei nostri presupposti fisici sull'universo: forse quei due bit sono passati al valore 5 possibile, per la prima volta nella storia dell'informatica. L'asserzione è lì per confermare che il codice funziona ancora in base alle ipotesi per cui è stato scritto. Se la fisica esce dalla finestra, il tuo codice dovrebbe notare, lasciare l'unità sola e uscire mentre è avanti;) Sì, non è un errore nel codice e che tipo di gestione degli errori potresti fare?

Consenti a me di affinare la mia opinione: 1. L'asserzione controlla le nostre assunzioni. Se i nostri presupposti sono sbagliati, significa che c'è un bug nel nostro codice. 2. Il nostro codice non dovrebbe far valere l'utilizzo del nostro codice. cioè una funzione non dovrebbe fallire sull'asserzione se qualcosa è sbagliato nell'input dell'utente. Restituiremo l'errore e l'utente dovrebbe gestirlo (può affermare il successo) 3. Preferisco lasciare l'asserzione nella produzione - ma il comportamento sarà probabilmente modificato. Sono d'accordo che non esiste una gestione degli errori appropriata. Asserzione non riuscita == bug .. ma il sistema potrebbe riavviarsi da solo invece di arrestarsi e attendere il riavvio.
Yitshak Yarom il

1
non significa NECESSARAMENTE che c'è un bug. Ad esempio, molti dei progetti in cui sono coinvolto includono un elenco di fatti ipotizzati nella documentazione. Quelle ipotesi sono lì per proteggere il codice degli sviluppatori dall'essere chiamato buggy, quando gli uomini d'affari potrebbero aver detto loro la cosa sbagliata o quando non sono disponibili informazioni da terze parti su particolari variabili, per esempio. Le asserzioni possono essere utilizzate per verificare che il programma debba / non debba essere eseguito, che i sistemi di terze parti siano corretti, non solo se l'IT sia corretto.

-8

Un'affermazione è un errore, pura e semplice e quindi dovrebbe essere gestita come una.

Dal momento che un errore dovrebbe essere gestito in modalità di rilascio, non hai davvero bisogno di asserzioni.

Il vantaggio principale che vedo per le asserzioni è un'interruzione condizionale: sono molto più facili da configurare rispetto al perforare le finestre di VC per impostare qualcosa che richiede 1 riga di codice.


2
L'uso delle asserzioni come punti di interruzione condizionati è davvero fastidioso per diversi motivi. La cosa più importante è che queste affermazioni confondono gli altri sviluppatori nel team: come potrebbero sapere se si tratta di un errore quando viene asserita tale affermazione o se qualcuno ha lasciato il suo punto di interruzione condizionale nel codice?
lego,

Non ci sarebbe se le asserzioni non fossero nel codice in primo luogo. E se li stessi usando per monitorare il codice, li vedresti (a meno che tu non li stia controllando nell'albero dei sorgenti). Ho lavorato in posti che hanno praticamente praticamente tutto. Dover fare clic circa 60 volte all'inizio del programma perché il server della documentazione di aiuto non è disponibile diventa noioso molto rapidamente.
graham.reeds
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.