Ihre Meinung über die Erklärung von Konstanten in Methoden ...?

8

Ein Entwickler in einem Team, das ich beaufsichtige, deklariert Variablen in seinen Tests vorzugsweise als Konstanten , z. const int someValue = 1; (und nicht nur int someValue = 1; ).

Als ich das sah, fand ich es ein bisschen komisch und fragte, was er getan hatte. Sein Argument ist, dass dies für die Zwecke dieses Tests sinnvoll ist - weil der Wert, den er zugewiesen hat, sich nie ändert.

Ich habe immer an Konstanten gedacht, die auf einer Klasse deklariert werden sollten. Allerdings sehe ich den Standpunkt dieses Entwicklers.

Was ist deine Meinung? Und, Tests beiseite, würden Sie Konstanten in normalen Methoden erklären? Wenn ja, warum?

    
Assaf Lavie 24.03.2009, 10:41
quelle

14 Antworten

20

Im Allgemeinen denke ich ist es immer eine gute Idee, Ihre Absichten auf diese Weise klarzustellen , und zwar aus einer Reihe von Gründen:

  • Es ist einfacher zu verstehen, was Sie damit gemeint haben, als Sie es geschrieben haben.
  • Es ist für andere einfacher, über Ihren Code nachzudenken, wenn er ihn liest.
  • Es ist einfacher für den Compiler, Rückschlüsse darüber zu ziehen, was Sie tun möchten.
  • Es ist einfacher für den Compiler, logische Fehler zu vermeiden.

Variablen konstant zu machen, ist ein absolut legitimer Weg, um all das oben genannte zu erreichen, in dem speziellen Fall, dass "Ich möchte nicht, dass diese Variable ihren Wert ändert".

    
John Feminella 24.03.2009 10:46
quelle
10

Von Effektive C ++ von Scott Meyers (Kapitel 3):

  

Verwenden Sie const nach Möglichkeit.

     

Das Wunderbare an const ist, dass Sie eine semantische Einschränkung angeben können - ein bestimmtes Objekt sollte nicht geändert werden - und Compiler werden diese Einschränkung erzwingen. Es ermöglicht Ihnen, mit Compilern und anderen Programmierern zu kommunizieren, dass ein Wert invariant bleiben soll. Wann immer das zutrifft, sollten Sie das unbedingt sagen, denn auf diese Weise können Sie die Hilfe Ihrer Compiler nutzen, um sicherzustellen, dass die Einschränkung nicht verletzt wird.

    
Bill the Lizard 24.03.2009 12:22
quelle
9

Wenn der Bezeichner nur innerhalb der Funktion verwendet wird, für die er deklariert ist, warum sollte er einen größeren Bereich damit umgehen? Wenn sich der Wert, der dem Bezeichner zugewiesen ist, nicht ändert, ist es für den Compiler ebenso nützlich, ihn zu markieren, als auch Fehler zu erkennen.

    
AnthonyWJones 24.03.2009 10:45
quelle
5

Wenn Sie eine statisch getippte Sprache verwenden wollen, warum gehen Sie nicht einfach die ganzen neun Meter? Verwenden Sie const , um anzugeben, dass der Wert nach der ersten Zuweisung nicht geändert werden soll. Lassen Sie den Compiler Sie Fehler machen, wenn Sie gehen.

Ich mochte das Schlüsselwort const in C ++ genau aus diesem Grund ...

    
Daren Thomas 24.03.2009 10:46
quelle
3

Die Idee ist, dass Sie das Zeug nur veränderlich lassen, wenn es einen bestimmten Grund dafür gibt - es macht es einfacher, über Ihren Code auf diese Weise nachzudenken.

    
Hank Gay 24.03.2009 10:44
quelle
3

Natürlich muss ein Wert, dem ein Name gegeben werden muss, der sich aber nicht ändern muss, als Konstante bezeichnet werden, da dies genau das ist.

Sicher, manchmal kann eine Konstante Teil einer Schnittstelle sein und / oder in einem breiteren Umfang verwendet werden, und dann muss sie an einem geeigneten Ort deklariert werden. Aber wenn es wirklich lokal ist, dann finde ich nichts seltsam daran, es so zu machen.

    
unwind 24.03.2009 10:45
quelle
3

Wenn der Wert auf die Methode beschränkt ist (d. h. nicht extern verwendet wird, aber einige Male im Inneren verwendet wird), dann ist es sinnvoll. Insbesondere wenn Sie mit XML arbeiten, haben Sie vielleicht einen XML-Namespace, der mehrmals verwendet wird (in nur einer Methode), aber sicherlich nicht etwas, das Sie mehr als einmal verwalten möchten - const ist ideal.

In Bezug auf C # hat dies auch Auswirkungen auf Schließungen:

%Vor%

unterscheidet sich von:

%Vor%

Die zweite muss eine Erfassungsklasse usw. generieren - die erste ist nur eine statische Methode (ohne Status) und effizienter (kein Heap-Objekt pro Verwendung, keine De-Referenz, usw.).

    
Marc Gravell 24.03.2009 10:46
quelle
3

Viele erfahrene C ++ - Entwickler glauben tatsächlich, dass "const" der Standard sein sollte, und Sie müssten etwas explizit als nicht-const deklarieren. Verwenden Sie const natürlich immer dann, wenn es sinnvoll ist. Wenn sich etwas innerhalb einer Funktion nicht ändern sollte, machen Sie es const. Es kostet nichts, und es hilft, Absicht zu erklären.

    
Brian Neal 24.03.2009 13:00
quelle
2

Der Vorteil, es als const zu deklarieren, ist, dass Sie es "nicht versehentlich" auf eine obskure Weise modifizieren können, die die Code-Inspektion übersehen könnte. Zum Beispiel indem man es durch Referenz in eine Funktion übergibt, die seinen Parameter modifiziert.

Der strittige Nachteil besteht darin, dass Sie ihn nicht (einfach) in Code übergeben können, der eine nicht konstante Referenz verwendet, die er nicht wirklich ändert. Wenn Sie wirklich an C ++ glauben, ist das tatsächlich ein versteckter Vorteil, weil es Sie ermutigt, den Rest Ihres Codes const-korrekt zu machen. Aber wenn Sie schnelle Änderungen vornehmen müssen (z. B. beim Debuggen) oder wenn Sie die API bereits veröffentlicht haben und nicht ändern können, dann sieht es für Sie wie eine verdammt gute Tarnung aus.

Wenn Funktionen kurz sind, brauchen Sie nicht unbedingt "const", um zu sagen, ob eine lokale Variable explizit durch Zuweisung geändert wird oder nicht. Sie können alle Verwendungen der Variablen direkt vor Ihnen sehen. Aber im wirklichen Leben, wo Funktionen manchmal lang werden; und wo Leute nicht-konstante Referenzparameter und manchmal sogar Makros verwenden; und wo Sie Code so schnell wie möglich lesen und verstehen wollen; dann kann es ein bisschen helfen.

Ich neige dazu, es zu benutzen, wenn ich mich erinnere, und schwitze es nicht, wenn ich es vergesse. Ich nutze es am meisten, wenn ich const aus einer Variablen entfernen muss. Das sagt mir, dass meine ursprüngliche Vorstellung von dieser Variablen falsch war, und ich muss sorgfältig prüfen, dass kein Ausdruck, der sie benutzt, darauf beruht, dass sie sich nicht ändert. Da C ++ das Schlüsselwort const hat, können Sie, wenn Sie Code schreiben, der auf einer sich nicht ändernden Variablen beruht, auch den Compiler auf Ihrer Seite haben.

Es lohnt sich normalerweise nicht, sich um Compiler-Optimierungen zu kümmern. Ein guter Compiler (gcc) kann sagen, dass, wenn Sie eine Variable nicht ändern und keine Referenzen darauf nehmen, kann sie entsprechende Optimierungen anwenden, ob Sie sie const markieren oder nicht.

    
Steve Jessop 24.03.2009 12:48
quelle
1

Ich neige dazu, irgendeinen Wert zu deklarieren, der const / final nicht ändert, und ermuntere andere in Teams, mit denen ich arbeite, dasselbe zu tun. Normalerweise in Java, wo final bedeutet "einmal und nur einmal zugewiesen" anstelle von C const "initialisiert und nicht geändert", können Sie Methoden erstellen, bei denen die einzigen nicht konstanten Werte Loop-Iteratoren sind.

    
Pete Kirkham 24.03.2009 10:56
quelle
1

Die Deklaration einer Variablenkonstante verhindert, dass Sie den Wert versehentlich ändern. Dies kann auch zu Compiler-Optimierungen führen.

    
SmuK 24.03.2009 10:47
quelle
1

Mach es überall dort, wo es möglich ist:

  • es macht den Code leicht lesbar;
  • Es fordert den Compiler auf, Ihre Gelegenheitsfehler zu überprüfen:

    %Vor%
  • es hilft Ihnen bei der Kompatibilität mit const -korrektem Code;

  • es hilft bei der Kapselung.
bayda 24.03.2009 11:02
quelle
0

Ich habe das vorher noch nie gesehen, aber es macht Sinn. Ich würde den Programmierer so weitermachen lassen, wie er es bereits entwickelt hat.

    
Alex 24.03.2009 10:47
quelle
0

Für Tests ist das natürlich großartig. Was den "normalen" Code angeht, könnte man ihn von beiden Seiten betrachten. Auf der einen Seite sollte der Umfang von irgendetwas im Code so klein wie möglich sein. Auf der anderen Seite könnte man sagen, dass eine Konstante eher in einer Klasse verwendet wird und daher immer auf Klassenebene deklariert werden sollte, um doppelte Konstanten zu vermeiden.

Ich würde sagen, deklariere nur Konstanten auf Klassenebene und verwende Methodenkonstanten nur dann, wenn es einen guten Grund dafür gibt. Ein Grund könnte sein, dass ein Methodenzweck darin besteht, eine Abstraktion bei einem bestimmten API-Aufruf bereitzustellen, und Sie benötigen dafür einige konstante Werte. In diesem Fall möchten Sie nicht, dass Konstanten auf Klassenebene den Rest einer Klasse durcheinander bringen.

    
Jonathan van de Veen 24.03.2009 12:47
quelle

Tags und Links