{"id":448,"date":"2009-04-25T19:35:15","date_gmt":"2009-04-25T17:35:15","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=448"},"modified":"2009-04-22T13:36:28","modified_gmt":"2009-04-22T11:36:28","slug":"refactoring-mit-hilfe-des-compilers-kann-eine-tueckische-sache-werden","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2009\/04\/25\/refactoring-mit-hilfe-des-compilers-kann-eine-tueckische-sache-werden\/","title":{"rendered":"Refactoring mit Hilfe des Compilers kann eine t\u00fcckische Sache werden"},"content":{"rendered":"<p>Wieder mal eine nette Falle: Implizite Konvertierungen und ein Refactoring-Versuch.<\/p>\n<p>Folgende Methoden wurden in einer Klasse verwendet:<\/p>\n<pre lang=\"cpp\" line=\"100\">...\r\nbool GetTableCoreData(long lIdAddrSet,\r\n            CAgvipTableCoreData &amp;coreData,\r\n            bool bSilent=false);\r\nbool GetTableCoreData(long lIdAddrSet, long lIdProject,\r\n            CAgvipTableCoreData &amp;coreData,\r\n            bool bSilent=false);\r\nbool GetTableCoreData(long lIdAddrSet,\r\n            CDataConnection &amp;dataConnection,\r\n            CAgvipTableCoreData &amp;coreData);\r\n...<\/pre>\n<p>Die dritte Methode passte mir nicht von der Reihenfolge der Argumente. und ich \u00e4nderte sie wie folgt um:<\/p>\n<pre lang=\"cpp\" line=\"107\">bool GetTableCoreData(long lIdAddrSet,\r\n            CAgvipTableCoreData &amp;coreData,\r\n            CDataConnection &amp;dataConnection);<\/pre>\n<p>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\u00e4ndert hatte, dauerte es noch eine Weile bis ich den n\u00e4chsten Build angeworfen habe, und ehrlich gesagt, habe ich das Refactoring dieser Funktion vergessen.<br \/>\nTypischer Fall von: Zu viel auf einmal &amp; Der Compiler macht einfach nicht was ich will \ud83d\ude09<\/p>\n<p>Was passierte? Nichts \u2757<br \/>\nIch bekam <strong>keine <\/strong>Fehlermeldung zu dieser \u00c4nderung, denn <em>CDataConnection <\/em>hat eine implizite Konvertierung auf <em>bool<\/em>. Die Folge war, dass die erste Signatur der Funktion auch dieser Folge von Argumenten entsprach.<\/p>\n<pre lang=\"cpp\" line=\"101\">bool GetTableCoreData(long lIdAddrSet,\r\n            CAgvipTableCoreData &amp;coreData,\r\n            bool bSilent=false);<\/pre>\n<p>Logisch, dass diese Funktion nat\u00fcrlich eine anderes Verhalten hatte und hier nicht mehr das passierte was ich eigentlich wollte.<br \/>\nD\u00e4mlicherweise rutschte diese \u00c4nderung auch noch durch die Tests und eine ganze Funktionsgruppe unserer Software wurde lahmgelegt und so ausgeliefert&#8230; Ein Bug, dazu noch von der Kategorie vermeidbar.<br \/>\nWas lernen wir:<\/p>\n<ol>\n<li>Es gibt keine fehlerfreie Software!<\/li>\n<li>Die kleinen \u00c4nderungen bringen die gr\u00f6\u00dften Fehler!<\/li>\n<li>Sich beim Refactoring auf den Compiler zu verlassen kann t\u00fcckisch werden!<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Wieder mal eine nette Falle: Implizite Konvertierungen und ein Refactoring-Versuch. Folgende Methoden wurden in einer Klasse verwendet: &#8230; bool GetTableCoreData(long lIdAddrSet, CAgvipTableCoreData &amp;coreData, bool bSilent=false); bool GetTableCoreData(long lIdAddrSet, long lIdProject, CAgvipTableCoreData &amp;coreData, bool bSilent=false); bool GetTableCoreData(long lIdAddrSet, CDataConnection &amp;dataConnection, CAgvipTableCoreData &amp;coreData); &#8230; Die dritte Methode passte mir nicht von der Reihenfolge der Argumente. und ich &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2009\/04\/25\/refactoring-mit-hilfe-des-compilers-kann-eine-tueckische-sache-werden\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eRefactoring mit Hilfe des Compilers kann eine t\u00fcckische Sache werden\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,3,9],"tags":[99,370,136],"class_list":["post-448","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","category-sonstiges","tag-bug","tag-c","tag-qualitaetssicherung"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/448","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=448"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/448\/revisions"}],"predecessor-version":[{"id":452,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/448\/revisions\/452"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=448"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}