{"id":3263,"date":"2017-11-23T17:52:05","date_gmt":"2017-11-23T16:52:05","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3263"},"modified":"2017-11-26T14:00:29","modified_gmt":"2017-11-26T13:00:29","slug":"c-guns-re-abstraction-design-and-implementation-repeat-teil-1","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3263","title":{"rendered":"C++ Guns: RE: Abstraction design and implementation: `repeat` Teil 1"},"content":{"rendered":"<p>Hallo,<br \/>\nich m\u00f6chte hier ein paar Gedanken \u00e4u\u00dfern zu dem tollen Artikel \"abstraction design and implementation: `repeat`\" von Vittorio Romeo [1].<\/p>\n<p>Sein Ziel ist es eine simple for() Schleife, wie wir sie schon alle hingeschrieben haben, zu nehmen und zu verbessern. Das Problem bei einer voll ausgeschriebenen for() Schleife ist, dass sie zeigt WAS alles gemacht wird: Eine Schleifenvariable declakiert, initialisiert, incrementiert. Aber was willen wir eigentlich damit aussagen? Na, rufe die Funktion f() einfach 10 mal auf. Ahsoo!<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor(int i=0; i &lt; 10; ++i) {\r\n    foo();\r\n}\r\n<\/pre>\n<p>Das Problem an allen Codest\u00fccken die bis heute geschrieben worden sind, ist dass ihnen die Semantik fehlt. Der Code sagt immer nur auf, WIE etwas gerade verarbeitet wird, aber nicht WAS eigentlich getan werden soll. Wenn man Gl\u00fcck hat, steht das WAS in irgendeiner veralteten Dokumentation oder Kommentarzeilen die sich irgendwo befinden.<\/p>\n<p>Aber in diesem Blogpost will ich nicht lehren zu Dokumentieren, sondern die Leute sensibel daf\u00fcr machen, dass sie das, WAS sie wollen, auch genauso in Code ausdr\u00fccken k\u00f6nnen.<\/p>\n<p>Kommen wir zur\u00fcck zur for() Schleife.<br \/>\nIn dem Code Beispiel oben steckt ziemlich viel low-level Technik. Es wird erst einmal eine Schleifenvariable i vom Typ int deklariert und mit 0 initialisiert. Und Stopp. Hier sind schon zwei lazy Bugs passiert.<br \/>\nWer sagt denn, dass der Typ int sein soll? Wenn man \u00fcber std::vector o.\u00e4. Iteriert, sollte der Typ size_t sein, da std::vector::size() auch size_t zur\u00fcck liefert. Und auch operator[] und at() jeweils ein size_t als Argument erwarten. Wenn ich eine Schleife aber nur 10mal laufen lassen will, dann ist der Typ int wiederum meist in Ordnung.<\/p>\n<p>Die Initialisierung mit 0 ist auch nicht zwangsl\u00e4ufig richtig. Zwar f\u00e4ngt der Index in C\/C++ bei 0 an, aber wenn man eine Schleife nur 10mal laufen lassen will, ist es doch egal ob man bei 0 anf\u00e4ngt und bis 9 z\u00e4hlt, oder ob man bei 1 startet und bei 10 endet.<\/p>\n<p>Das bringt uns gleich zum n\u00e4chsten lazy Bug. Der Ausdruck <code>i < 10<\/code> ist so nicht intuitiv. Der Mensch beginnt nun mal bei 1 ab zu z\u00e4hlen und endet bei 10. Daher schreiben viele, noch nicht gefolterte C++ Programmierer, zurecht <code>i <= 10<\/code>. <\/p>\n<p>Der n\u00e4chste lazy Bug kommt noch in der selben Code Zeile. Ist es nun <code>++i<\/code> oder <code>i++<\/code>? In diese Beispiel w\u00e4re es egal, da int ein POD ist. Ansonsten gilt, dass <code>++i<\/code> vorzuziehen ist, da keine tempor\u00e4re Variable erstellt (und evtl. wieder weg optimiert) werden muss.<\/p>\n<p>Der letzte lazy Bug sehe ich leider auch sehr oft. Die Variable i wird nicht innerhalb der for() Schleife deklariert, sondern nur innerhalb der Funktion. Also altes C\/Fortran. So ist es m\u00f6glich, absichtlich oder aus versehen, die Variable i mehrmals zu nutzen. In der Regel ist dies nicht gewollt, und wenn doch, wird es nicht dokumentiert. <\/p>\n<p>Es kann nicht sein, dass auf so viele Sachen geachtet werden muss, wenn eine simple Schleife gefordert ist. Vittorio Romeo zeigt zurecht wie es einfacher geht. Leider macht er so die Sache nicht besser, nur anders schlimm.<\/p>\n<p><a href=\"http:\/\/roboblog.fatal-fury.de\/?p=3272\">Teil 2<\/a><\/p>\n<p>[1] https:\/\/vittorioromeo.info\/index\/blog\/abstraction_design_implementation_repeat.html<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hallo, ich m\u00f6chte hier ein paar Gedanken \u00e4u\u00dfern zu dem tollen Artikel \"abstraction design and implementation: `repeat`\" von Vittorio Romeo [1]. Sein Ziel ist es eine simple for() Schleife, wie wir sie schon alle hingeschrieben haben, zu nehmen und zu verbessern. Das Problem bei einer voll ausgeschriebenen for() Schleife ist, dass sie zeigt WAS alles [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-3263","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3263"}],"version-history":[{"count":8,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3263\/revisions"}],"predecessor-version":[{"id":3277,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3263\/revisions\/3277"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3263"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}