{"id":1918,"date":"2014-07-24T14:36:53","date_gmt":"2014-07-24T13:36:53","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=1918"},"modified":"2014-07-24T14:36:53","modified_gmt":"2014-07-24T13:36:53","slug":"welcher-code-ist-schoner","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=1918","title":{"rendered":"Welcher Code ist \"sch\u00f6ner\" ? ;)"},"content":{"rendered":"<p>Kurzes Programm, welches \u00fcberp\u00fcft ob der Benutzer eine Variable \"resolution\" definiert hat. Wenn ja, wird versucht die Benutzereingabe in eine Zahl umzuwandeln. Wenn nein, wird ein default Wert von 1 angenommen.<\/p>\n<p>Variante 1:<\/p>\n<pre><code>\r\nconst QString resolution = options().text(\"resolution\");\r\nbool userResolution = false;\r\n\/\/ check if user defined cellsize\r\nqreal newCellSize = 1;\r\nif(!resolution.isEmpty()) {            \r\n  userResolution = true;\r\n  bool ok;\r\n  const qreal userCellSize = resolution.toDouble(&ok);\r\n  if(ok) {\r\n    newCellSize = userCellSize;\r\n  }\r\n  else {\r\n    qDebug() << \"Cant parse user defined resolution:\" << resolution;\r\n  }\r\n}\r\n<\/code><\/pre>\n<p>Die Variable userResoltion ist nicht als const declariert und k\u00f6nnte \u00fcberschrieben werden. Machen wir sie read-only!<\/p>\n<p>Variante 2:<\/p>\n<pre><code>\r\nconst QString resolution = options().text(\"resolution\");\r\nconst bool userResolution = !resolution.isEmpty();\r\n\/\/ check if user defined cellsize\r\nqreal newCellSize = 1;\r\nif(!resolution.isEmpty()) {            \r\n  bool ok;\r\n  const qreal userCellSize = resolution.toDouble(&ok);\r\n  if(ok) {\r\n    newCellSize = userCellSize;\r\n  }\r\n  else {\r\n    qDebug() << \"Cant parse user defined resolution:\" << resolution;\r\n  }\r\n}\r\n<\/code><\/pre>\n<p>Der Code sieht noch etwas aufgebl\u00e4ht aus. Trennen wir den normalen Programm Path und den Error Path, der durchlaufen wird, wenn die Benutzereingabe ung\u00fcltig ist.<\/p>\n<p>Variante 3:<\/p>\n<pre><code>\r\nqreal toDouble(const QString& s) throw(Exception) {\r\n    bool ok;\r\n    qreal x = s.toDouble(&ok);\r\n    if(!ok)\r\n        throw Exception(\"Cant convert to double\" + s);\r\n    return x;\r\n}\r\n\r\n...\r\n\r\nconst QString resolution = options().text(\"resolution\");\r\nconst bool userResolution = !resolution.isEmpty();\r\n\/\/ check if user defined cellsize\r\nqreal newCellSize;\r\ntry {\r\n      newCellSize = toDouble(resolution);\r\n}catch(...) {\r\n      newCellSize = 1.0;\r\n      if(!resolution.isEmpty())\r\n           qDebug() << \"Cant parse user defined resolution:\" << resolution;\r\n}\r\n<\/pre>\n<p><\/code><\/p>\n<p>Nun m\u00f6chten wir die Variable newCellSize auch noch read-only haben, da sie ein Parameter ist und niemals mehr ge\u00e4ndert werden darf. Daf\u00fcr lagern wir nun die komplette Logik f\u00fcr das Parser der Benutzereingabe in eine Funktion aus.<\/p>\n<p>Variante 4:<\/p>\n<pre><code>\r\nqreal toDouble(const QString& s, qreal defaultValue = 0.0) {\r\n    if(s.isEmpty())\r\n        return defaultValue;\r\n\r\n    bool ok;\r\n    qreal x = s.toDouble(&ok);\r\n    if(!ok) {\r\n        qDebug() << \"Cant convert to double\" + s;\r\n        return defaultValue;\r\n    }\r\n    return x;\r\n}\r\n\r\n...\r\n\r\nconst QString resolution = options().text(\"resolution\");\r\nconst bool userResolution = !resolution.isEmpty();\r\n\/\/ check if user defined cellsize\r\nconst qreal newCellSize = toDouble(resolution, 1.0);\r\n<\/code><\/pre>\n<p>Der wesentliche Code ist jetzt nur noch 4 Zeilen lang, statt 15 Zeilen.<br \/>\nEr ist auf das wesentliche reduziert, verst\u00e4ndlicher und gegen das versehentliche \u00fcberschreiben der Variablen gesch\u00fctzt.<br \/>\nNachteile gibt es allerdings auch. Die Fehlermeldung wenn das Konvertieren fehl schl\u00e4ng ist nicht anpassbar. Mit einem zust\u00e4zlichen Funktionsargument k\u00f6nnte man das aber nachbessern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kurzes Programm, welches \u00fcberp\u00fcft ob der Benutzer eine Variable \"resolution\" definiert hat. Wenn ja, wird versucht die Benutzereingabe in eine Zahl umzuwandeln. Wenn nein, wird ein default Wert von 1 angenommen. Variante 1: const QString resolution = options().text(\"resolution\"); bool userResolution = false; \/\/ check if user defined cellsize qreal newCellSize = 1; if(!resolution.isEmpty()) { userResolution [&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,12],"class_list":["post-1918","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp","tag-qt"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/1918","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=1918"}],"version-history":[{"count":9,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/1918\/revisions"}],"predecessor-version":[{"id":1927,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/1918\/revisions\/1927"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1918"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}