Gestione dello scaffolding per build di debug e di produzione

2

Più programmo più mi rendo conto che la maggior parte del mio tempo è dedicato alla scrittura di scaffolding per i programmi in modo da poterli eseguire il debug e quindi rimuovere l'impalcatura per la produzione.

Il problema è che non ho trovato una lingua in cui l'idea di scaffolding sia una nozione incorporata. Idealmente voglio che lo scaffolding faccia parte del programma effettivo che viene rimosso per le distribuzioni di produzione invece di essere sezioni di codice che vengono commentate e non commentate ogni volta che eseguo il debug di un problema.

Un esempio di ciò di cui sto parlando in una pseudo-lingua inventata

def scaffold(f, *args)
  # ... pre condition verifications and state logging
  f(*args)
  # ... post condition verifications and state logging
end

@scaffold
def buggy_function(a, b, c)
  # ... some buggy code
end

Questo sembra un po 'come decoratori di pitone, ma la semantica è diversa. Quando si esegue in produzione @scaffold si dissolve letteralmente dall'AST e non si trova da nessuna parte. Alcuni di voi potrebbero obiettare che ho creato un tipo di sistema di tipo molto gonfiato e ad-hoc, ma non è proprio così. Darò un esempio da dimostrare.

Avevo scritto un parser per stringhe tra virgolette singole e doppie e stava fallendo da qualche parte nel mezzo dell'analisi di un'altra espressione. Il motivo per cui non funzionava era perché non stavo gestendo correttamente il caso vuoto ( '' ) e non sono a conoscenza di alcun sistema di tipi che sarebbe stato in grado di verificare la validità della macchina di stato per l'analizzatore di stringhe su verificare che il caso vuoto sia stato gestito correttamente. L'unico modo per scoprire questo sarebbe stato scrivere dei test e anche allora ottenere un caso di test ridotto avrebbe richiesto il tipo di ponteggio che dovevo mettere in atto per individuare il problema. Inoltre, puoi facilmente immaginare altri scenari in cui né il sistema di tipi né i test avrebbero colpito il bug.

Non ho trovato un buon modo per gestire il tipo di ponteggio di cui ho bisogno durante il debug e un modo semplice per liberarmene una volta terminato il debug. In che modo la gente di solito la gestisce?

    
posta davidk01 24.03.2015 - 05:56
fonte

2 risposte

3

Di gran lunga non sei il primo ad avere questo bisogno; molti altri hanno avuto prima di te, quindi c'è stato un bel po 'di ricerca sull'argomento, e una soluzione in quasi tutte le lingue decenti là fuori.

Per una discussione teorica, potresti dare un'occhiata a Programmazione per contratto, precondizioni, post-condizioni e invarianti . Include un elenco di lingue con supporto nativo per quella roba e anche un elenco di librerie di supporto di terze parti per le lingue che non hanno il supporto nativo.

Per quanto riguarda il rolling your riguarda:

(Perché a cosa serve se è "non inventato qui"?)

  • in C e C ++ hai #ifdef ;
  • in C # hai #if e anche l'attributo [Conditional] ;
  • in java hai la parola chiave assertion incorporata e anche il vecchio if() che, controllato da una costante, viene ottimizzato apparentemente.

Tutti questi meccanismi possono essere utilizzati per ottenere ciò che si desidera ottenere.

    
risposta data 24.03.2015 - 09:34
fonte
1

Alcune lingue (incluso Delphi, dove l'ho usato proprio per questo scopo) hanno il concetto di impostare variabili che possono essere controllate in fase di compilazione in modo da poter usare una direttiva "debug IFDEF" per circondare il codice dello scaffolding e definire / indefinire il debug opportunamente.

IIRC imposteresti le variabili in una finestra di dialogo a livello di programma.

Se la tua lingua è un po 'più manuale dovresti essere in grado di definire una variabile di "debug" subito e fare un controllo IFDEF per tutto il codice.

    
risposta data 24.03.2015 - 06:08
fonte

Leggi altre domande sui tag