Klasse: Überall "this->" vorkleben?
-
Nexus schrieb:
Michael E. schrieb:
Ich habe die Diskussion nur am Rande verfolgt, aber das Fazit war glaube ich, dass reine dumme Setter im engeren Sinne kaum einer benutzt.
Ja, meist gilt das. Komplett ohne kommt man aber nicht aus. Und teilweise sind auch "dumme" Getter sinnvoll, siehe z.B. sf::Sprite.
Für die berühmten Ausnahmen dieser Regel habe ich das Wort "eigentlich" bemüht. Aber das ist eine ganz andere Baustelle und unabhängig von diesem Thema, da ich auch bei Setterparametern, wenn sie denn mal vorkommen, den abschließenden Unterstrich benutzen kann, statt ihn bei allen Membervariablen zu benutzen.
Das stimmt, aber du kannst das gleiche Argument auf const-qualifizierte lokale Variablen anwenden. Diese sind ebenfalls Implementierungsdetails, trotzdem können sie Fehler innerhalb der Funktion vermeiden -- auch wenn man Funktionen übersichtlich schreibt.
Hier halte ich es wie SeppJ. Benutzt du const für lokale Variablen, die nicht von Anfang an Konstanten sind? Also ich tu das nicht.
-
Michael E. schrieb:
Benutzt du const für lokale Variablen, die nicht von Anfang an Konstanten sind? Also ich tu das nicht.
Also ich benutze manchmal const&-Variablen
ctype<char> const& char_type = use_facet<ctype<char> >(cout.getloc());Allerdings auch nur, weil ich muss.
-
SeppJ schrieb:
Benutzt du const-qualifizierte lokale Variablen?
Ich wollte schon mit "ja" antworten, aber beim Anschauen einiger meiner Codes habe ich festgestellt, dass ich selten lokale Konstanten habe. Wenn, dann vor allem um Literalen einen sinnvollen Namen zu geben.
Konsequenterweise hätte man fast überall
const, auch in ungefährichen Situationen. Dadurch verliert es Aussagekraft und verkompliziert Code. Bei "m" habe ich dieses Gefühl nicht, der Lesefluss wird nicht unterbrochen und Ausdrücke bleiben klein.
-
Nexus schrieb:
Konsequenterweise hätte man fast überall
const, auch in ungefährichen Situationen. Dadurch verliert es Aussagekraft und verkompliziert Code. Bei "m" habe ich dieses Gefühl nicht, der Lesefluss wird nicht unterbrochen und Ausdrücke bleiben klein.Hat auch niemand behauptet. Du hast mit dem const-Vergleich angefangen :p
Edit: Nur, um das nochmal klarzustellen: Ich zwinge niemanden dazu, meine Variante für die beste zu halten. Wer in seinem Code Prä- oder Suffixe verwenden will, soll das meinetwegen tun (vor allem wenn ich den Code nie zu Gesicht bekomme
). Ich habe lediglich geschrieben, warum ich für mich persönlich keinen Vorteil darin sehe.
-
Ich finde es toll, wie hier direkt von einer Qualifizierung für Scopes geredet wird.
Ich bin leider gezwungen, die Membervariablen besonders zu kennzeichnen, weil folgendes nicht geht:class foo { size_t size; public: size_t size(); }Deswegen bekommen die bei mir einen Unterstrich am Ende. Und zwar nur deswegen.
-
Nexus schrieb:
Shade Of Mine schrieb:
und N Stufen Funktionslokale Variablen (denke an Closures).
Meinst du Lambda-Ausdrücke? Wo hast du da eine neue Scopekategorie? Sowohl inner- als auch ausserhalb sind für mich lokale Variablen. Nur werden die Funktionen halt zu unterschiedlichen Zeitpunkten aufgerufen. Aber wahrscheinlich habe ich dich hier falsch verstanden...
Ja, meine ich. Lokale Funktionen.
Du erzeugst damit neue Scopes. Warum kennzeichnest du diese nicht?
denk einmal ueber die unterschiedlichen scopes nach. durch templates verdoppelt sich die scope anzahl ja auch wieder:
template<typename s1> class C { int s2; public: template<typename s3> void foo(int s4) { int s5; for(int s6=0; s6<10; ++s6) { int s7; bar([](){int s8;}); } } };jede Variable hat einen eigenen Scope. ich bin bis level 8 gekommen ohne auch nur irgendwie verschachtelten oder komischen code zu haben.
Was macht den scope s2 so besonders im vergleich zu sagen wir mal s1?
Oder warum ist s5 nicht anders gekennzeichnet als s7? es ist doch innerhalb der Schleife relevant ob die Variable am ende des Schleife noch existiert (s5) oder zumindest den Wert zwischen den durchlaeufen behaelt (s6) oder jedesmal neu initialisiert wird (s7).Ich habe noch nichtmal das captures von variablen angesprochen. dadurch kannst du ploetzlich variablen in andere scopes importieren...
@Nathan:
das ist ein Problem mit der namensgebung. In den meisten Sprachen verwendet man getSize() statt size() bzw. gleich echte Properties.
-
Ich denke solange man Coding Styles nicht übertreibt und diese selbsterklärend sind, sind sie fast alle in Ordnung. Nicht wie in einem Projekt das ich sah: CFestgelegteTranslationPxyzJRxbJzRz
Ich klebe gerne this-> vor Klassen-Members dran und stelle globalen Variablen ein g voran. Natürlich kann man jedem einzelen Scope ein Präfix zuordnen. Aber das macht die Sache realtiv schnell unübersichtlich.
In kenne ein paar C/C++ Projekte wo es sehr viele globale Variablen gibt und da ist es einfach schön anhand des Namens festzustellen ob diese global sind oder nicht. Einfach aus Gewohnheit.
Dumme Frage in die Runde: Wer von euch stellt einer Klassenbezeichnung ein t vornean: Bsp.: tPoint?
-
Bitte ein Bit schrieb:
Dumme Frage in die Runde: Wer von euch stellt einer Klassenbezeichnung ein t vornean: Bsp.: tPoint?
Ich nicht, ich halte es allgemein wie Michael E.. Jedoch ist bei mir im Code schon erkennbar, was eine Typenbezeichnung ist und was nicht, weil ich eine andere Case-Konvention (meistens PascalCase) benutze.
Begründung: Es wäre zwar nicht wirklich nötig, da aus dem Zusammenhang klar ist, was eine Typbezeichnung ist und was nicht, aber ein bisschen Groß- und Kleinschreibung ist angenehmer zu lesen und es erlaubt auch Konstrukte wie
Ding ding;, die ich öfters benutze (denn oftmals ist keine weitere Beschreibung nötig, welchesDinggenaudingist).
-
SeppJ schrieb:
Begründung: Es wäre zwar nicht wirklich nötig, da aus dem Zusammenhang klar ist, was eine Typbezeichnung ist und was nicht, aber ein bisschen Groß- und Kleinschreibung ist angenehmer zu lesen und es erlaubt auch Konstrukte wie
Ding ding;, die ich öfters benutze (denn oftmals ist keine weitere Beschreibung nötig, welchesDinggenaudingist).
In kenne ein paar C/C++ Projekte wo es sehr viele globale Variablen gibt und da ist es einfach schön anhand des Namens festzustellen ob diese global sind oder nicht.
Na ja, das Projekt leidet vermutlich unter anderen Problemen als Code-Konventionen, richtig?
-
Shade Of Mine schrieb:
@Nathan:
das ist ein Problem mit der namensgebung. In den meisten Sprachen verwendet man getSize() statt size() bzw. gleich echte Properties.Ja, es ist ein Problem der Namensgebung.
Gelöst habe ich das mit einem Unterstrich am Ende.
-
SeppJ schrieb:
Begründung: Es wäre zwar nicht wirklich nötig, da aus dem Zusammenhang klar ist, was eine Typbezeichnung ist und was nicht, aber ein bisschen Groß- und Kleinschreibung ist angenehmer zu lesen und es erlaubt auch Konstrukte wie
Ding ding;, die ich öfters benutze (denn oftmals ist keine weitere Beschreibung nötig, welchesDinggenaudingist).Ich würde da "
ding d" schreiben.
Begründung: Code sieht einheitlich aus, weil ich viel Standardbibliothek+Boost nutze. Dass es eigene Klassen sind, stelle ich durch namespaces fest.
dist ausserdem ein kürzerer Name alsding(und genauso vielsagend), was den Code übersichtlicher macht. Meine Funktionen sind in der Regel weniger als 10 Zeilen lang, da kennt man meistens alle Variablen.Unterstriche verwende ich eigentlich wie Nathan und würde dann aber immer den Getter verwenden und nie direkt auf die Membervariable zugreifen.
-
Dann doch lieber gleich
D d. Ach Quatsch. LCD-Monitore ziehen mehr Strom, wenn sie schwarze Pixel anzeigen. Da ich Schwarz auf Weiß programmiere (ökonomisch und ökologisch!) sollten also Bezeichner eine möglichst geringe Pixelzahl haben. '_" ist gut, 'i', 'I' und '1' auch. Richtig guter Code sollte also am besten so aussehen_ I(_1 i) { _ II; for(_ __ = i.i; _ != i.I; --i) // Operator-- überladen, so dass er um 1 erhöht II -= *i; // Ebenso -=. Ist einfach weniger Pixel als +=. _I II; // Mit #define _I return }
-
rationaler coder schrieb:
SeppJ schrieb:
Begründung: Es wäre zwar nicht wirklich nötig, da aus dem Zusammenhang klar ist, was eine Typbezeichnung ist und was nicht, aber ein bisschen Groß- und Kleinschreibung ist angenehmer zu lesen und es erlaubt auch Konstrukte wie
Ding ding;, die ich öfters benutze (denn oftmals ist keine weitere Beschreibung nötig, welchesDinggenaudingist).Ich würde da "
ding d" schreiben.
Begründung: Code sieht einheitlich aus, weil ich viel Standardbibliothek+Boost nutze. Dass es eigene Klassen sind, stelle ich durch namespaces fest.
dist ausserdem ein kürzerer Name alsding(und genauso vielsagend), was den Code übersichtlicher macht. Meine Funktionen sind in der Regel weniger als 10 Zeilen lang, da kennt man meistens alle Variablen.Unterstriche verwende ich eigentlich wie Nathan und würde dann aber immer den Getter verwenden und nie direkt auf die Membervariable zugreifen.
+1
-
SeppJ schrieb:
<getrolle>
Achso, du schreibst lieber
const MeinIntTypedef anfangsWertFuerDieSchleife = ZAHL_NULL; const MeinIntTypedef exklusiverEndWertFuerDieSchleife = anfangsWertFuerDieSchleife + ZAHL_HUNDERT; for (MeinIntTypedef temporaereZaehlvariableFuerDieseSchleife = anfangsWertFuerDieSchleife; temporaereZaehlvariableFuerDieseSchleife < exklusiverEndWertFuerDieSchleife; inkrementiereMeinIntTypedef(temporaereZaehlvariableFuerDieseSchleife)statt
for (int i=0; i<100; ++i)
-
d? Ist nicht Dein Ernst. Zwei Klassen, die mit demselben Namen anfangen, führen dann ja zu zwei anderen Objekten. ding ist vielsagend, es zeigt, dass es eine Instanz der Ding-Klasse ist. d sagt nichts, da gehe ich von irgendeinem temporären double-Wert oder so aus.
Bin aber auch nicht sicher, ob das ernst gemeint war. Ich benutze einbuchstabige Bezeichner nur für Zählvariablen, bei denen die Funktion so eindeutig ist wie bei einer mathematischen Formel, sodass es in den 3-4 Zeilen dann wirklich unübersichtlich ist. Verschachtelt es sich, ist das aber schon nicht mehr angemessen, wie ich finde.
rationalerCoder:
Du bist wohl farbenblind oder wieso siehst Du nur schwarz/weiß? Ich stempel Dich Mal als Troll ab.
-
Naja, was ist denn Ding?
Ist Ding z.B. Point, dann hab ich schon 1000mal Point p; gesehen und mich nicht daran gestört.
Oder in Java ist es auch nicht ungewöhnlich, Objekte die nur in einem kleinen Scope leben, nach den groß geschriebenen Buchstaben zu benennen
(sowas wie FileInputStream fis)
-
Das ist doch ganz einfach zu lösen: Anstatt einem langen, beschreibenden Namen zu benutzen könnte man dem Kurznamen einfach ein kleines Präfix verpassen, das beschreibt, von welchem Typ die Variable ist. Wenn man Pp, ip und up schreibt, dann ist klar, dass jeweils ein Point, ein int und ein unsigned gemeint sind. Das gleiche sollte man der Ordnung halber am besten auch für Typnamen einführen: C für class, S für struct, t für typedef. Dieses Schema klingt ungeheuer vielversprechend
.
-
Und "ding" ist dieser lange, beschreibende Name von dem du sprichst?
-
Ich verstehe den Bezug SeppJs Argument zu Jockelx Beitrag nicht, da es nicht um Präfixe sondern Hauptbezeichner geht.
Also man kann schon p für Point benutzen... aber mit so was würde ich aufpassen. Für Wenigzeiler finde ich es wohl noch okay, aber so häufig kommen die ja auch nicht vor. Als Parameter für Funktionen finde ich es schon schlecht, weil die Funktionen damit ja etwas machen und das auch nicht immer direkt auf der Hand liegt. Und selbst wenn man es sich denken kann, macht man den Nutzen durch den Namen explizit.
Und einbuchstabige Bezeichner führen eben zum Namenskonflikt, wenn auch alternative Klassennamen in Frage kommen. Bei d denke ich zum Beispiel an double, bei p könnte man an einen Pointer denken. So was wie fis für FileInputStream finde ich wiederum okay, weil man da höchstens an eine Musiknote denkt, das führt wohl nicht zum Konflikt. Dann wiederum könnte der Code-Einseher sich trotzdem wundern. Da ist ein voller Bezeichner einfach klarer. Kurze Bezeichner sparen nur etwas Tipparbeit, aber da ich sowieso ding vorgeschlagen bekomme, sobald ich d eingebe, ist das Argument für mich nicht ziemlich schwach.
rationalerCoder:
Falls ich denke, dass es hilft, wähle ich übrigens wirklich Bezeichner, die so lang wie Deine sind und auch viel aussagen. Natürlich nicht für solche trivialen Fälle, aber in komplexeren Situationen kann das wirklich helfen.
-
Ich dachte es geht sowieso nur um sehr lokale Objekte. Natürlich ist das als Funktionsparameter Mist.
Aber ich halt mich da jetzt raus.
Glaube nicht, dass das zu was führt.