Home > Informatik > Begriffe und Konzepte > Bezeichner

Bezeichner

Regeln für gute Bezeichner

aus dem Buch "Clean Coding" von Robert C. Martin (2009)

Use Intention-Revealing Names

Benutze Namen, die den Sinn enthüllen. Der Name einer Variable, Methode oder Klasse sollte alle wichtigen Informationen darüber enthalten, welche Aufgabe sie erfüllt, warum sie existiert und wie sie benutzt wird. Wenn der Name kommentiert werden muss, ist es kein sinnvoller Name.

Schlechte Beispiele:

int d; // elapsed time in days
List < String > list1 = new ArrayList<>(); // list of candidates

Bessere Beispiele:

int elapsedTimeInDays;
List < String > listOfCandidates = new ArrayList<>();

Die Bezeichner sind hier so gewählt, dass kein Kommentar notwendig ist, der ihre Bedeutung erklärt.

Avoid Disinformation

Vermeide verwirrende oder irreführende Namen. Wenn ein Name das Wort "List" enthält, sollte es sich auch tatsächlich um eine Liste handeln und nicht um einen Array oder einen Binärbaum.

Vermeide mehrere sehr ähnlich klingende Namen, die leicht verwechselt werden können wie xPosition, x_Position und xPos;

Vermeide Namen, die Schlüsselworte anderer Sprachen sind wie begin oder procedure.

Vermeide l und O als Bezeichner, sie sind kaum von 1 und 0 zu unterscheiden.

if (l==1 && O==0)

Diese Bedingung ist sehr schwer zu lesen.

Make Meaningful Distinctions

Mache sinnvolle Unterscheidungen. Die Namen von mehreren Variablen, Methoden oder Klassen sollten sich auf eindeutige Weise voneinander unterscheiden.

Schlechte Beispiele:

getActiveAccount()
getActiveAccounts()
getActiveAccountInfo()

class Customer
class CustomerObject

String name;
String nameString;

Person hero;
Person theHero;

Ganz oben sehen wir drei Methodennamen, die sich kaum unterscheiden. Woher soll der Benutzer oder die Benutzerin der Methode wissen, welche Methode was macht und welche gerade aufgerufen werden sollte.

Die beiden Klassen Customer und CustomerObjekt sind ein schlechtes Beispiel für Klassennamen. In welchen Aspekten unterscheiden sich die beiden Klassen?

Das Gleiche gilt für die Variablen name und nameString. Ist nicht jeder Name automatisch ein String?

Auch das letzte Beispiel zeigt zwei schlecht gewählte und kaum unterscheidbare Bezeichner. Was genau ist der Unterschied zwischen hero und theHero? Ist theHero vielleicht der Hauptheld und hero nur ein Nebenheld?

Use Pronounceable Names

Benutze aussprechbare Namen! Die Namen von Variablen, Methoden und Klassen sollten gut aussprechbar sein. Wählt man schlecht aussprechbare Namen, hört man sich "wie ein Idiot" an, wenn man mit Teamkollegen über den Quelltext spricht:

"Well, over here on the bee cee arr three cee enn tee we have a pee see zee kyew int, see?"

Das passiert dann, wenn man Namen wie int bcr3cnt und int pczq verwendet.

Use Searchable Names

Benutze Namen, die man leicht suchen (und ersetzen) kann. Namen, die nur aus einem oder zwei Buchstaben bestehen wie d oder n, können bei einem Suchvorgang im Quelltext nur sehr schlecht gefunden werden bzw. werden ständig gefunden, weil diese Buchstaben in allen möglichen Worten wie int oder double vorkommen.

Das gilt übrigens auch für Zahlenwerte, die immer wieder im Quelltext vorkommen. Hat man beispielsweise eine Klasse GanzeZahl angelegt mit einem aus 100 int-Zahlen bestehendem Array, dann tauch immer wieder for-Schleifen auf wie

for (int i=0; i<100; i++)

die dann den Array durchsuchen, ausgeben oder verändern. Will man jetzt den Array von 100 auf 200 Zahlen erweitern, muss man jedes Vorkommen der 100 durch 200 ersetzen. In der Regel sucht man dann nach der Zahl 100 und ersetzt sie durch die Zahl 200.

Bei einem Array kann man sich mit Array.length helfen, aber in anderen Fällen ist das nicht möglich.

Besser wäre es hier, die Arraylänge und andere immer wieder vorkommende gleiche Zahlen in Konstanten zu speichern, die dann einfach im Kopf der Klasse stehen und leicht an neue Anforderungen angepasst werden können.

Class Names

Die Namen von Klassen sollten Substantive sein. Zweideutige Namen wie Klasse, Daten, Infos etc. sollten aber vermieden werden.

Method Names

Die Namen von Methoden sollten ein Verb enthalten, zum Beispiel ausgeben(), anzeigen(), idealgewichtBerechnen() etc.

Für Setter- und Getter-Methoden gelten besondere Regeln. Sie beginnen mit dem Präfix set bzw. get (oder setze bzw. gib) gefolgt von dem Namen des Attributs, das sie auslesen oder berechnen bzw. setzen oder verändern: setRadius(), gibIdealgewicht() etc.

Der Präfix is (bzw. ist) wird für boolean-Methoden verwendet: isPrime(), istVorhanden() etc.

Pick One Word per Concept

Benutze immer den gleichen Namen für das gleiche Konzept. Stellen mehrere ähnliche Klassen analoge Funktionen zur Verfügung, dann sollten die Methoden auch gleiche Namen haben.

Angenommen, wir haben drei Graphik-Klassen Circle, Square und Triangle, dann sollten die Methoden zum Verändern/Auslesen der Größe in jeder Klasse den gleichen Namen haben, zum Beispiel setDiameter() / getDiameter().

Wenn diese Methode in jeder Klasse einen anderen Namen hat, ist das in höchstem Maße verwirrend.

Schlechtes Beispiel:

Circle.fetchXPos()
Square.getXPos()h
Triangle.retrieveXPos()

Gutes Beispiel:

Circle.getXPos()
Square.getXPos()
Triangle.getXPos()
  1. Martin, Clean Code - A Handbook of Agile Software Craftmanship. Pearson Education 2009