Come difendersi proattivamente dagli errori di omissione?

4

Prevedo questo con non so se qualcun altro che ha programmato fino a quando ho effettivamente questo problema, ma per lo meno, la risposta potrebbe aiutare qualcuno con meno xp.

Ho appena guardato questo codice per 5 minuti, pensando che stavo perdendo la testa che non funzionasse:

    var usedNames = new HashSet<string>();
    Func<string, string> l = (s) =>
        {
            for (int i = 0; ; i++)
            {
                var next = (s + i).TrimEnd('0');
                if (!usedNames.Contains(next))
                {
                    return next;
                }
            }
        };

Finalmente ho notato che ho dimenticato di aggiungere il nome usato al set di hash.

Allo stesso modo, ho dedicato minuti e minuti a omettere context.SaveChanges ().

Penso di essere così distratto dai dettagli a cui sto pensando che alcuni dettagli davvero piccoli diventano invisibili per me - è quasi al livello del blocco mentale.

Ci sono tattiche per impedirlo?

aggiornamento: un effetto collaterale di questa domanda era la correzione dell'errore che avrebbe avuto per i > 9 (Grazie!)

    var usedNames = new HashSet<string>();
    Func<string, string> name = (s) =>
        {
            string result = s;
            if(usedNames.Contains(s))
                for (int i = 1; ; result = s + i++)
                    if (!usedNames.Contains(result))
                        break;
            usedNames.Add(result);
            return result;
        };
    
posta Aaron Anodide 31.10.2011 - 18:25
fonte

4 risposte

6

Probabilmente un test unitario avrebbe dovuto / avrebbe dovuto rilevare questa omissione.

Assert.AreEqual("NEXT", obj.GetNextName("NEXT"));
Assert.AreEqual("NEXT1", obj.GetNextName("NEXT"));

Prenderà anche il probabile bug che avrai quando i = 10 .

...
Assert.AreEqual("NEXT9", obj.GetNextName("NEXT"));
/* your TrimEnd call could be a bug */
Assert.AreEqual("NEXT10", obj.GetNextName("NEXT"));  

Lo sviluppo basato sui test è proattivo per la sua definizione. Nel tuo esempio, vedresti immediatamente che non funzionava come progettato e riceverai feedback su ciò che stava restituendo.

    
risposta data 31.10.2011 - 18:39
fonte
3

Potresti chiedere a qualcun altro di esaminare il tuo codice.

    
risposta data 31.10.2011 - 18:31
fonte
2

L'esperienza è la miglior difesa qui.
Col passare del tempo, dovresti diventare più abile nello scorgere queste omissioni dal comportamento osservato.
(Dovresti anche diventare più abile nel non renderli al primo posto)

L'introduzione del codice riga per riga nel debugger dovrebbe anche evidenziare cosa manca.

    
risposta data 31.10.2011 - 18:29
fonte
2

Personalmente ritengo utile descrivere i miei metodi nei commenti prima di scrivere il codice di implementazione. In questo modo, se dimentico qualcosa, o se qualcun altro lo riprende tra due settimane, sapranno cosa succederebbe "supposto" e dovrebbero essere in grado di implementarlo da soli senza aver bisogno di qualcuno e chiedermelo!

es

MyMethod() {
    //setup vars

    //perform complex function

    //set flag for something or other

    //save changes
}

Non impedirà i problemi di tipo "Ho fatto un errore nell'algoritmo", a meno che tu non sia davvero di basso livello con i commenti, ma dovrebbe prevenire gli errori di tipo "dimenticato di salvare le modifiche".

    
risposta data 31.10.2011 - 18:31
fonte

Leggi altre domande sui tag