Overload di operatori, unit testing e altre considerazioni
Ho appena perso un paio d'ore per trovare un bug in questa funzione:
public static InheritedCost operator - ( InheritedCost a ) {
return new InheritedCost( -a.Last, a.Inherited );
}
La versione corretta è questa:
public static InheritedCost operator - ( InheritedCost a ) {
return new InheritedCost( -a.Last, -a.Inherited );
}
Tanto per essere chiari: il codice è mio, il responsabile sono io. Il programma (anzi il componente!) esaminato non ha unit testing (non è molto recente). Se mai ve ne fosse bisogno, questa è un'ulteriore lezione da trarre: lo unit testing non fa aumentare i tempi di sviluppo, li fa diminuire, sempre che si guardi la cosa dal punto di vista del tempo totale (analisi + codifica + debug + manutenzione per richieste modifiche) e non limitandosi al tempo necessario per arrivare alla Beta 1.
Questo bug ha richiesto ore perché causava un problema nel risultato finale di un'elaborazione estremamente lunga e complessa che poteva avere altre decine di spiegazioni tutte plausibili, anche aritmeticamente (un caso particolare di applicazione della legge di Murphy). Poiché si tratta di un operatore in overload, non era mai stato usato fino a poche settimane fa, e solo adesso i nodi vengono al pettine.
Bene, se mai ve ne fosse stato bisogno, io la lezione l'ho imparata (non che non la sapessi già, ma non avevo mai applicato lo unit testing ai progetti più vecchi già realizzati). Programmatore avvisato...