Refactoring mit Hilfe des Compilers kann eine tückische Sache werden
Wieder mal eine nette Falle: Implizite Konvertierungen und ein Refactoring-Versuch.
Folgende Methoden wurden in einer Klasse verwendet:
100 101 102 103 104 105 106 107 108 109 110 | ... bool GetTableCoreData(long lIdAddrSet, CAgvipTableCoreData &coreData, bool bSilent=false); bool GetTableCoreData(long lIdAddrSet, long lIdProject, CAgvipTableCoreData &coreData, bool bSilent=false); bool GetTableCoreData(long lIdAddrSet, CDataConnection &dataConnection, CAgvipTableCoreData &coreData); ... |
Die dritte Methode passte mir nicht von der Reihenfolge der Argumente. und ich änderte sie wie folgt um:
107 108 109 | bool GetTableCoreData(long lIdAddrSet, CAgvipTableCoreData &coreData, CDataConnection &dataConnection); |
Ich habe mich nun einfach darauf verlassen, dass der Compiler mir alle entsprechenden Code Stellen schon anmeckern wird, an denen hier was nicht passt. Da ich noch einiges anderes an der Klasse geändert hatte, dauerte es noch eine Weile bis ich den nächsten Build angeworfen habe, und ehrlich gesagt, habe ich das Refactoring dieser Funktion vergessen.
Typischer Fall von: Zu viel auf einmal & Der Compiler macht einfach nicht was ich will
Was passierte? Nichts ![]()
Ich bekam keine Fehlermeldung zu dieser Änderung, denn CDataConnection hat eine implizite Konvertierung auf bool. Die Folge war, dass die erste Signatur der Funktion auch dieser Folge von Argumenten entsprach.
101 102 103 | bool GetTableCoreData(long lIdAddrSet, CAgvipTableCoreData &coreData, bool bSilent=false); |
Logisch, dass diese Funktion natürlich eine anderes Verhalten hatte und hier nicht mehr das passierte was ich eigentlich wollte.
Dämlicherweise rutschte diese Änderung auch noch durch die Tests und eine ganze Funktionsgruppe unserer Software wurde lahmgelegt und so ausgeliefert… Ein Bug, dazu noch von der Kategorie vermeidbar.
Was lernen wir:
- Es gibt keine fehlerfreie Software!
- Die kleinen Änderungen bringen die größten Fehler!
- Sich beim Refactoring auf den Compiler zu verlassen kann tückisch werden!
2 Kommentare zu “Refactoring mit Hilfe des Compilers kann eine tückische Sache werden”
Link für diesen Beitrag | RSS-Feed zu diesem Beitrag
Hinterlassen sie einen Kommentar:
Beachten sie bitte, dass Kommentare evtl. nicht sofort hier erscheinen. Die Kommentare werden zur Moderation an den Webmaster gesendet. Es kann also etwas dauern, bis Ihr Kommentar hier veröffentlicht wird!
on So 26 Apr 2009 um 18:08 #
Shade
Und wir lernen das implizite Konvertierungen in nicht verwandte Typen einfach nur boese sind…
on Mo 11 Mai 2009 um 04:42 #
Andreas
Tja, aus fehler lernt man;)