Stilregeln zu Namen in Java (Stilregeln zu Namen in Java), Lektion, Seite 723813
https://www.purl.org/stefan_ram/pub/stilregeln_name_java (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Java-Kurs

Stilregeln zu Namen in Java 

Groß- und Kleinschreibung

Der Name einer Variablen sollte im allgemeinen nur aus kleinen  Buchstaben bestehen, jedoch werden Wörter einer natürlichen Sprache (wie Deutsch oder Englisch), die im Namen nicht  am Anfang vorkommen, mit großem  Anfangsbuchstaben geschrieben. Beispiele sind »weight« und »extraWeight«.

Aussprachehinweis
extra weight ˈɛk strə ˈweɪt

Programmierer bevorzugen oft englische Bezeichnungen als Grundlage zur Bildung von Namen. In diesem Kurs verwenden wir zunächst oft deutsche Bezeichnungen, weil diese für deutschsprachige Leser verständlich sind und verdeutlichen, daß die Namen keine Schlüsselwörter der Programmiersprache sind.

Sprechende Namen (Mnemonische Namen)

Das folgende Programm berechnet das Volumen einer Kugel mit dem Radius »3.«.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 4./3. * 4. * java.lang.Math.atan( 1. )* java.lang.Math.pow( 3., 3. )); }}
Protokoll
113.09733552923254

Angenommen der Radius betrüge nicht »3.«, sondern »4.«, an welchen Stellen wäre das voranstehende Programm abzuändern?

Welcher Flüchtigkeitsfehler könnte passieren, wenn in dem obigen Programm der Radius von »3.« in »4.« geändert werden soll?

Welchen Sinn soll die Berechnung von »java.lang.Math.atan( 1. )« haben?

Das folgende Programm erleichtert das Verständnis seines Quelltextes durch die Einführung sprechender  und bedeutungstragender Namen  für magische Werte  und erleichtert es auch, den Radius zu verändern, ohne versehentlich etwaige andere Vorkommen des Numerales »3.« ebenfalls abzuändern.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double pi = 4. * java.lang.Math.atan( 1. );
final double r = 3.;
final double kugelvolumen = 4./3. * pi * java.lang.Math.pow( r, 3. );
java.lang.System.out.println( kugelvolumen ); }}
Protokoll
113.09733552923254

Ein weitere Vorteil der neuen Version besteht nun auch darin, daß ein großer Ausdruck durch mehrere kleinerere  Ausdrücke abgelöst wurde, die jeweils übersichtlicher und schon durch ihre Kürze besser verständlich sind.

Es ist beim ersten Programm auch schwieriger, überhaupt beurteilen zu können, ob es korrekt ist, da man ja nicht weiß, was es überhaupt ausrechnen soll.

Stilregel Sprechende Namen  sollen gegenüber magischen Werten  bevorzugt werden.

An sich wäre ein ausgeschriebenes Wort wie »radius« noch verständlicher als ein Buchstabe wie »r«, jedoch ist »r« eine im Fachgebiet eingeführte und wohlbekannte Bezeichnung für den Radius.

Wahl eines Namens

Ein irreführender Name, wie »zehn« für den Wert von »12« in dem folgenden Beispiel, sollte natürlich vermieden werden. Eine Java -Implementation versteht kein Deutsch, daher kann sie nicht erkennen, daß der Name unpassend ist. Für den Computer ist ein Name ohne Bedeutung: Ein Name verknüpft nur die verschiedenen Stellen seiner Verwendung. Für Menschen, die ein Programm lesen, ist ein verständlicher und aussagekräftiger Name jedoch sehr hilfreich.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 12 );
final int zehn = 12;
java.lang.System.out.println( zehn ); }}
java.lang.System.out
12
12

Stilregel Ein Name sollte seine Bedeutung  kurz und verständlich wiedergeben.

Falls in einem Fachgebiet oder bei Verwendung bestimmter Programmierungsmuster bestimmte Namen für bestimmte Dinge eingebürgert (üblich) sind, sollte diese eingebürgerten Namen verwendet werden.

Kommentare als Indikatoren

Früher hatten Computer wenig Speicher und deswegen war man damals in manchen Fällen gezwungen, kurze Namen mit einem oder zwei Zeichen zu verwenden und deren Bedeutung dann mit einem Kommentar zu erläutern.

Ein Kommentar, der einen zu wenig aussagekräftigen Namen erklären muß, legt eine Verbesserung des Namens nahe, nach welcher der Kommentar dann entfernt werden kann.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double m = 11; /* Mehrwertsteuer */
java.lang.System.out.println( m ); }}
Protokoll
11.0
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double mehrwertsteuer = 11;
java.lang.System.out.println( mehrwertsteuer ); }}
Protokoll
11.0

Unter einem Indikator  verstehen wir hier einen Teil eines Quelltextes, der es nahelegt, zu prüfen, ob eine Verbesserung des Quelltextes durch einen bestimmten Refaktor erreicht werden kann. Ein Kommentar, der einen Variablennamen erläutert, ist ein Indikator für den Refaktor des Umbenennens einer Variablen (und eventuell des Entfernens eines Kommentars).

Gültigkeitsbereiche

Wenn Gültigkeitsbereiche von Namen klein sind, dann können Programmstücke einfacher verstanden, überarbeitet und kombiniert werden. Es kommt seltener vor, daß ein eigentlich passender Name nicht deklariert werden kann, weil er schon an einer anderen (entfernten) Stelle deklariert wurde.

Eine der wichtigsten Empfehlungen aus der Softwaretechnik lautet deshalb:

Stilregel Der Gültigkeitsbereich eines Bezeichners sollte immer so klein wie möglich sein.

Um so größer ein Programm wird, um so wichtiger wird die Beachtung dieser Regel.

Begründung 

1.) Ein kleiner Gültigkeitsbereich ist übersichtlicher; seine Übersichtlichkeit verhindert Fehler  und erleichtert die Überarbeitung  von Quelltext.

2.) Wenn ein begehrter Variablenname, wie »i«, als Gültigkeitsbereich beispielsweise 10.000 Zeilen hätte, obwohl die Variablen »i« nur in einem kleinem Programmteil von drei  Zeilen benötigt wird, dann würde der Bezeichner »i« dadurch unnötigerweise für andere Programmteilen blockiert  werden. Ein kleiner Gültigkeitsbereich erlaubt es, einen schönen Bezeichner wie »i« in verschiedenen Programmteilen  für jeweils unterschiedliche Zwecke  wiederzuverwenden. Der Programmierer kann diesen Namen wählen, ohne sich Sorgen machen zu müssen, ob jener Name vielleicht auch schon an anderen Stellen eines großen Programms gebraucht wird.

3.) Programmteile, in denen fast alle Namen lokal sind, können leichter zu einem größeren Programm verbunden werden.

Quellen

Minimize the scope of local variables ” in “Effective Java ” – Joshua Bloch  (2008-05) (Second Edition).

Beispiel

In dem folgenden Programm haben die die Konstanten »text« beispielsweise einen kleinen Gültigkeitsbereich. Dadurch ist es sofort erkennbar, daß jede Konstante »text« nur zu der ihrer Deklaration direkt folgenden Ausgabeanweisung gehört und danach nicht mehr benötigt wird.

Main.java

public final class Main
{ public static void main( final java.lang.String[] args )
{

{ final java.lang.String text = "Auf einem Baum ein Kuckuck sass.";
java.lang.System.out.println( text );
java.lang.System.out.println( text ); }

{ final java.lang.String text = "Da kam ein junger Jaegersmann.";
java.lang.System.out.println( text );
java.lang.System.out.println( text ); }

{ final java.lang.String text = "Der schoss den armen Kuckuck tot.";
java.lang.System.out.println( text );
java.lang.System.out.println( text ); }}}

Protokoll
Auf einem Baum ein Kuckuck sass.
Auf einem Baum ein Kuckuck sass.
Da kam ein junger Jaegersmann.
Da kam ein junger Jaegersmann.
Der schoss den armen Kuckuck tot.
Der schoss den armen Kuckuck tot.

In dem folgenden Text wurde der Gültigkeitsbereich der drei Konstanten »text« nun unnötig vergrößert: Es kommt zu einer Namenskollision, und es ist nicht mehr erkennbar, welche Konstante zu welcher Ausgabeanweisung gehört.

Main.java

public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.String text = "Auf einem Baum ein Kuckuck sass.";
final java.lang.String text = "Da kam ein junger Jaegersmann.";
final java.lang.String text = "Der schoss den armen Kuckuck tot.";

{ java.lang.System.out.println( text );
java.lang.System.out.println( text ); }

{ java.lang.System.out.println( text );
java.lang.System.out.println( text ); }

{ java.lang.System.out.println( text );
java.lang.System.out.println( text ); }}}

Protokoll
Main.java:4: error: variable text is already defined in method main(String[])
final java.lang.String text = "Da kam ein junger Jaegersmann.";
^
Main.java:5: error: variable text is already defined in method main(String[])
final java.lang.String text = "Der schoss den armen Kuckuck tot.";
^
2 errors

In dem folgenden Text wurden die Konstanten »text« nun umbenannt, um die Namenskollision zu vermeiden. Das Programm kann nun zwar wieder gestartet werden, aber es ist schwieriger zu erkennen, wo eine Konstante verwendet wird. Außerdem sind nun gewisse Formen der Überarbeitung des Programms, die wir erst später behandeln werden, erschwert. Da der passende Name »text« nicht mehr für alle Variablen verwendet werden konnte, mußte auf schlechtere Namen wie »text2« ausgewichen werden, die bedeutungslose Ziffern enthalten. Außerdem ist der Abstand zwischen der Deklaration und der Verwendung eines Namens größer, so daß man beim Lesen öfter über einen längeren Text hin- und herspringen muß, um beispielsweise nach dem Lesen einer Verwendung die Deklaration zu lesen.

Main.java

public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.String text0 = "Auf einem Baum ein Kuckuck sass.";
final java.lang.String text1 = "Da kam ein junger Jaegersmann.";
final java.lang.String text2 = "Der schoss den armen Kuckuck tot.";

{ java.lang.System.out.println( text0 );
java.lang.System.out.println( text0 ); }

{ java.lang.System.out.println( text1 );
java.lang.System.out.println( text1 ); }

{ java.lang.System.out.println( text2 );
java.lang.System.out.println( text2 ); }}}

Protokoll
Auf einem Baum ein Kuckuck sass.
Auf einem Baum ein Kuckuck sass.
Da kam ein junger Jaegersmann.
Da kam ein junger Jaegersmann.
Der schoss den armen Kuckuck tot.
Der schoss den armen Kuckuck tot.

Variablen zur Vermeidung der Wiederholung komplexer Ausdrücke

Stilregel Wenn schon etwas wiederholt werden muß, dann ist es besser Verweise  auf eine Information (beispielsweise Namen dieser Information) zu wiederholen, als die Information selber. Jede Information sollte nur einmal (nur an einer Stelle) gespeichert werden.

Begründung: Wenn die Information verändert werden muß, dann ist sie bei Speicherung an einer einzigen Stelle nur einmal (also auf einfache Weise) zu ändern.

Das folgende Programm berechnet die Mehrwertsteuer zu 150, 130 und 170 in einem Land mit 11 Prozent Mehrwertsteuer.

Wenn der Mehrwertsteuersatz nun geändert werden muß, dann wird es mühevoll, alle Vorkommen des Mehrwertsteuersatzes in dem Programm zu finden. Zum einen kann der Mehrwertsteuersatz unterschiedlich geschrieben sein, als »0.11«, »11 / 100.« oder noch anders. Zum anderen kann ein Vorkommen eines Wertes wie »11« auch manchmal eine ganz andere Bedeutung haben als den Mehrwertsteuersatz.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 0.11 * 150 );
java.lang.System.out.println( 11 / 100. * 130 );
java.lang.System.out.println( 11 * 170 / 100. );
java.lang.System.out.println( 11 / 100. * 40 ); }}
Protokoll
16.5
14.3
18.7
4.4

In dem folgenden Programm wurde die Wiederholung einer Information  durch die Wiederholung eines Namens für diese Information  ersetzt. Nun ist es einfacher und sicherer diese Information bei Bedarf zu ändern, und das ganze Programm ist übersichtlicher und verständlicher.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double mehrwertsteuersatz = 11/100.;
java.lang.System.out.println( mehrwertsteuersatz * 150 );
java.lang.System.out.println( mehrwertsteuersatz * 130 );
java.lang.System.out.println( mehrwertsteuersatz * 170 );
java.lang.System.out.println( 11 / 100. * 40 ); /* keine Mehrwertsteuerberechnung */ }}
Protokoll
16.5
14.3
18.7
4.4

In manchen Fällen dient die Verwendung der Wiederholung eines Namens an Stelle der Wiederholung einer Information auch der Verkürzung des Programms und damit potentiell auch dem Einsparen von Speicherplatz.

In dem folgenden Programm wird ein langer Text wiederholt verwendet.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( "Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist." );
java.lang.System.out.println( "Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist." );
java.lang.System.out.println( "Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist." ); }}
transcript
Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist.
Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist.
Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist.

In dem folgenden Programm wurde die Wiederholung des langen Satzes durch die Wiederholung eines kurzen Namens ersetzt. Dadurch wurde das Programm insgesamt verkürzt.

Main.java

public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.String satz = "Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist.";

java.lang.System.out.println( satz );
java.lang.System.out.println( satz );
java.lang.System.out.println( satz ); }}

transcript
Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist.
Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist.
Dieses hier ist ein sehr langer Satz, der nun wirklich sehr lang ist.

Dokumentation

Wir haben die Bedeutung von Namen aus der Standardbibliothek der Dokumentation  entnommen.

Wenn in einem Programm nun zusätzliche Namen durch eine Deklaration eingeführt werden, dann spielt die Deklaration die Rolle der Proklamation der Dokumentation, und der Programmierer kann dort nachlesen, um den Typ und Wert eines Namens zu erfahren.

Allerdings fehlt dabei noch eine Erklärung der Bedeutung  eines Namens.

Die Bedeutung eines Namens sollte möglichst schon durch seine Bedeutung im Deutschen oder Englischen zum Ausdruck gebracht werden.

Falls es dann noch wichtige Informationen gibt, sollten diese durch einen Kommentar an geeigneter Stelle angegeben werden. Hierbei denkt man zunächst an einen Kommentar für eine einzelne Deklaration. Es ist aber auch möglich Erläuterungen in einem Kommentar zusammenfassend zu mehreren zusammengehörigen Namen zu geben.

Stilregel Erklärungen sollten bevorzugt durch den Quelltext außerhalb von Kommentaren ausgedrückt werden, beispielsweise durch Namen. Wichtige Informationen, die nicht schon durch den Quelltext außerhalb von Kommentaren ausgedrückt werden können, sollten in Kommentaren festgehalten werden. Kommentare sollten nichts wiederholen, das schon dem Quelltext entnommen werden kann, außer, wenn der Quelltext so kompliziert ist, daß er der Erläuterung bedarf. In diesem Fall sollte aber zunächst versucht werden, den Quelltext so zu vereinfachen, daß er möglichst schon ohne Kommentare verständlich ist.

Main.java

public final class Main
{ public static void main( final java.lang.String[] args )
{ final double mehrwertsteuersatz = 12/100.; /* gueltig ab 1. Juli 1979 */
final double rechnungsbetrag = 150;
final int zahlDerMonateEinesJahres = 12;
final int anzahlDerJahre = 5; /* Vertragslaufzeit laut Telephonat
mit Herrn Seidel vom 7. Juni 1978 */
java.lang.System.out.println
( "Die Mehrwertsteuer fuer den Taschenrechner TR-120 betraegt DM " +
mehrwertsteuersatz * rechnungsbetrag +
"." );

java.lang.System.out.println
( "Die Laufzeit des Vertrags V-2 betraegt " +
zahlDerMonateEinesJahres * anzahlDerJahre +
" Monate." ); }}

Protokoll
Die Mehrwertsteuer fuer den Taschenrechner TR-120 betraegt DM 18.0.
Die Laufzeit des Vertrags V-2 betraegt 60 Monate.

 

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723813 stefan_ram:723813 Stilregeln zu Namen in Java Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723813, slrprddef723813, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/stilregeln_name_java