Bedeutungslose Konstanten: Unterschied zwischen den Versionen

Aus Programmieren-Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(5 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Bewertungsrichtlinie
{{Bewertungsrichtlinie
|baustelle=Ja
|baustelle=Nein
|blatt=3
|blatt=2
|beschreibung=Zahlen und Zeichenketten (Strings) die fest im Quellcode enthalten sind, sollen als Konstante im Kopf der Klasse deklariert werden.
|beschreibung=Konstanten ermöglichen es, Konzepte explizit zu modellieren, die sonst nur durch ihre Werte repräsentiert werden. Deswegen sollten Konstanten immer nach dem Konzept und nicht dem Wert benannt werden. Eine Konstante <code>public static final String COMMAND_KEYWORD_SEPARATOR = " ";‎</code> hat als Wert eine Zeichenkette, die nur ein Leerzeichen enthält. Deswegen sollte sie aber nicht ‎<code>SPACE‎</code> heißen, da dies nicht das unterliegende Konzept ist. Das Konzept, das hier modelliert wurde, ist das Trennzeichen für die Schlüsselworte eines Befehls. Während sich der Wert der Konstante in Zukunft (z.B. andere Darstellung des UIs) ändern kann, bleibt das Konzept gleich. Deswegen ist es auch möglich, dass mehrere Konstanten den gleichen Wert haben. Diese sollten aber aus Gründen der Wartbarkeit dennoch separate Konstanten sein, wenn sie verschiedene Konzepte modellieren.
Da diese Konstante im Quellcode verteilt ist, soll deren Bezeichner entsprechend aussagekräftig sein. Dadurch lässt sich auch später der Inhalt der Konstante leichter und vor allem überall gleichzeitig ändern.
 
Sämtliche Regelungen von oben gelten auch für Konstanten.
 
Zahlen und Zeichenketten (Strings) die fest im Quellcode enthalten sind, sollen als Konstante im Kopf der Klasse deklariert werden.
Sämtliche Regelungen von oben gelten für Konstanten.
|schweregrad=leicht
|schweregrad=leicht
|negativ=<syntaxhighlight lang="Java">
|negativ=<syntaxhighlight lang="Java">
public class Player {
    // Bad: Naming the constant based on its value, not the concept
 
     public static final String SPACE = " ";
     private final static String FIVE = 5;
     public static final int NUMBER_THREE = 3;
     private final String name;
     public static final String GUEST = "guest";
    private int experience;
 
     public Player(String name) {
        this.name = name;
        this.experience = 0;
    }
 
    public void addExperience(int experienceGained) {
        this.experience += (FIVE * experienceGained);
    }
}
}
</syntaxhighlight>
</syntaxhighlight>
FIVE besitzt in diesem Fall keine Bedeutung, da wir nicht wissen, wofür es stehen soll. Vergleichbar ist es mit dem weglassen der Einheiten in der Schule: "Fünf was..? Kartoffeln?". In der Methode können wir auch nicht erkennen, wofür die Konstante jetzt eigentlich gebraucht wird, beziehungsweise was sie tut.
 
Und jetzt stellen wir uns mal vor, 5 wäre nicht mehr der korrekte Wert und wir müssten ihn umändern in eine 10. Hinter FIVE den Wert 10 zu "verstecken" wäre schrecklich, insbesondere wenn wir überall im Quellcode jetzt die Konstante von FIVE zu TEN umschreiben müssten... was ein Aufwand.
In diesem Fall sind die Konstanten nach den Werten benannt. Man kann als Leser aber nicht erkennen, wofür die Konstante verwendet wird, also welches Konzept sie repräsentiert. Wenn sich der Wert eine Konstante ändert, passt zudem der Name nicht mehr.
|positiv=<syntaxhighlight lang="Java">
|positiv=<syntaxhighlight lang="Java">
public class Player {
public class Player {
 
    // Good: Naming constants based on the concepts they represent
     private final static String EXPERIENCE_MODIFIER = 5;
     public static final String COMMAND_KEYWORD_SEPARATOR = " ";
     private final String name;
     public static final int MAX_CONNECTION_RETRIES = 3;
    private int experience;
     public static final String DEFAULT_USERNAME = "guest";
 
     public Player(String name) {
        this.name = name;  
        this.experience = 0;
    }
 
    public void addExperience() {
        this.experience += (EXPERIENCE_MODIFIER * experienceGained);
    }
}
}
</syntaxhighlight>
</syntaxhighlight>
Hier wissen wir jetzt direkt für was unsere Konstante steht und können auch direkt in der Methode ablesen was passieren soll. Auch können wir den Wert abändern, ohne überall den Konstantennamen ändern zu müssen, es ist ja nachwievor klar, wofür die Konstante da ist.
 
Hier beschreiben die Namen der Konstanten genau, wofür die Konstanten genutzt werden. Wichtig: Selbst wenn der Wert der Konstante geändert wird (weil z.B. es mehr als 3 Verbindungsversuche geben soll), muss der Name der Konstante nicht geändert werden.
|kategorie=Bewertungsrichtlinie, Programmierstil
|kategorie=Bewertungsrichtlinie, Programmierstil
|weiterlesen=Ja
|weiterlesen=Ja
|seite=Schlechter Bezeichner
|seite=Konstanten-Klasse, Schlechter Bezeichner, Magic Number
}}
}}
{{DISPLAYTITLE:Bedeutungslose Konstanten}}
{{DISPLAYTITLE:Bedeutungslose Konstanten}}

Aktuelle Version vom 17. Oktober 2024, 11:33 Uhr

🤓 Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 2 annotiert und ab Blatt 3 abgezogen wird. 🤓

Beschreibung

Konstanten ermöglichen es, Konzepte explizit zu modellieren, die sonst nur durch ihre Werte repräsentiert werden. Deswegen sollten Konstanten immer nach dem Konzept und nicht dem Wert benannt werden. Eine Konstante public static final String COMMAND_KEYWORD_SEPARATOR = " ";‎ hat als Wert eine Zeichenkette, die nur ein Leerzeichen enthält. Deswegen sollte sie aber nicht ‎SPACE‎ heißen, da dies nicht das unterliegende Konzept ist. Das Konzept, das hier modelliert wurde, ist das Trennzeichen für die Schlüsselworte eines Befehls. Während sich der Wert der Konstante in Zukunft (z.B. andere Darstellung des UIs) ändern kann, bleibt das Konzept gleich. Deswegen ist es auch möglich, dass mehrere Konstanten den gleichen Wert haben. Diese sollten aber aus Gründen der Wartbarkeit dennoch separate Konstanten sein, wenn sie verschiedene Konzepte modellieren.


Zahlen und Zeichenketten (Strings) die fest im Quellcode enthalten sind, sollen als Konstante im Kopf der Klasse deklariert werden. Sämtliche Regelungen von oben gelten für Konstanten.


Negativbeispiel

    // Bad: Naming the constant based on its value, not the concept
    public static final String SPACE = " ";
    public static final int NUMBER_THREE = 3;
    public static final String GUEST = "guest";
}

In diesem Fall sind die Konstanten nach den Werten benannt. Man kann als Leser aber nicht erkennen, wofür die Konstante verwendet wird, also welches Konzept sie repräsentiert. Wenn sich der Wert eine Konstante ändert, passt zudem der Name nicht mehr.

Positivbeispiel

public class Player {
    // Good: Naming constants based on the concepts they represent
    public static final String COMMAND_KEYWORD_SEPARATOR = " ";
    public static final int MAX_CONNECTION_RETRIES = 3;
    public static final String DEFAULT_USERNAME = "guest";
}

Hier beschreiben die Namen der Konstanten genau, wofür die Konstanten genutzt werden. Wichtig: Selbst wenn der Wert der Konstante geändert wird (weil z.B. es mehr als 3 Verbindungsversuche geben soll), muss der Name der Konstante nicht geändert werden.


Wenn du diese Seite interessant fandest, findest du hier noch mehr Seite(n) dazu:
Konstanten-KlasseSchlechter BezeichnerMagic Number