Wieso "const" verwenden?
-
Also Stroustrup weisst auf die Möglichkeit hin, sagt aber dann auch, dass es Geschmackssache ist. Weiss aber nicht mehr, was er bevorzugt.
-
asc schrieb:
Ich sehe den Gewinn den man durch const hat weiter als schwerwiegender als die Nachteile an. Und sei es nur das man den Code direkt ansieht was gemeint ist. Wie heißt es so treffend:
Code wird häufiger gelesen, als geschrieben
Alleine schon die Lesbarkeit ist für mich DAS Argument schlechthin.
das mit der lesbarkeit geht noch besser, mit ein paar #defines ins 'nichts'
#define IN #define OUT #define INOUT ... void MachWas ( IN int *a, // daten werden nur gelesen (bedeutet etwa 'const') OUT int *b, // daten werden nur geschrieben INOUT int *c, // daten werden gelesen und geschrieben ) { ... }
das finde ich sehr aussagekräftig und man hat keine 'const'-nervereien.
übrigens, ich hab' noch nie 'nen grösseren quelltext gesehen, der 'const' ausgiebig verwendet und bei dem deswegen nicht wild hin- und hergecastet, oder duplikate gebraucht werden (eine 'const' und eine nicht-'const' version).
-
drakon schrieb:
Also Stroustrup weisst auf die Möglichkeit hin, sagt aber dann auch, dass es Geschmackssache ist.
so zieht er sich öfter aus der affäre. wenn er ehrlich wäre, würde er sagen: 'sorry leute, aber ich habe da ganz grossen mist gebaut!'
-
lesbarkeits-freak schrieb:
#define IN #define OUT #define INOUT ... void MachWas ( IN int *a, // daten werden nur gelesen (bedeutet etwa 'const') OUT int *b, // daten werden nur geschrieben INOUT int *c, // daten werden gelesen und geschrieben ) { ... }
das finde ich sehr aussagekräftig und man hat keine 'const'-nervereien.
Und der Compiler hilft dir nicht, deine Versprechen umzusetzen (nämlich const Variablen auch wirklich const zu lassen)
übrigens, ich hab' noch nie 'nen grösseren quelltext gesehen, der 'const' ausgiebig verwendet und bei dem deswegen nicht wild hin- und hergecastet, oder duplikate gebraucht werden (eine 'const' und eine nicht-'const' version).
Wenn wild hin- und hergecastet werden muss und/oder die selbe Verison einer Methode mal in const und mal in nicht-const geschrieben werden muss, liegt das meist daran, dass jemand nicht durchgehend const-correct war oder ein designfehler vorliegt.
Ja, const ist ein Virus - aber einer von dem man recht wenig mitbekommen sollte wenn man durchgehend const-correct schreibt und nicht irgendwo das const aus Faulheit oder Gedankenlosigkeit weglässt. const und seine Auswirkungen immer im Hinterkopf zu behalten hilft, sichereren Code zu schreiben.
-
lesbarkeits-freak schrieb:
übrigens, ich hab' noch nie 'nen grösseren quelltext gesehen, der 'const' ausgiebig verwendet und bei dem deswegen nicht wild hin- und hergecastet, oder duplikate gebraucht werden (eine 'const' und eine nicht-'const' version).
Habe da genau umgekehrte Erfahrungen. Riesige Mengen Code, wichtige Projekte, viel const, kein Gecaste, keine Probleme.
Weiss aber nicht mehr, was er bevorzugt.
Was er bevorzugt hat nicht mehr Gewicht als das was mein Hund bevorzugt (solange mehr möglich ist). Und ich habe nicht einmal einen.
-
lesbarkeits-freak schrieb:
das mit der lesbarkeit geht noch besser, mit ein paar #defines ins 'nichts'
Nein, das ist die Katastrophe schlechthin, denn hier verlässt man sich als Leser darauf, dass diese Versprechen auch eingehalten werden, aber der Compiler weiß nichts davon und kann das deswegen nicht garantieren. 'const' wird vom Compiler wenigstens im Ansatz geprüft.
übrigens, ich hab' noch nie 'nen grösseren quelltext gesehen, der 'const' ausgiebig verwendet und bei dem deswegen nicht wild hin- und hergecastet, oder duplikate gebraucht werden (eine 'const' und eine nicht-'const' version).
Mir geht es wie Fellhuhn: Ich habe genau umgekehrte Erfahrungen.
Nochmal zu Stroustrup: Er bevorzugte, wenn ich mich richtig erinnere, die Präfix-Variante von 'const' und hat mich dadurch überzeugt, die Postfix-Variante zu verwenden (nicht, um ihm zu widersprechen, sondern weil er zugab, dass es eigentlich keinen Grund für die Präfix-Variante gibt, sehr wohl aber Argumente für die andere).
-
Blue-Tiger schrieb:
...es ist bei den const-Methoden ja eigentlich nur ein layouttechnischer "Hack"...
Also ich empfinde eher das "präfix-const" (also die Situation, in der sich das const auf das nachfolgende Token bezieht) als "Hack", weil er die Ausnahme ist. "postfix-const" funktioniert/gilt immer und überall ... präfix-const nur in dem einen Ausnahmefall.
Gruß,
Simon2.
-
Bei
int * const p = ...;
finde ich eher das alleine stehende * viel viel störender.
-
Fellhuhn schrieb:
Bei
int * const p = ...;
finde ich eher das alleine stehende * viel viel störender.
int* const p; int *const p;
Der * darf sich aussuchen mit wem er kuscheln will, damit er nicht gar so allein ist
-
Schon klar, nur sehe ich häufig in dem Code mit dem ich arbeite. Das stört mich ziemlich, da es die Lesbarkeit in meinen Augen ruiniert.
-
Fellhuhn schrieb:
Schon klar, nur sehe ich häufig in dem Code mit dem ich arbeite. Das stört mich ziemlich, da es die Lesbarkeit in meinen Augen ruiniert.
Ich habe es extra hier herausgetrennt da mit const immer die Frage ist: zu welcher Seite man den Stern schreibt (ich bevorzuge ihn näher am Datentyp, sofern der Wert nicht const ist).
cu André
-
asc schrieb:
Bei den folgenden Schreibweisen hat man den Vorteil direkt ablesen zu können was const ist (von rechts nach links):
geht auch von links nach rechts
//umgekehrt (li nach re) int const * value; //int-konstanten-zeiger int const * const value; //int-konstanten-zeiger-konstante
und wenn du's so liest kommst du um die postfix-schreibweise gar nicht mehr rum.
-
stylecheck-freak schrieb:
drakon schrieb:
Also Stroustrup weisst auf die Möglichkeit hin, sagt aber dann auch, dass es Geschmackssache ist.
so zieht er sich öfter aus der affäre. wenn er ehrlich wäre, würde er sagen: 'sorry leute, aber ich habe da ganz grossen mist gebaut!'
Das hat was. So auch mit der do/while - Schlaufe, von der er persönlich sogar abrät.
Nochmal zu Stroustrup: Er bevorzugte, wenn ich mich richtig erinnere, die Präfix-Variante von 'const' und hat mich dadurch überzeugt, die Postfix-Variante zu verwenden (nicht, um ihm zu widersprechen, sondern weil er zugab, dass es eigentlich keinen Grund für die Präfix-Variante gibt, sehr wohl aber Argumente für die andere).
Ja, so weit ich mich erinner,hat er tatsächlich die präfix - Variante gebraucht. Warum er das macht leuchtet mir nicht ganz ein. Habe im Kopf, dass es ihm besser gefällt, aber wie wir sehen, hat die andere Variante Vorteile (macht auch mehr Sinn). Aber auch Stroustrup ist nur ein Mensch.
-
do/while ist super, soll hier keiner was gegen do/while sagen!
(mein ernst)
-
Allerdings sieht man bei einem const typ schneller, dass es sich um eine Konstante handelt und imho sind die Modifier zunächst viel wichtiger als der Typ, den man bei Interesse ja sowieso am R-Wert erkennt.
-
Und es kommt der natürlichen Sprache entgegen, ich sag jedenfalls lieber "konstanter Integer" als "Integer, der konstant ist".
-
Tyrdal schrieb:
Und es kommt der natürlichen Sprache entgegen, ich sag jedenfalls lieber "konstanter Integer" als "Integer, der konstant ist".
"Integerkonstante" :p
Eigentlich finde ich das recht einfach und konsistent:
// "Die Variable ist ein(e) ... int // "... Integer" int const // "... Integerkonstante" int * // "... Integerzeiger" int const * // "...Integerkonstantenzeiger" int const * const // "...Integerkonstantenzeigerkonstante"
Gerade im Deutschen geht das ziemlich gut, weil wir diese Form von "Rückwärts-Komposita" haben. Die Franzosen dürften sich da viel schwerer tun.
Dieses "spricht-sich-komisch-Gefühl" kommt eigentlich eher durch die "Englischprägung" in diesem Bereich. (*)
Warum will man sagen "Konstante eines Zeigers auf ein Integer" ?
Man sagt doch auch nicht "Knopf von Hose von Wärter von Schranke" sondern "Schrankenwärterhosenknopf".
Gruß,
Simon2.
P.S.: (*) Wenn ich mich recht entsinne, ist in den englischen Programmierhandbüchern sogar immer die Rede von "integer constants" ... vielleicht entsteht unser "Seltsamgefühl" auch eher aus der Angewohnheit "const" als Adjektiv zu verstehen statt als Substantiv.
-
Nunja, aber ums konsistent zu halten müssten alle modifier rechts stehen.
Aber ich find int long unsigned als Extrem mal sehr merkwüdig.
-
Simon2 schrieb:
Tyrdal schrieb:
Und es kommt der natürlichen Sprache entgegen, ich sag jedenfalls lieber "konstanter Integer" als "Integer, der konstant ist".
"Integerkonstante" :p
Eigentlich finde ich das recht einfach und konsistent:
// "Die Variable ist ein(e) ... int // "... Integer" int const // "... Integerkonstante" int * // "... Integerzeiger" int const * // "...Integerkonstantenzeiger" int const * const // "...Integerkonstantenzeigerkonstante"
Gerade im Deutschen geht das ziemlich gut, weil wir diese Form von "Rückwärts-Komposita" haben. Die Franzosen dürften sich da viel schwerer tun.
Dieses "spricht-sich-komisch-Gefühl" kommt eigentlich eher durch die "Englischprägung" in diesem Bereich. (*)
Warum will man sagen "Konstante eines Zeigers auf ein Integer" ?
Man sagt doch auch nicht "Knopf von Hose von Wärter von Schranke" sondern "Schrankenwärterhosenknopf".
Gruß,
Simon2.
P.S.: (*) Wenn ich mich recht entsinne, ist in den englischen Programmierhandbüchern sogar immer die Rede von "integer constants" ... vielleicht entsteht unser "Seltsamgefühl" auch eher aus der Angewohnheit "const" als Adjektiv zu verstehen statt als Substantiv.
Schöne Herleitung!
Ich denke das ist eh bei jedem anders dieses Gefühl.. Obwohl ich auch der Meinung bin, dass man es immer (wenn möglich) gleich machen sollte. - Aber eben Geschmackssache.
-
Wobei man das mit dem immer gleich machen bei Leuten die mehr Sprachen als nur C++ verwenden auch anders sehen kann. Bei C# z.B. geht nur const int, und bei Java afaik auch nur final int