Schlechter Bezeichner: Unterschied zwischen den Versionen

Aus Programmieren-Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 11: Zeile 11:
Innerhalb von Schleifen sind einzelne Buchstaben wie i, j und k erlaubt. Ähnlich dazu ist auch bei Koordinaten x und y erlaubt.  
Innerhalb von Schleifen sind einzelne Buchstaben wie i, j und k erlaubt. Ähnlich dazu ist auch bei Koordinaten x und y erlaubt.  
Statt n jedoch sollte man length oder size verwenden (oder natürlich etwas, was in dem Kontext des Quellcodes Sinn ergibt).
Statt n jedoch sollte man length oder size verwenden (oder natürlich etwas, was in dem Kontext des Quellcodes Sinn ergibt).
In der equals Methode wäre Beispielweise <syntaxhighlight inline>equals(Object o)</syntaxhighlight> nicht zulässig. Das lässt sich aber leicht beheben, indem man <syntaxhighlight inline>equals(Object other)</syntaxhighlight> oder <syntaxhighlight inline>equals(Object object)</syntaxhighlight> wählt.
In der equals Methode wäre Beispielweise <syntaxhighlight lang="Java" inline>equals(Object o)</syntaxhighlight> nicht zulässig. Das lässt sich aber leicht beheben, indem man <syntaxhighlight lang="Java" inline>equals(Object other)</syntaxhighlight> oder <syntaxhighlight lang="Java" inline>equals(Object object)</syntaxhighlight> wählt.


==== Abkürzungen ====
==== Abkürzungen ====
Abkürzungen sollen vermieden werden, da deren Bedeutung nicht (immer) klar ist und dadurch der Quellcode unnötig schwer zu verstehen ist.  
Abkürzungen sollen vermieden werden, da deren Bedeutung nicht (immer) klar ist und dadurch der Quellcode unnötig schwer zu verstehen ist.  
Beispiele hierfür sind:
Beispiele hierfür sind:
<syntaxhighlight inline>obj</syntaxhighlight> statt <syntaxhighlight inline>object</syntaxhighlight>, <syntaxhighlight inline>scan</syntaxhighlight> statt <syntaxhighlight inline>scanner</syntaxhighlight>, <syntaxhighlight inline>num</syntaxhighlight> statt <syntaxhighlight inline>number</syntaxhighlight>, etc...
<syntaxhighlight lang="Java" inline>obj</syntaxhighlight> statt <syntaxhighlight lang="Java" inline>object</syntaxhighlight>, <syntaxhighlight lang="Java" inline>scan</syntaxhighlight> statt <syntaxhighlight lang="Java" inline>scanner</syntaxhighlight>, <syntaxhighlight lang="Java" inline>num</syntaxhighlight> statt <syntaxhighlight lang="Java" inline>number</syntaxhighlight>, etc...


==== Nichtssagenden oder unspezifische Bezeichner ====
==== Nichtssagenden oder unspezifische Bezeichner ====
Nichtssagende oder unspezifische Bezeichner erschweren auch das lesen und verstehen des Quellcodes, da hier erst aus dem Kontext verstanden werden muss, wofür die Variable genutzt wird.
Nichtssagende oder unspezifische Bezeichner erschweren auch das lesen und verstehen des Quellcodes, da hier erst aus dem Kontext verstanden werden muss, wofür die Variable genutzt wird.
Beispiele hierfür sind:
Beispiele hierfür sind:
<syntaxhighlight inline>something</syntaxhighlight>, <syntaxhighlight inline>variable</syntaxhighlight>, <syntaxhighlight inline>array</syntaxhighlight>, <syntaxhighlight inline>regex</syntaxhighlight>, <syntaxhighlight inline>error</syntaxhighlight>, <syntaxhighlight inline>pattern</syntaxhighlight>, ...
<syntaxhighlight lang="Java" inline>something</syntaxhighlight>, <syntaxhighlight lang="Java" inline>variable</syntaxhighlight>, <syntaxhighlight lang="Java" inline>array</syntaxhighlight>, <syntaxhighlight lang="Java" inline>regex</syntaxhighlight>, <syntaxhighlight lang="Java" inline>error</syntaxhighlight>, <syntaxhighlight lang="Java" inline>pattern</syntaxhighlight>, ...


==== Unnötige Prä- oder Suffixe ====
==== Unnötige Prä- oder Suffixe ====
Prä- bzw. Suffixe verlängern nur unnötig den Bezeichner, ohne diesem einen sinnvollen Informationsmehrwert zu geben. Im folgenden ist zum Beispiel klar, welcher Datentyp dem Bezeichner zugewiesen wird und muss nicht nochmal in dem Bezeichner festgeschrieben werden:
Prä- bzw. Suffixe verlängern nur unnötig den Bezeichner, ohne diesem einen sinnvollen Informationsmehrwert zu geben. Im folgenden ist zum Beispiel klar, welcher Datentyp dem Bezeichner zugewiesen wird und muss nicht nochmal in dem Bezeichner festgeschrieben werden:
<syntaxhighlight inline>myArray</syntaxhighlight> statt <syntaxhighlight inline>array</syntaxhighlight>, <syntaxhighlight inline>passwordObj</syntaxhighlight> statt <syntaxhighlight inline>password</syntaxhighlight>, <syntaxhighlight inline>passwordList</syntaxhighlight> statt <syntaxhighlight inline>passwords</syntaxhighlight>, <syntaxhighlight inline>IInterface</syntaxhighlight> statt <syntaxhighlight inline>Interface</syntaxhighlight>, ...
<syntaxhighlight lang="Java" inline>myArray</syntaxhighlight> statt <syntaxhighlight lang="Java" inline>array</syntaxhighlight>, <syntaxhighlight inline>passwordObj</syntaxhighlight> statt <syntaxhighlight lang="Java" inline>password</syntaxhighlight>, <syntaxhighlight lang="Java" inline>passwordList</syntaxhighlight> statt <syntaxhighlight lang="Java" inline>passwords</syntaxhighlight>, <syntaxhighlight lang="Java" inline>IInterface</syntaxhighlight> statt <syntaxhighlight lang="Java" inline>Interface</syntaxhighlight>, ...


==== Sehr ähnliche Bezeichner ====
==== Sehr ähnliche Bezeichner ====
Bei Bezeichnern die einen sehr ähnliche Bezeichner teilen, kann es schnell zu Verwirrung und Tippfehlern kommen, sowohl bei der entwickelnden Person, als auch der Person, die den Quellcode darauf hin versucht zu verstehen:
Bei Bezeichnern die einen sehr ähnliche Bezeichner teilen, kann es schnell zu Verwirrung und Tippfehlern kommen, sowohl bei der entwickelnden Person, als auch der Person, die den Quellcode darauf hin versucht zu verstehen:
<syntaxhighlight inline>string1</syntaxhighlight>, <syntaxhighlight inline>string2</syntaxhighlight>, <syntaxhighlight inline>sTring1</syntaxhighlight>, ...
<syntaxhighlight lang="Java" inline>string1</syntaxhighlight>, <syntaxhighlight lang="Java" inline>string2</syntaxhighlight>, <syntaxhighlight lang="Java" inline>sTring1</syntaxhighlight>, ...


==== Booleans ====
==== Booleans ====
Um den Lesefluss des Quellcodes zu verbessern, ist es Norm einem Boolean ein Verb als Präfix zu geben. So sollte zu Beispiel statt <syntaxhighlight inline>on</syntaxhighlight>, <syntaxhighlight inline>isOn</syntaxhighlight> verwendet werden.
Um den Lesefluss des Quellcodes zu verbessern, ist es Norm einem Boolean ein Verb als Präfix zu geben. So sollte zu Beispiel statt <syntaxhighlight lang="Java" inline>on</syntaxhighlight>, <syntaxhighlight lang="Java" inline>isOn</syntaxhighlight> verwendet werden.
|schweregrad=leicht
|schweregrad=leicht
|negativ=<syntaxhighlight lang="Java">
|negativ=<syntaxhighlight lang="Java">

Version vom 28. April 2024, 18:10 Uhr

🚧 Diese Seite befindet sich in Bearbeitung 🚧
🤓 Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 1 annotiert und ab Blatt 2 abgezogen wird. 🤓

Beschreibung

Gute Bezeichner für Variablen, Klassen, Methoden, etc. sind der erste, wichtige Schritt um Quellcode verständlich zu gestalten. Zwar ist es unmöglich *alle* schlechten Bezeichner aufzuzählen, jedoch gibt es einige Regeln:

Bezeichner in anderen Sprachen

Der komplette Quellcode ist auf englisch zu erstellen. Entsprechend sollen auch die Bezeichner für Variablen entsprechend gewählt werden. Bezeichner, die einen Namen in anderen Sprachen außer Englisch erhalten gelten damit als schlechter Stil und geben nach dieser Richtlinie Abzug. Grund dafür, ist wie auch bei anderen Richtlinien, die sich auf die Lesbarkeit beziehen, dass Englisch die gängigste Sprache ist und nicht jeder alle anderen Sprachen versteht. Eine solche Grundlage bietet also einen verlässlichen Standard.

Einzelne Buchstaben

Innerhalb von Schleifen sind einzelne Buchstaben wie i, j und k erlaubt. Ähnlich dazu ist auch bei Koordinaten x und y erlaubt. Statt n jedoch sollte man length oder size verwenden (oder natürlich etwas, was in dem Kontext des Quellcodes Sinn ergibt). In der equals Methode wäre Beispielweise equals(Object o) nicht zulässig. Das lässt sich aber leicht beheben, indem man equals(Object other) oder equals(Object object) wählt.

Abkürzungen

Abkürzungen sollen vermieden werden, da deren Bedeutung nicht (immer) klar ist und dadurch der Quellcode unnötig schwer zu verstehen ist. Beispiele hierfür sind: obj statt object, scan statt scanner, num statt number, etc...

Nichtssagenden oder unspezifische Bezeichner

Nichtssagende oder unspezifische Bezeichner erschweren auch das lesen und verstehen des Quellcodes, da hier erst aus dem Kontext verstanden werden muss, wofür die Variable genutzt wird. Beispiele hierfür sind: something, variable, array, regex, error, pattern, ...

Unnötige Prä- oder Suffixe

Prä- bzw. Suffixe verlängern nur unnötig den Bezeichner, ohne diesem einen sinnvollen Informationsmehrwert zu geben. Im folgenden ist zum Beispiel klar, welcher Datentyp dem Bezeichner zugewiesen wird und muss nicht nochmal in dem Bezeichner festgeschrieben werden: myArray statt array, passwordObj statt password, passwordList statt passwords, IInterface statt Interface, ...

Sehr ähnliche Bezeichner

Bei Bezeichnern die einen sehr ähnliche Bezeichner teilen, kann es schnell zu Verwirrung und Tippfehlern kommen, sowohl bei der entwickelnden Person, als auch der Person, die den Quellcode darauf hin versucht zu verstehen: string1, string2, sTring1, ...

Booleans

Um den Lesefluss des Quellcodes zu verbessern, ist es Norm einem Boolean ein Verb als Präfix zu geben. So sollte zu Beispiel statt on, isOn verwendet werden.


Negativbeispiel

public final class Main {

    private final static int DREI = 3;
    
    private Main() {

    }

    public static void main(String[] args) {
        int[] integerArray = new int[DREI];
        fillArray(integerArray, 9);
    }

    public static void fillArray(int[] one, int two) {
        for (int i = 0; i < one.length; i++) {
            one[i] = two + i;
        }
    }
}
  • Was wenn wir nicht mehr 3 als Index verwenden wollen? Dann müssten wir den Bezeichner der entsprechenden Konstante auch ändern im gesamten Quellcode. DREI = 4 würde dann nämlich auch keinen Sinn mehr ergeben.
  • integerNumber sagt nichts über die Verwendung der Variablen aus.
  • integerArray macht den Quellcode nur unnötig lang. Wir wissen, dass es ein Array aus Integern ist, weil direkt vornedran der Datentyp schon deklariert wurde.

Positivbeispiel

public final class Main {
    
    private final static int CAPACITY = 3;
    private final static int DEFAULT_VALUE = 9;
    
    private Main() {

    }

    public static void main(String[] args) {
        int[] relevantNumbers = new int[CAPACITY];
        fillArray(relevantNumbers, DEFAULT_VALUE)
    }
    
    public static void fillArray(int[] array, int defaultValue) {
        for (int i = 0; i < array.length; i++) {
            array[i] = defaultValue + i;
        }
    }
}

Hier sind die Bezeichner aussagekräftig und eindeutig. Wir wissen direkt, ohne direkt den Wert der Konstanten anzuschauen, was die Konstante macht bzw. wofür sie da ist. Wir verstehen den Quellcode also ohne Probleme.

Mehr zu diesen Regelungen und Konventionen