{"id":3345,"date":"2018-02-02T16:03:23","date_gmt":"2018-02-02T15:03:23","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3345"},"modified":"2018-02-02T20:34:52","modified_gmt":"2018-02-02T19:34:52","slug":"c-guns-generic-data-type-design-pattern-teil-2","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3345","title":{"rendered":"C++ Guns: Generic Data Type Design Pattern - Teil 2"},"content":{"rendered":"<p>Weiter gehts mit der Anwendung meiner Idee alle einfachen Datentypen als std::array oder std::tuple abzubilden. Wie im <a href=\"http:\/\/roboblog.fatal-fury.de\/?p=3343\">ersten Teil<\/a> schon f\u00fcr den Point2D Datentyp realisiert.<\/p>\n<p>Jetzt werde ich einen Range Datentyp bauen. Dieser besteht einfach aus zwei Zahlen die eine obere und untere Grenze von etwas angibt. Zus\u00e4tzlich ist die Spanne zwischen obere und untere Grenze interessant. Dies ist aber eine abgeleitete Gr\u00f6\u00dfe und darf deshalb nicht als gespeichert werden, sondern soll extra berechnet werden.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstruct Range : public std::array&lt;double,2&gt;\r\n{\r\n  const auto&amp; lower() const {\r\n    return operator&#x5B;](0);\r\n  }\r\n\r\n  const auto&amp; upper() const {\r\n    return operator&#x5B;](1);\r\n  }\r\n\r\n  const auto size() const {\r\n    return upper()-lower();\r\n  }\r\n}\r\n<\/pre>\n<p>So, die Intitialisierung erfolgt \u00fcber eine Liste. Der Zugriff einheitlich \u00fcber Funktionen. Sowohl f\u00fcr gespeicherte Werte sowie f\u00fcr abgeleitete. Das ist schon mal gut. <\/p>\n<p>H\u00e4ssliche Member Variablen fallen mit diesem Entwurfsmuster weg. Damit muss man sich und auch nicht mehr \u00fcberlegen wie man sie nennt. Mit Unterstrich, Gro\u00df\/Kleinschreibung oder ganz kryptisch und verkr\u00fcppelt. Nein, die Entscheidung muss \u00fcberhaupt nicht mehr gef\u00e4llt werden.<\/p>\n<p>Da dieses Beispiel doch recht einfach war, versuchen wir es doch mal mit den Stochastischen Momenten.<br \/>\nAlso einen Datentyp welche Mittelwert, Varianz und Standardabweichung bereitstellt. Nun kann man aus einer vorher erstellten Summe und der Anzahl der Summanden diese drei Werte immer berechnen. Aber das erscheint mir zu aufwendig und irgendwie nicht richtig. Daher tendiere ich dazu, avg var und std direkt in dem Datentyp abzuspeichern.<\/p>\n<p>Versuchen wir es:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstruct StochastikMoment : public std::array&lt;3,double&gt;\r\n{\r\n  template&lt;typename Container&gt;\r\n  StochastikMoment(const Container&amp; data) {\r\n    operator&#x5B;0] = sum(data)\/data.size();\r\n    operator&#x5B;1] = ...;\r\n    operator&#x5B;2] = std::sqrt(operator&#x5B;1]);\r\n  }\r\n\r\n  const auto&amp; avg() const {\r\n    return operator&#x5B;0];\r\n  }\r\n\r\n  const auto&amp; var() const {\r\n    return operator&#x5B;1];\r\n  }\r\n\r\n  const auto&amp; std() const {\r\n    return operator&#x5B;2];\r\n  }\r\n}\r\n<\/pre>\n<p>Die Initialisierung kann wieder \u00fcber eine Liste erfolgen, wenn n\u00f6tig. Aber im Normalfall werden die Momente aus vorgegebenen Daten berechnet. Den Algorithmus daf\u00fcr spare ich mir.<br \/>\nDer Zugriff Erfolg wie gewohnt \u00fcber Funktionen. Ich denke an diesem Beispiel wird klar, warum nur const Funktionen in diesem Entwurfsmuster Sinn machen. Die Standardabweichung ist streng verbunden mit der Varianz. Und die Varianz h\u00e4ngt stark vom Mittelwert ab. Es macht einfach keinen Sinn, Mittelwert und Varianz algorithmus zu bestimmen aber die Varianz manuell vorzugegen. Diese drei Werte h\u00e4ngen voneinander ab und treten dementsprechend immer zusammen auf.<\/p>\n<p>H\u00e4tte ich mich bei diesem Datentyp anders entschieden und die drei Werte immer wieder berechnet, und die Summe gespeichert, dann w\u00e4re das doch auch ganz klar. Wenn man den Mittelwert berechnet, kann man ihn nicht \u00fcber avg() Setzen.<\/p>\n<p>Ich frage mich ob diese Art und Weise allgemeing\u00fcltig f\u00fcr alle einfachen Datentypen ist. <\/p>\n<p>Auf jeden Fall ist das serialisieren dadurch einfach. Weiter im dritten Teil.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Weiter gehts mit der Anwendung meiner Idee alle einfachen Datentypen als std::array oder std::tuple abzubilden. Wie im ersten Teil schon f\u00fcr den Point2D Datentyp realisiert. Jetzt werde ich einen Range Datentyp bauen. Dieser besteht einfach aus zwei Zahlen die eine obere und untere Grenze von etwas angibt. Zus\u00e4tzlich ist die Spanne zwischen obere und untere [&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-3345","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\/3345","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=3345"}],"version-history":[{"count":2,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3345\/revisions"}],"predecessor-version":[{"id":3348,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3345\/revisions\/3348"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3345"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}