{"id":305,"date":"2008-08-28T20:53:47","date_gmt":"2008-08-28T18:53:47","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=305"},"modified":"2008-08-28T15:47:33","modified_gmt":"2008-08-28T13:47:33","slug":"was-tun-gegen-fehler-in-statischen-tabellen-bzw-variablen-deklarationen","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2008\/08\/28\/was-tun-gegen-fehler-in-statischen-tabellen-bzw-variablen-deklarationen\/","title":{"rendered":"Was tun gegen Fehler in statischen Tabellen bzw. Variablen Deklarationen"},"content":{"rendered":"<p>Ich habe es immer wieder mit langen Listen von statischen Datenbeschreibungen zu tun. Das k\u00f6nnen Parserlisten, oder Sprachbeschreibungen, die baumartig vorliegen oder einfach nur simple Arrays sein.<\/p>\n<p>In den meisten F\u00e4llen versuche ich solche Strukturen als konstante PODs (Plain Old Data) aufzubauen. D.h. also in einer Form:<\/p>\n<ol>\n<li>sodass kein weiterer Code notwendig ist um diese zu initialisieren (z.B. vermeinden von Konstruktoren\/Destruktoren)<\/li>\n<li>dass die Daten sogar m\u00f6glichst als <em>const <\/em>deklariert werden und so in einem Code Segment in Modulen geshared werden k\u00f6nnen.<\/li>\n<li>dass sie sich leicht aus einer &#8222;Art Datenbank&#8220; in C\/C++ Code erzeugen lassen.<\/li>\n<\/ol>\n<p>Oft haben diese Datenstrukturen eine komplexe Struktur und auch einen Aufbau nach bestimmten Regeln, wie z.B. dass alle Daten eines Arrays sortiert sein m\u00fcssen. Dadurch kann der Algorithmus, der diese Daten nutzt nat\u00fcrlich effektiver geschrieben werden, als wenn er auf einem unsortierten Array aufsetzt.<\/p>\n<p>Eine Erfahrung, die ich heute weitergeben will, lautet nun:<\/p>\n<blockquote><p>Vertraue niemals darauf, dass die Daten in statischen konstanten Strukturen so vorliegen wie Du es glaubst&#8230; zumindest nicht in der Debug Version! \ud83d\ude09<\/p><\/blockquote>\n<p>Hintergrund f\u00fcr diese Erfahrung ist ein Bug, der sich genau aus einer Annahme einschlich, das statische Daten in einer bestimmten Regel vorliegen. In dem aktuellen Fall war es die bereits erw\u00e4hnte Regel: <em>&#8222;Der Array ist sortiert, nach einer ID&#8220;<\/em>. Das Ganze war sogar am Anfang der besagten Struktur und im Code korrekt und ausf\u00fchrlich dokumentiert. Allerdings ist der Sourcecode dieser Tabelle mehrere 1000 Zeilen lang und ein Entwickler f\u00fcgte nun einfach ein paar neue Eintr\u00e4ge an das Ende der Liste an.<br \/>\n&lt;ironiemode&gt;Au\u00dferdem, wer liest schon interne Programmdokumentationen, wo wir alle (insb. der Autor und die gesch\u00e4tzten Leser dieses Artikels) doch f\u00e4hig sind, den Sinn und Zweck von Code mit einem Blick zu erfassen?&lt;\/ironiemode&gt;<\/p>\n<p>Die Folge war: <em>&#8222;Nun ist der Array nicht mehr sortiert&#8220;<\/em> und die weitere Folge war, dass ein Algorithmus, der auf einer bin\u00e4ren Suche basierte, nicht fand, was er finden sollte.<\/p>\n<p>Dabei h\u00e4tte St\u00fcck simpler Validierungscode, vermeiden k\u00f6nnen, dass dieser Code in Produktion ging:<\/p>\n<pre lang=\"cpp\" line=\"1\">class CSomeMightyDataHandler\r\n{\r\npublic:\r\n    CSomeMightyDataHandler();\r\n\r\n    ...\r\n\r\nprivate:\r\n    \/\/ complex static data\r\n    struct S_COMPLEXDATA\r\n    {\r\n        ...\r\n    };\r\n    static const S_COMPLEXDATA *m_pComplexData;\r\n\r\n    \/\/ Validator for Debug mode\r\n#ifdef _DEBUG\r\n    static const bool m_bValidated;\r\n    static bool ValidateData();\r\n#endif\r\n...\r\n};\r\n\r\n#ifdef _DEBUG\r\n\/\/ Validation for debug code only!\r\nconst bool CSomeMightyDataHandler::m_bValidated = CSomeMightyDataHandler::ValidateData();\r\n\r\nbool CSomeMightyDataHandler::ValidateData()\r\n{\r\n    \/\/ Do some validation and reset bResult on any failure\r\n    bool bResult = true;\r\n\r\n    ...\r\n\r\n    ASSERT(bResult);\r\n    return bResult;\r\n}\r\n#endif<\/pre>\n<p>Mit solch einem Code w\u00e4re sofort ein <em>ASSERT<\/em> nach der ersten inkorrekten Code Erg\u00e4nzung geflogen.<\/p>\n<p>PS: Folgende Annahmen stimmen:<\/p>\n<ol>\n<li>Der Programmierer, der den Code falsch hinzugef\u00fcgt war ich selbst.<\/li>\n<li>Der Programmierer, der beim Design der Klasse keinen Validierungscode geschrieben hat war auch ich selbst.<\/li>\n<li>Ich hatte wirklich vergessen, wie dieser Algorithmus urspr\u00fcnglich mal von mir geplant war (sprich, dass eine Sortierung beachtet werden muss).<\/li>\n<li>Ich kann mir in den Hintern bei\u00dfen f\u00fcr soviel selbst gemachte Dummheit.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe es immer wieder mit langen Listen von statischen Datenbeschreibungen zu tun. Das k\u00f6nnen Parserlisten, oder Sprachbeschreibungen, die baumartig vorliegen oder einfach nur simple Arrays sein. In den meisten F\u00e4llen versuche ich solche Strukturen als konstante PODs (Plain Old Data) aufzubauen. D.h. also in einer Form: sodass kein weiterer Code notwendig ist um diese &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/08\/28\/was-tun-gegen-fehler-in-statischen-tabellen-bzw-variablen-deklarationen\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eWas tun gegen Fehler in statischen Tabellen bzw. Variablen Deklarationen\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,11,3,9],"tags":[370,38,136],"class_list":["post-305","post","type-post","status-publish","format-standard","hentry","category-c","category-debugging","category-programmieren","category-sonstiges","tag-c","tag-debuggen","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\/305","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=305"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/305\/revisions"}],"predecessor-version":[{"id":306,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/305\/revisions\/306"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=305"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}