{"id":258,"date":"2015-03-28T14:01:48","date_gmt":"2015-03-28T12:01:48","guid":{"rendered":"http:\/\/invidit.de\/blog\/?p=258"},"modified":"2015-07-01T11:38:34","modified_gmt":"2015-07-01T09:38:34","slug":"basics-namen","status":"publish","type":"post","link":"https:\/\/invidit.de\/blog\/basics-namen\/","title":{"rendered":"Basics &#8211; Aussagekr\u00e4ftige Namen"},"content":{"rendered":"<p>Hallo Spa\u00df-Coder,<\/p>\n<p>im Artikel <a title=\"Basics? Kenn\u2019 ich doch schon\" href=\"http:\/\/invidit.de\/blog\/basics-kenn-ich-doch-schon\/\">Basics? Kenn&#8216; ich doch schon!<\/a> haben wir begr\u00fcndet, warum grundlegende Programmierpraktiken sinnvoll und hilfreich sind.<\/p>\n<p>Eine dieser Basics ist die Regel, f\u00fcr alles m\u00f6glichst aussagekr\u00e4ftige Namen zu finden. Dar\u00fcber m\u00f6chten wir im folgenden ein wenig sprechen.<\/p>\n<h3>Aussagekr\u00e4ftige Namen<\/h3>\n<p>Wieso steht an der Methode eigentlich nicht dran, was sie macht? Kennt ihr das, Methoden haben kryptische, wenig aussagekr\u00e4ftige Namen und beim Blick auf den Inhalt der Methode gibt es einige \u00dcberraschungen? Wer hat schon einmal den Variablennamen &#8222;clazz&#8220; verwendet? Doof, dabei w\u00e4re &#8222;class&#8220; doch besser &#8211; ist aber leider schon belegt. Es gibt ein paar kleinere Hilfen\u00a0die dabei helfen, einen guten Namen zu finden.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>CamelCase nutzen<\/strong><\/p>\n<p>Unsere Klassen und Funktionsnamen setzen sich in aller Regel aus mehreren W\u00f6rtern zusammen.\u00a0Damit diese beim Lesen von Code sich leichter erfassen lassen, sollten die Wortteile voneinander getrennt werden.\u00a0Dazu verwenden wir am besten das CamelCasing (oder die\u00a0<a href=\"http:\/\/de.wikipedia.org\/wiki\/Binnenmajuskel\">Binnenmajuskel<\/a>, wie wir es im\u00a0Deutschen nennen&#8230;wer denkt sich sowas eigentlich aus?). Dabei werden neue Worte immer mit einem Gro\u00dfbuchstaben begonnen, ohne sie durch ein Leerzeichen zu trennen (was wir in unseren Programmiersprachen ja nicht d\u00fcrfen).<br \/>\nSo l\u00e4sst sich <em>createdefaultconfiguration<\/em> deutlich schlechter lesen, als das in CamelCase geschriebene\u00a0<em>CreateDefaultConfiguration.<br \/>\n<\/em>CamelCase l\u00e4sst sich leichter Lesen und Schreiben, als die Verwendung anderer Trennmethoden, etwa Unterstriche (<em>create_default_configuration<\/em>).<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Aussprechbare Bezeichner vergeben<\/strong><\/p>\n<p>Namen sollten aussprechbar sein, vor allen, wenn man im Team arbeitet. So ist es viel einfacher, mit dem Kollegen \u00fcber\u00a0<em>InitialReputationValueOfOwner zu <\/em>sprechen, statt sich mit\u00a0<em>IniRepVOO <\/em>die Zunge zu verbiegen (sprecht es mal aus&#8230;), auch wenn es lang erscheint. Auch Abk\u00fcrzungen eignen sich nicht immer gut. Kann man sich beim Lesen (mit entsprechender Vorkenntnis) vielleicht noch denken, dass <em>doB_ddmmyy<\/em> das Geburtsdatum in der Form Tag-Monat-Jahr ist, kann man mit\u00a0<em>dateOfBirthAsDayMonthYear<\/em> genauso viel anfangen aber besser dar\u00fcber reden.<br \/>\nBeim Schreiben der langen Namen unterst\u00fctzt uns unsere IDE durch Code-Erg\u00e4nzungen, auch das ist also kein Grund f\u00fcr Abk\u00fcrzungen.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Substantive f\u00fcr Klassennamen<\/strong><\/p>\n<p>Vermeiden sollten wir bei Klassen allzu allgemeing\u00fcltige Namen wie Manager, Processor, Data, Info oder gar Helper. Hier ist die Gefahr besonders hoch, dass wir diese Klassen mehr Aufgaben aufb\u00fcrden, als sie haben sollten. Nach dem Single Responsibility Principle sollte eine Klasse genau eine Aufgabe haben. Eine Klasse mit dem Namen <em>TileManager<\/em> verleitet z. B.\u00a0dazu, dass hier alle M\u00f6glichen Verwaltungsaufgaben zu einem Tile unterzubringen. Dabei w\u00e4re es sicher besser, verschiedene Aufgaben auf verschiedene Klassen aufzuteilen, etwa <em>TileFactory<\/em>,<em> TileComparer<\/em>,<em> TileCollider<\/em>, <em>TileRepository<\/em>, &#8230;<br \/>\nInsbesondere, wenn wir eins der bekannten Design Pattern umsetzen, sollten wir die Klassen auch so benennen, wie sie im Pattern verwendet werden. Das erh\u00f6ht den Wiedererkennungswert und erleichtert das Verst\u00e4ndnis f\u00fcr jeden, der das Pattern ebenfalls kennt.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Verben im Methodennamen verwenden<\/strong><\/p>\n<p>Methoden erf\u00fcllen eine Aufgabe.\u00a0Aus diesem Grund soll die Aufgabe auch im Namen der Methode auftauchen, damit wir auf den ersten Blick genau wissen, was die Methode macht. So wirt mir bei der Benutzung der Methode\u00a0<em>CreateDefaultConfiguration()<\/em> sicher sofort klar, was sie tut. W\u00fcrde die Methode nur <em>Default()<\/em> hei\u00dfen, muss ich erst die &#8211; wahrscheinlich sowieso nicht gut gepflegte &#8211; Klassendokumentation lesen oder in den Code der Klasse selbst schauen. Beides h\u00e4lt mich auf uns kostet Zeit, ist also nicht wirtschaftlich. Diese Zeit spare ich, wenn der Name zuvor gut gew\u00e4hlt wurde.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Ein Wort pro Konzept<\/strong><\/p>\n<p>Beim Finden von Namen sollte man sich angew\u00f6hnen, f\u00fcr gleiche Aufgaben auch gleiche Namen zu verwenden. Das f\u00fchrt zum einen zu einheitlichen Namen, in denen man sich besser zurecht findet &#8211; vor allem, wenn die Code-Basis w\u00e4chst. Zum anderen unterst\u00fctzt das weitere Punkte, auf die wir im Artikel Funktionen noch eingehen werden.<br \/>\nSo sollten die Getter einer Klasse immer <em>getXX<\/em> hei\u00dfen. Haben wir eine Methode, die z. B. einen\u00a0Wert aus in einer Liste suchen soll, sollte de Methode nicht <em>GetValue(string value)<\/em> sondern besser\u00a0<em>\u00a0findValueByName(string name)<\/em> hei\u00dfen. Gleiches gilt, wenn die Informationen von woanders geholt werden, etwa dem Dateisystem. Die Methode <em>getXMLFile(string filename)\u00a0 <\/em>ist dann erlaubt, wenn es eine Klassenvariable XMLFile gibt. Muss die Methode die Datei erst aus dem Dateisystem oder einem Webservice auslesen, ist <em>fetchXMLFile(string filename)<\/em> der bessere Name. So\u00a0kann ich als Verwender der Methode auch gleich erkennen, wie gro\u00df der zu erwartende Aufwand der Methode ist (ein <em>get<\/em> geht immer schnell und wirft keine Fehler, ein <em>fetch<\/em> oder <em>find<\/em> dauert ggf. und ich muss mit zu behandelnden Fehlern rechnen).<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Dom\u00e4nenspezifische Begriffe verwenden<\/strong><\/p>\n<p>Wenn ich Code f\u00fcr bestimmte fachliche Zwecke schreibe, dann sollte ich auch die Sprache der Fachleute verwenden, f\u00fcr die die Software gedacht ist. Sagen wir mal, wir schreiben eine Software zur Verwaltung von Kochrezepten, dann sollten wir auch die\u00a0Begriffe <em>Rezept<\/em>, <em>Zutat<\/em> und <em>Kochbuch<\/em> verwenden. Typischerweise schreiben wir unseren Code in englisch. Wenn die Dom\u00e4ne, in der wir uns bewegen aber nicht in englisch ist, und uns die Begriffe nicht bekannt sind, dann ist es hier durchaus erlaubt, auch die deutschen Dom\u00e4nenbegriffe zu verwenden. Auch wenn sich <em>findRezeptByZutaten(List&lt;Zutat&gt; zutatenToSearch)<\/em>\u00a0ein wenig seltsam anh\u00f6rt, ist es besser, als zwanghaft englisch zu verwenden, auch wenn man mit den Worten <em>recipe<\/em> und <em>ingredient<\/em> nichts anfangen kann&#8230;oder benutzen wir doch eher\u00a0<em>addition<\/em>&#8230; oder beides, je nachdem, wer es gerade programmiert?<br \/>\nHierbei ist es vor allem im Team wichtig, dass die Begriffe einheitlich verstanden und verwendet werden. Es sollte also eine Einigung im Team geben, ob deutsch oder englisch verwendet wird und welche Begriffe genau was bedeuten. Ggf. ist es hilfreich (bei umfangreichen Dom\u00e4nen vielleicht sogar notwendig) ein Glossar anzulegen.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>M\u00f6glichst sofort den besten Namen\u00a0verwenden<\/strong><\/p>\n<p>Gute Namen zu finden ist nicht immer leicht. Es ist aber empfehlenswert, sich direkt beim Anlegen einer Klasse, Methode oder Variable kurz innezuhalten und sich Gedanken \u00fcber den Namen zu machen. Statt schnell den Klassenassistenten der IDE aufzurufen und eine Klasse mit dem Namen <em>rrrr<\/em> anzulegen sollten wir uns \u00fcberlegen, was wir mit der Klasse anfangen m\u00f6chten und ihr einen passenden Namen geben. Statt eine Variable mal eben <em>asdf<\/em> zu nennen, sollten wir uns \u00fcberlegen welchen Zweck die erstellte Instanz erf\u00fcllt und sie entsprechend benennen. Statt alles in einen Namespace oder ein Package zu legen, das <em>utils<\/em> hei\u00dft, sollten wir uns \u00fcberlegen, wo jemand anders &#8211; oder wir selbst in ein paar Wochen &#8211; die Klasse suchen w\u00fcrde.<\/p>\n<p>&nbsp;<\/p>\n<h3>Zusammenfassung<\/h3>\n<p>Haben in unserem Code alle verwendeten Objekte, einen passenden Namen und sind in passend benannten Strukturen abgelegt, finden wir uns viel schneller zurecht und k\u00f6nnen so viel schneller &#8211; und damit wirtschaftlicher &#8211; unseren Code lesen und auch ver\u00e4ndern.<\/p>\n<p>Wem so gar kein guter Name einfallen will, der holt sich bei\u00a0<a href=\"http:\/\/www.classnamer.com\/\">http:\/\/www.classnamer.com\/<\/a> einfach ein wenig Inspiration. Oder noch besser: einfach den ersten Namen verwenden, der generiert wird, das verk\u00fcrzt die Zeit des Nachdenkens \u00fcber den Namen und ist damit doch wirtschaftlicher, .. \u00e4h, oder?<br \/>\n[<em>Hinweis:<\/em> wer den letzten Satz nicht als solches erkannt haben sollte: das war ironisch gemeint, genauso wie der Classnamer an sich]<\/p>\n<p>&nbsp;<\/p>\n<p>Viel Spa\u00df beim Anwenden,<\/p>\n<p>Eure Spa\u00df-Coder<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hallo Spa\u00df-Coder, im Artikel Basics? Kenn&#8216; ich doch schon! haben wir begr\u00fcndet, warum grundlegende Programmierpraktiken sinnvoll und hilfreich sind. Eine dieser Basics ist die Regel, f\u00fcr alles m\u00f6glichst aussagekr\u00e4ftige Namen zu finden. Dar\u00fcber m\u00f6chten wir im folgenden ein wenig sprechen. Aussagekr\u00e4ftige Namen Wieso steht an der Methode eigentlich nicht dran, was sie macht? Kennt ihr [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":272,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[22,90],"tags":[23,18,17,29,30,28],"_links":{"self":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/258"}],"collection":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/comments?post=258"}],"version-history":[{"count":3,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/258\/revisions"}],"predecessor-version":[{"id":270,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/258\/revisions\/270"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media\/272"}],"wp:attachment":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media?parent=258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/categories?post=258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/tags?post=258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}