lernen:naming
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | lernen:naming [2020-07-27 09:08] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Schall und Rauch --- Das Spiel mit den Namen ====== | ||
+ | |||
+ | > He writes a, he says b, he means c; but it should be d. [...] | ||
+ | > After all, you can learn something from this traditional mathematics professor. | ||
+ | >> | ||
+ | |||
+ | Gibt es eine Antwort auf die Frage: | ||
+ | Ist ''' | ||
+ | '' | ||
+ | |||
+ | ===== Der Name des Spiels: Namenskonventionen. ===== | ||
+ | |||
+ | Konvention heißt Übereinkunft, | ||
+ | Um sich mit anderen verständigen zu können, | ||
+ | müssen die Kommunikationspartner Vereinbarungen treffen oder (unbewusst) | ||
+ | schon getroffen haben. Nichts ist ärgerlicher als fruchtlose Diskussionen, | ||
+ | in denen alle aneinander vorbei reden, | ||
+ | obwohl sie vielleicht sogar dasselbe Ziel verfolgen. Sie erkennen nicht, | ||
+ | dass sie nur unterschiedliche Wörter für dasselbe benutzen (Synonyme) oder, | ||
+ | schlimmer, dasselbe Wort mit jeweils anderer Bedeutung (Homonyme). | ||
+ | In solchen Fällen hilft, kooperative Gesprächspartner vorausgesetzt, | ||
+ | meist nur die Rückfrage: Was meinst du mit ... ? | ||
+ | Solche Begriffsbestimmungen sollten am Anfang stehen. | ||
+ | |||
+ | Wenn wir sprechen, tragen aber nicht nur die Laute der Wörter Bedeutung. | ||
+ | Wir betonen verschiedene Dinge unterschiedlich. Der Tonfall ist wichtig. | ||
+ | Sehen wir den Gesprächspartner, | ||
+ | und Körperhaltung (Gestik) beim Sprechen etwas aus. | ||
+ | Das Fehlen solcher Zusatzinformationen bei elektronischer Kommunikation | ||
+ | (eMail, Chat) hat zu Smileys und Emoticons geführt, | ||
+ | die nur der Eingeweihte versteht: | ||
+ | |||
+ | Videohandys werden nicht funktionieren /g/, | ||
+ | weil darauf nur Ohren zu sehen sind *rotfl* Ich gehe zu |---| :-( . | ||
+ | |||
+ | Wenn wir schreiben, kann nur ein Teil davon nachgebildet werden. | ||
+ | Dafür haben wir andere Möglichkeiten: | ||
+ | (Sie oder sie), Absatzbildung, | ||
+ | Fußnoten((In C++ würde der Fußnote vermutlich am ehesten ein Kommentar entsprechen.)). | ||
+ | Nicht umsonst wird um die Rechtschreibung und um gutes Layout erbittert gestritten. | ||
+ | Beide transportieren Inhalte. Beide sind Fragen der Übereinkunft. | ||
+ | Beides sind auch Fragen des Geschmacks, über den sich bekanntlich erbittert, | ||
+ | trefflich oder gar nicht streiten lässt, | ||
+ | je nach Standpunkt und Definition des Begriffes Geschmack. | ||
+ | |||
+ | Wie wichtig eine gute Notation ist, zeigt die Entwicklung der Zahlensysteme: | ||
+ | ägyptisch mit Hieroglyphen, | ||
+ | semitischen, | ||
+ | babylonisch mit Keilschrift (ein Basis-60-System), | ||
+ | chinesisch mit Bambusstäbchen, | ||
+ | (das uns geläufige Dezimal-Positionssystem mit der Null) | ||
+ | oder das Dualsystem der Computer. Eine Zahl aufschreiben, | ||
+ | damit rechnen jedoch nicht immer gleich gut: | ||
+ | Griechische Zahlen ließen sich wohl am besten durchstreichen | ||
+ | (so erfand Eratosthenes das Primzahlsieb), | ||
+ | Babylonier mussten das ganz große 1x1 bis 60 beherrschen | ||
+ | (als Keilschrift-Tafelwerk) und gingen dabei in die | ||
+ | Brüche((Als der Turm zu Babel zu Bruch ging mangels Statiker, | ||
+ | erfanden sie die Bruchrechnung. Auch babylonische Bruchteile | ||
+ | wie 60 Minuten je 60 Sekunden sind uns daher überliefert.)), | ||
+ | Römer erfanden den Abakus und den Kalkül | ||
+ | (" | ||
+ | heutige Studenten greifen bei "2 mal 3" reflexartig zum Taschenrechner, | ||
+ | für den sogar unser Zehnfingersystem zu kompliziert ist (Striche und Kringel genügen). | ||
+ | |||
+ | Notation zählt. Notation macht den Unterschied. Auch wenn es " | ||
+ | |||
+ | Nicht alles ist in Programmiersprachen durch die Syntax festgelegt. | ||
+ | Ein gleiches äußeres Programmverhalten kann durch viele unterschiedliche | ||
+ | Programmentwürfe und Quelltexte erreicht werden. Je komplexer das Problem, | ||
+ | umso mehr Möglichkeiten gibt es. Quelltextaufteilung, | ||
+ | Formatierung und auch Namensgebung sind in C++ innerhalb gewisser Grenzen dem Anwender überlassen. | ||
+ | Über jedes dieser Teilgebiete lassen sich zusätzliche Empfehlungen, | ||
+ | Richtlinien und Standards errichten und erbitterte Debatten führen. | ||
+ | |||
+ | Der einzelne Programmierer kann, sollte und wird sich entscheiden, | ||
+ | welcher Stil für sein Projekt geeignet ist. Wer " | ||
+ | schreibt dennoch " | ||
+ | Wer in ein Programmierteam eintritt, wird dort bestimmte Stilkonventionen vorfinden. | ||
+ | Nehme ich sie an? Arbeite ich dagegen? Können andere meinen Stil akzeptieren? | ||
+ | |||
+ | Einen Stil anzunehmen oder herauszubilden, | ||
+ | erfordert Auseinandersetzung mit den verschiedenen Möglichkeiten, | ||
+ | Wissen um die Hintergründe. Was kann dem Leser des Quelltextes | ||
+ | neben syntaktisch korrektem Verhalten noch mitgeteilt werden? | ||
+ | Bei jedem Stil gibt es Argumente, die dafür, und solche, die dagegen sprechen. | ||
+ | |||
+ | Das gilt auch für so grundlegende Dinge wie die Wahl eines Namens. | ||
+ | Nicht nur Anfänger tun sich schwer, für bestimmte Daten eine Bezeichnung zu finden. | ||
+ | Dieses Zögern hat seinen Grund. | ||
+ | Aus psychologischen und ergonomischen Untersuchungen ist bekannt, | ||
+ | dass die Auswahlzeit proportional ist zum Logarithmus der Anzahl der zur Wahl stehenden Möglichkeiten. | ||
+ | Zur Auswahl stehen 52 kleine und große Buchstaben, | ||
+ | der Unterstrich und 10 Zifferzeichen, | ||
+ | Ein Name darf beliebig lang sein. Wer die Wahl hat, hat die Qual. | ||
+ | Eine treffende Bezeichnung ist ein Glücksfall. | ||
+ | Überlassen Sie Ihr Glück nicht dem Zufall, wählen Sie Bezeichner mit Stil. | ||
+ | Namenskonventionen können dazu beitragen. | ||
+ | Im Englisch-Wörterbuch steht convention (Sitte) hinter convenience | ||
+ | (Annehmlichkeit, | ||
+ | Wählen Sie einen zweckmäßigen Stil. Wählen Sie mit Bedacht. | ||
+ | |||
+ | Ich werde Ihnen keine fertige Richtlinie vorgeben. | ||
+ | Davon gibt es im Internet schon genug (Taligent, GNU, Microsoft, ...). | ||
+ | Sie werden mit Beispielen konfrontiert. | ||
+ | Die Gestaltungsmöglichkeiten sind vielfältig. | ||
+ | Jede Art der Entscheidung wird mit einem Dafür und Dagegen versehen. | ||
+ | Wenn ich " | ||
+ | Prüfen Sie, ob die Argumente für Sie stichhaltig erscheinen. | ||
+ | Finden Sie bessere Begründungen. Entscheiden Sie sich dann. | ||
+ | Nicht immer ist es ein "gutes Beispiel" | ||
+ | aus dem Zusammenhang gerissen, nicht treffen. Finden Sie treffendere Beispiele. | ||
+ | Ebenso lassen verschiedene Kombinationen bilden. | ||
+ | Manche Stilentscheidungen sind miteinander vereinbar, andere nicht. | ||
+ | Manchmal gibt es mehr als zwei Möglichkeiten. | ||
+ | Sie müssen sich auch nicht immer nur dafür entscheiden oder immer nur dagegen | ||
+ | (der Geist, der stets verneint). Wichtig ist, | ||
+ | dass Sie wissen und für sich selbst und vor anderen begründen können, | ||
+ | warum Sie eine Richtung vertreten. Nur dann besteht die Chance, | ||
+ | dass Sie andere überzeugen können. Seien Sie aber auch offen für Argumente anderer. | ||
+ | Versuchen Sie, diese zu widerlegen. Demokratie muss Widerspruch aushalten. | ||
+ | Finden Sie bessere Argumente. Autorität entsteht durch Überzeugungskraft, | ||
+ | nicht durch Befehle. | ||
+ | |||
+ | ===== Namenwahl ===== | ||
+ | ==== Über kurz oder lang ==== | ||
+ | |||
+ | Programmierer sind faul. Sie mögen keine langen Namen. Ein Buchstabe reicht. | ||
+ | |||
+ | <code cpp> | ||
+ | double a = 14, b = 0.25, c, d; | ||
+ | std::cin >> c; | ||
+ | d = 12*a+b*c; | ||
+ | </ | ||
+ | **Pro:** Programmierer sind nicht (nur) faul. | ||
+ | Beim Programmieren entsteht ein Schreibstau. Die Ideen entstehen schneller, | ||
+ | als sie niedergeschrieben werden können. | ||
+ | Daher der Drang zu möglichst wenigen Tastenanschlägen. | ||
+ | Solange die Namen nur in einem kleinem Bereich Bedeutung haben, | ||
+ | sind kurze Namen in Ordnung: | ||
+ | Typische Zählschleifen haben einen ganzzahligen (int) Schleifenzähler (Iterator) | ||
+ | namens '' | ||
+ | |||
+ | **Kontra:** Ein typischer Hacker, ein typisches " | ||
+ | Keiner ahnt, dass es sich hierbei um eine Stromrechnung handelt | ||
+ | (ehemaliger " | ||
+ | Nicht einmal ein Kommentar weist darauf hin, | ||
+ | dass '' | ||
+ | '' | ||
+ | Besser sind längere, beschreibende Namen. | ||
+ | |||
+ | ==== Abkürzungen und Verwechslungsgefahr ==== | ||
+ | |||
+ | Abkürzungen verschlechtern die Lesbarkeit. | ||
+ | |||
+ | <code cpp> | ||
+ | char hs, strg[] = "Cn U rd ths qckly?"; | ||
+ | strcpy(strg, | ||
+ | </ | ||
+ | |||
+ | **Pro:** Viele Namen der Standard-C-Bibliothek bestehen aus Abkürzungen, | ||
+ | aus historischen Gründen: | ||
+ | Die ersten Linker konnten nur 6 Zeichen auseinanderhalten. | ||
+ | Wissen Sie, was '' | ||
+ | Schreiben Sie neue, beschreibende Namen aus. | ||
+ | Das Kürzel '' | ||
+ | has, head of string, haus, hose, hase (ich weiß von nichts). | ||
+ | Verkürzungen verringern die semantische Distanz; | ||
+ | die Gefahr von Verwechslungen mit ähnlich lautenden Namen wächst. | ||
+ | |||
+ | **Kontra:** Das gilt nicht nur für Abkürzungen, | ||
+ | Vermeide generell ähnliche Namen. Vermeide auch gleiche Bezeichner. | ||
+ | Definiere Namen erst dort, wo sie gebraucht werden, so lokal wie möglich, | ||
+ | innerhalb geschweifter Klammern. C++ erlaubt das, C erlaubte es nicht. | ||
+ | Vermeide globale Variablen. | ||
+ | Je lokaler eine Variable ist, umso kürzer kann auch ihr Name sein. | ||
+ | |||
+ | ==== Unterstriche ==== | ||
+ | |||
+ | Unterstriche sind zu vermeiden. | ||
+ | <code cpp> | ||
+ | int _error; | ||
+ | </ | ||
+ | **Pro:** Unterstriche am Anfang oder Ende eines Namens | ||
+ | kommen häufig bei versteckten, | ||
+ | innerhalb der Standardbibliothek vor. Vor allem Präprozessor-Makros, | ||
+ | Include-Wächter usw. sind so gekennzeichnet: | ||
+ | |||
+ | **Kontra:** Lokale Variablen verdecken vordefinierte Namen. | ||
+ | Gegen '' | ||
+ | Falls doch, lässt sich eine lokale Variable leicht umbenennen. | ||
+ | |||
+ | ==== Durchkoppeln oder SmallTalk ==== | ||
+ | |||
+ | Für lange Namen aus mehreren Wörtern sind Unterstriche besser als große Wortanfänge. | ||
+ | |||
+ | <code cpp> | ||
+ | int Anzahl_der_Woerter_je_Zeile; | ||
+ | int smallTalkStilMitGrossenAnfangsbuchstaben; | ||
+ | </ | ||
+ | |||
+ | **Pro:** Im Deutschen hat Groß- und Kleinschreibung grammatische Bedeutung. | ||
+ | Mit Unterstrichen statt Leerzeichen lassen sich solche Feinheiten nachbilden. | ||
+ | |||
+ | **Kontra:** Ich schreibe englischen Quelltext, auch wenn es manchmal schwierig ist, | ||
+ | das richtige englische Wort zu finden... | ||
+ | Beide Stile werden in unterschiedlichen Kreisen gepflegt. | ||
+ | Die Vermischung beider führt zu Chaos. | ||
+ | |||
+ | ==== Kryptische oder sprechende Namen ==== | ||
+ | |||
+ | Manche verwenden Namen von Figuren aus ihrem Lieblingsfilm oder -roman. | ||
+ | <code cpp> | ||
+ | std:: | ||
+ | </ | ||
+ | **Pro:** Sie kennen die beiden nicht? Keine Panik! | ||
+ | Lesen Sie Douglas Adams' Hitchhikers' | ||
+ | Außerdem: Kryptische Namen verführen nicht, das zu glauben, was da steht. | ||
+ | |||
+ | **Kontra:** Lesen können Sie das Buch (nach der Arbeit). | ||
+ | Solange Sie aber kein Filmprogramm bauen, | ||
+ | nehmen sie lieber sprechende Namen wie '' | ||
+ | die sind nicht zu verwechseln. Sonst bleibt der Sinn dunkel. | ||
+ | |||
+ | ==== Verben und Substantive ==== | ||
+ | |||
+ | Verben bezeichnen Tätigkeiten, | ||
+ | <code cpp> | ||
+ | bool lesen = false; | ||
+ | gucken(Sie, Film); | ||
+ | </ | ||
+ | |||
+ | **Pro:** Offensichtlich. Das erschließt sogar den Hintersinn. | ||
+ | (Manchmal sind C++-Quellen sogar witzig.) | ||
+ | |||
+ | **Kontra:** Lassen Sie sich nicht irre machen. Lesen bildet. | ||
+ | Dabei erfahren sie sogar, | ||
+ | das Verben substantivisch und Substantive als Verlaufsform (Prozess des Lesens) | ||
+ | gebraucht werden können. | ||
+ | |||
+ | ==== Prädikate ==== | ||
+ | |||
+ | Funktionen, die Wahrheitswerte liefern, | ||
+ | werden in der mathematischen Logik als Prädikate bezeichnet. | ||
+ | Durch Vorsilben wird ihre Rolle deutlich. | ||
+ | |||
+ | <code cpp> | ||
+ | if (isdigit(cin.peek())) std::cin >> obergrenze; | ||
+ | if (istPrimzahl(n)) std::cout << n << ' '; | ||
+ | std::cout << athene.hateinenVogel(); | ||
+ | </ | ||
+ | |||
+ | **Pro:** Machen Sie durch Vorsilbe den Charakter des Funktionsaufrufs als Entscheidungsfrage deutlich. | ||
+ | |||
+ | **Kontra:** Das kollidiert mit dem '' | ||
+ | '' | ||
+ | Vertrauen Sie nicht darauf, dass solche Funktionen Wahrheitswerte liefern: | ||
+ | '' | ||
+ | auch als Befehl auffassen, sich ein Vogelbauer zu kaufen. | ||
+ | Vorsilben sind ein Hinweis, aber keine Garantie, was eine Funktion tut. | ||
+ | |||
+ | ==== Ergebnistyp ==== | ||
+ | |||
+ | Funktionsnamen können ihren Ergebnistyp codieren. | ||
+ | |||
+ | <code cpp> | ||
+ | while (fabs(x-y) > epsilon) { /* berechne genaueres x und y */ } | ||
+ | long betrag = labs(m,n); | ||
+ | </ | ||
+ | |||
+ | **Pro:** Ein Kodierungsschema vorausgesetzt, | ||
+ | |||
+ | **Kontra:** Das funktioniert nur, wenn die Anzahl der Typen begrenzt ist wie in C. | ||
+ | Wie wäre die Vielfalt der Klassen eines objektorientierten System unterzubringen? | ||
+ | In C lassen sich keine gleichnamigen Funktionen mit unterschiedlichen Argumentlisten bauen (überladen). | ||
+ | Deshalb griff man zum Typvorspann, | ||
+ | long- und double-Werte definieren zu können. | ||
+ | Bei Schablonen (Templates) in C++ will man ja gerade typunabhängig programmieren: | ||
+ | '' | ||
+ | Ahnliches geht auch mit Präprozessormakros, | ||
+ | |||
+ | ==== Ungarische Notation ==== | ||
+ | |||
+ | Alle Namen, sowohl Variablen als auch Funktionen, werden mit Typ-Präfixen versehen. | ||
+ | |||
+ | <code cpp> | ||
+ | char* lpszName = " | ||
+ | int iGanzzahl; | ||
+ | |||
+ | IsActive = | ||
+ | (GetWindowLong(GetDlgItem(HWindow, | ||
+ | == WS_DISABLED; | ||
+ | </ | ||
+ | **Pro:** Jederzeit voller Durchblick über den Typ von Variablen. | ||
+ | Außerdem verwendet das erfolgreichste Software-Unternehmen der Welt diesen Stil. | ||
+ | |||
+ | **Kontra:** Voller Durchblick? | ||
+ | Hunderte Funktionen, die Dutzende Parameter brauchen, bilden die Windows-API. | ||
+ | Wer da vollen Durchblick behält, hat seinen Kopf für nichts anderes mehr frei. | ||
+ | Bei objektorientiertem Ansatz hätte hier vielleicht '' | ||
+ | Typpräfixe behindern die Kapselung und Abstraktion vom konkreten Datentyp | ||
+ | und erschweren die Änderung der Implementation. | ||
+ | Lesen Sie dazu den Artikel über {{ungarn|ungarische Notation]] in dieser Rubrik. | ||
+ | |||
+ | ==== Schwäbische Notation ==== | ||
+ | |||
+ | Schwaben sind sparsam, auch mit Kürzeln. Eigentlich haben nur Zeiger eine Kennung. | ||
+ | <code cpp> | ||
+ | float a=3, b=4, c=5; // bekannte Werte | ||
+ | float x, y, z; // unbekannte Groessen, siehe [Polya] | ||
+ | int i, j, k, l, m, n; // gute alte FORTRAN-Konventionen | ||
+ | int *p, *q; // baumelnde Zeiger | ||
+ | char* pName = " | ||
+ | char *s, *str; // Zeichenketten | ||
+ | </ | ||
+ | |||
+ | **Pro:** Viele lokale Variablen werden " | ||
+ | Zum Teil wirken hier mathematische Traditionen oder die Erfahrungen mit älteren Programmiersprachen. | ||
+ | |||
+ | **Kontra:** Kurze Namen sorgen nicht für Verständlichkeit. | ||
+ | Sie erfordern dann zusätzliche Kommentare. | ||
+ | Stimmen dann Kommentar und Quelltext nicht mehr überein, | ||
+ | sind vermutlich beide falsch. Nutzen Sie beschreibende Namen. | ||
+ | |||
+ | ==== Groß oder klein ==== | ||
+ | |||
+ | Nutzen Sie die Großschreibung als " | ||
+ | Auch hier haben sich Traditionen eingeschliffen. | ||
+ | Variablen, Funktionen und Methoden beginnen zumindest klein, | ||
+ | eigene Typnamen groß, Konstanten werden komplett aus Großbuchstaben gebildet. | ||
+ | |||
+ | <code cpp> | ||
+ | #define MAX 50 | ||
+ | enum Wochentag {DI, MI, DO}; // fuer Di-Mi-Do-Professoren | ||
+ | int maxi = max(x,y); | ||
+ | class Max; | ||
+ | </ | ||
+ | |||
+ | **Pro:** Es ist von Nutzen zu wissen, welche Rolle eine Bezeichnung spielt. | ||
+ | "Warum das so ist? Ich will es euch sagen: ich weiß es nicht! Das ist eben Tradition." | ||
+ | sagt Tevje im " | ||
+ | |||
+ | **Kontra:** Ich pfeife auf Traditionen. C++ ist meine Erstsprache. | ||
+ | Ich muss nicht nach den "alten Hasen" richten, schon gar nicht ihre Fehler wiederholen. | ||
+ | |||
+ | ==== get und set ==== | ||
+ | |||
+ | Methoden, die Werte holen oder setzen, machen dies durch Vorsilben get bzw. set deutlich. | ||
+ | |||
+ | <code cpp> | ||
+ | meinKonto.setGuthaben(deinKonto.getGuthaben()); | ||
+ | </ | ||
+ | |||
+ | **Pro:** Dies erhöht die Verständlichkeit. | ||
+ | |||
+ | **Kontra:** Was ist mit Funktionen, die sowohl Werte abfragen | ||
+ | als auch schreiben wie '' | ||
+ | Die get/ | ||
+ | die gleichnamige (überladene) Funktionen mit unterschiedlichen Parametern nicht zulassen. | ||
+ | Compiler für C++, Java, C#, ... interessiert get/set weniger als const | ||
+ | (siehe [[const|extra Kolumne]]). | ||
+ | |||
+ | ==== Unterschiedliche Parameterzahl ist ausreichend ==== | ||
+ | |||
+ | Welche Methoden Werte holen oder setzen, ist durch die Parameterzahl ersichtlich. | ||
+ | <code cpp> | ||
+ | int stellen = std:: | ||
+ | std:: | ||
+ | </ | ||
+ | **Pro:** Es ist doch offensichtlich, | ||
+ | dass eine Methode ohne Argument nur einen Wert holen kann. | ||
+ | |||
+ | **Kontra:** Quelltexte müssen ohne Nachdenken (!) lesbar sein. | ||
+ | Die Methode könnte auch Direktzugriff vermitteln. | ||
+ | |||
+ | ==== Direktzugriff ==== | ||
+ | |||
+ | Methoden referenzieren den direkten schreibenden oder lesenden Direktzugriff auf den Wert. | ||
+ | <code cpp> | ||
+ | template <class T> class vector | ||
+ | { public: | ||
+ | T const& at(int index) const { return data[safe(index)]; | ||
+ | T& | ||
+ | private: | ||
+ | T* data; | ||
+ | }; | ||
+ | |||
+ | vector< | ||
+ | float wert = v.at(5); | ||
+ | v.at(3) = wert+2.718; | ||
+ | </ | ||
+ | **Pro:** Im UML-Entwurf werden get/ | ||
+ | meist nicht aufgeführt. Dies übernehmen diese Methoden mit dem Attributnamen. | ||
+ | Die Attribute sind lesend und schreibend auf dieselbe Weise anzusprechen. | ||
+ | Bei einem '' | ||
+ | sonst die mit Schreibrechten. | ||
+ | |||
+ | **Kontra:** Der interne Datenwert muss dann anders genannt werden | ||
+ | (Namenskonflikt, | ||
+ | Der Referenz kann jeder Wert zugewiesen werden. | ||
+ | Dies unterliegt keiner Kontrolle durch den Programmierer. | ||
+ | |||
+ | ==== C# kann es noch besser ==== | ||
+ | |||
+ | Attributen werden Lese-/ | ||
+ | <code cpp> | ||
+ | public class Konto { | ||
+ | public int guthaben { | ||
+ | get { return guthaben; | ||
+ | set { guthaben = value; } // Prüfung value und Korrektur möglich | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | // ... | ||
+ | konto.guhaben = 1000000; | ||
+ | </ | ||
+ | **Pro:** Es sieht fast aus wie in UML: {readonly}-Attribute haben keine set-Eigenschaft. | ||
+ | |||
+ | **Kontra:** Language wars! Die Sprache kann man nur bei Projektbeginn wählen. | ||
+ | |||
+ | ==== Attributnamen wie im Entwurf ==== | ||
+ | |||
+ | Bei Attributnamen, | ||
+ | muss der Namenskonflikt bewusst aufgelöst werden, um Konfusion zu verhindern. | ||
+ | <code cpp> | ||
+ | class Datum | ||
+ | { | ||
+ | public: | ||
+ | Datum(int jahr, int monat, int tag); | ||
+ | int getJahr() const { return jahr; } | ||
+ | void setJahr(int neuesJahr) { jahr = neuesJahr; } | ||
+ | // ... | ||
+ | private: | ||
+ | int jahr, monat,tag; | ||
+ | }; | ||
+ | |||
+ | Datum:: | ||
+ | : jahr(j), monat(m), tag(t) | ||
+ | { | ||
+ | } | ||
+ | </ | ||
+ | **Pro:** Gleichnamige Funktionen und Attribute sind nicht möglich. | ||
+ | Funktionsparameter '' | ||
+ | können nicht in der Initialisiererliste unterschieden werden. | ||
+ | |||
+ | **Kontra:** Der Konstruktorrumpf kann nicht in die Klasse inline eingebettet werden, | ||
+ | ohne seine sprechende Parameterliste zu verlieren, | ||
+ | die gut für automatische Dokumentation (Doxygen) nutzbar wäre. | ||
+ | |||
+ | ==== Private Attributnamen umbenennen ==== | ||
+ | |||
+ | Verborgene Attributnamen werden markiert durch Unterstriche oder Vorsilben. | ||
+ | <code cpp> | ||
+ | class Datum | ||
+ | { | ||
+ | public: | ||
+ | Datum(int jahr, int monat, int tag); | ||
+ | : jahr_(jahr), | ||
+ | { | ||
+ | } | ||
+ | int jahr() const { return jahr_; } | ||
+ | void jahr(int neuesJahr) { jahr_ = neuesJahr; } | ||
+ | |||
+ | private: | ||
+ | int jahr_, monat_, tag_; | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | **Pro:** Unterstriche " | ||
+ | und machen den Implementationscharakter deutlich. | ||
+ | Auch beim internen Zugriff innerhalb von Methoden der Klasse | ||
+ | stellt der Unterstrich ein Warnsignal dar: Wäre es möglich oder gar besser, | ||
+ | den Zugriff über eine (öffentliche) Methode zu erreichen? | ||
+ | Den Overhead muss man nicht fürchten, wenn die Methoden inline implementiert sind. | ||
+ | Aber es spart Ärger und Arbeit, wenn sich die Daten-Implementation ändern muss. | ||
+ | |||
+ | **Kontra:** Womit wir wieder bei [[ungarn|Ungarischer]] | ||
+ | und ähnlicher Notation angekommen wären: | ||
+ | '' | ||
+ | Weitere Varianten sind '' | ||
+ | Ganz und gar abzuraten ist von Denglisch: jahr / year. | ||
+ | Da ist überhaupt nicht mehr klar, | ||
+ | welche Sprache innerhalb und ausserhalb der Klasse verwendet wird, | ||
+ | zumal in Klassen auch äußere Schnittstellen anderer Klassen verwendet werden. | ||
+ | |||
+ | ===== Qual der Wahl ===== | ||
+ | |||
+ | Ihre Abstimmung: | ||
+ | ^ Entscheidung ^ Ja ^ Unentschieden ^ Nein ^ | ||
+ | |möglichst kurze Namen | _ | _ | _ | | ||
+ | |keine Abkürzungen | _ | _ | _ | | ||
+ | |keine Unterstriche an Namen | _ | _ | _ | | ||
+ | |Unterstriche in langen Namen | _ | _ | _ | | ||
+ | |Müssen Namen " | ||
+ | |Wortarten beachten | _ | _ | _ | | ||
+ | |Vorsilben für Prädikate | _ | _ | _ | | ||
+ | |Ergebnistyp im Funktionsnamen erkenntlich | _ | _ | _ | | ||
+ | |Ungarische Notation verwenden | _ | _ | _ | | ||
+ | |Schwäbische Notation verwenden | _ | _ | _ | | ||
+ | |Groß-/ | ||
+ | |get/ | ||
+ | |gleiche Funktionsnamen, | ||
+ | |Direktzugriffsmethoden auf Attribute | _ | _ | _ | | ||
+ | |Zu C# wechseln? | _ | _ | _ | | ||
+ | |Attributnamen wie in Entwurf | _ | _ | _ | | ||
+ | |Kennung für Attribute | _ | _ | _ | | ||
+ | |||
+ | Ohne Konventionen ist man frei. Freiheit macht Angst. | ||
+ | Freiheit kann (auch andere) das Fürchten lehren. | ||
+ | Amokläufer scheren sich nicht um Konventionen. | ||
+ | Revolutionäre und Revoluzzer((Krachmacher, | ||
+ | die sich ihres Vorteils wegen für Umwälzer ausgeben und sich wie Dampfwalzen verhalten.)) | ||
+ | stellen Konventionen in Frage. Freiheit ist kein Kantischer Wert an sich. | ||
+ | Freiheit ist nicht Freiheit von allem, vor allem nicht Freiheit von Verantwortung. | ||
+ | Die Freiheit des Einzelnen endet an der Freiheit der anderen [Robespierre]. | ||
+ | Freiheit ist auch die Freiheit der Andersdenkenden [Luxemburg]. | ||
+ | Freiheit heißt nicht, alles tun zu können, sondern nicht tun zu müssen, | ||
+ | was man nicht will [Rousseau]. Freiheit heisst auch, sich entscheiden zu müssen. | ||
+ | Tue ich das nicht selbst, oder kann ich es nicht, dann tun es andere, für oder gegen mich. | ||
+ | |||
+ | ===== Quellen ===== | ||
+ | |||
+ | * [Polya] G. Polya: How to solve it. 2nd edn. Princeton Univ. Press (1945, 1985) 134-141, 208. | ||
+ | |||
+ | Dies war ein " | ||
+ | Möglicherweise ist auch dieser Text (nur) ein Beitrag zur Umweltverschmutzung. ... | ||
+ | |||
+ | Weiterführende Literatur: | ||
+ | |||
+ | * [Stroustrup] http:// | ||
+ | * [Google] | ||
+ | |||