Codekonventionen: Unterschied zwischen den Versionen

Aus EINI
Wechseln zu: Navigation, Suche
(Konventionen für Bezeichner in Java)
Zeile 1: Zeile 1:
Eine Codekonvention ist eine Übereinkunft unter Programmierern einen gewissen Stil beim Schreiben ihrer Programme einzuhalten. Über die Jahre hinweg haben sich in fast allen Programmiersprachen eine oder mehrere solcher Standards gebildet.
+
Eine '''Codekonvention''' ist eine Übereinkunft unter Programmierern, beim Schreiben ihrer [[Programm]]e einen gewissen Stil einzuhalten. Über die Jahre hinweg haben sich in fast allen [[Programmiersprachen]] eine oder mehrere solcher '''Standards''' gebildet.
  
== Verständlichkeit eines Algorithmus ==
+
= Verständlichkeit eines Algorithmus =
  
 +
==Erläuterung==
  
Ein wichtiges Merkmal für einen Algorithmus ist die Möglichkeit für einen menschlichen Leser den Algorithmus lesen und verstehen zu können, obwohl er nicht in umgangssprachlicher Form vorliegt.
+
Ein wichtiges Merkmal eines [[Algorithmus]] ist, dass ein menschlicher Leser ihn verstehen kann, obwohl er nicht in umgangssprachlicher Form vorliegt.
  
Als Beispiel sei folgender Algorithmus gegeben, der zwei Zahlen miteinander multipliziert, ohne explizit einen Multiplikationsoperator zu verwenden:
+
==Beispiel==
 +
 
 +
Als Beispiel sei folgender Algorithmus gegeben, der zwei Zahlen miteinander multipliziert, ohne explizit einen [[Operator|Multiplikationsoperator]] zu verwenden.
 +
 
 +
1. In '''[[Pseudocode]]''' sieht das ganze so aus:
  
 
  Eingabe: Zwei ganze Zahlen a und b
 
  Eingabe: Zwei ganze Zahlen a und b
Zeile 15: Zeile 20:
 
     Gebe das Ergebnis zurück
 
     Gebe das Ergebnis zurück
  
Beispiel für eine schwer verständliche Formulierung des Algorithmus':
+
2. Beispiel für eine '''schwer verständliche''' Formulierung des Algorithmus:
  
 
   <source>
 
   <source>
Zeile 21: Zeile 26:
 
   </source>
 
   </source>
  
Das gleiche Beispiel, lesbarer und mit Syntaxhighlighting hervorgehoben:
+
3. Das gleiche Beispiel, '''lesbarer''' und mit Syntaxhighlighting:
 
   <source lang="java">public static int berechnen(int a, int b)
 
   <source lang="java">public static int berechnen(int a, int b)
 
   {
 
   {
Zeile 32: Zeile 37:
 
   }</source>
 
   }</source>
  
Beide Programme führen das gleiche aus. Beide berechnen das Produkt von ''a'' und ''b'', ohne eine Multiplikation durchzuführen. Sie addieren ''b'' ''a''-mal auf eine Ergebnisvariablen auf, Genaueres s. [[Schleife | Schleifen]]. Diese Variable wird zum Schluss zurückgegeben.
+
Beide Programme führen dasselbe aus. Beide berechnen das Produkt von ''a'' und ''b'', ohne eine Multiplikation durchzuführen. Sie addieren ''b'' ''a''-mal auf eine Ergebnisvariablen <code>erg</code> auf. Diese [[Variable]] wird zum Schluss zurückgegeben.
 +
 
 +
Genaueres zur Funktionsweise des Algorithmus: siehe [[Schleife]]
 +
 
 +
= Bezeichner und Leerzeichen =
 +
 
 +
Da in [[Programmiersprachen]] der Text maschinell analysiert werden muss, um später vom [[Compiler]] übersetzt werden zu können, gilt es ''immer'' folgendes zu beachten:
 +
 
 +
Eine Zeichenkette, die als '''Bezeichner''' für ein Programmelement genutzt wird, darf '''keine Leerzeichen''' (engl. ''whitespaces'') beinhalten.  
  
== Bezeichner und Leerzeichen ==
+
Mit Leerzeichen versehen werden Beginn und Ende des Bezeichners uneindeutig [[Deklaration|deklariert]]. Daher ist dies in fast allen Programmiersprachen verboten. Um trotzdem einen Bezeichner aus mehr als einem Wort bestehen zu lassen, verwenden Programmierer verschiedene Formen der '''Notation''', die im Folgenden erklärt werden.
  
Da in Programmiersprachen der Text maschinell analysiert werden muss um später vom Compiler übersetzt werden zu können, gibt es folgendes immer zu beachten: Eine Zeichenkette, die als Bezeichner für ein Programmelement genutzt wird, darf keine Leerzeichen (engl. ''whitespaces'') beinhalten. Dies würde ansonsten den Beginn und das Ende des Bezeichners uneindeutig deklarieren und die Analyse dieses Programmteils wäre um ein vielfaches aufwändiger! Deswegen verbieten fast alle Programmiersprachen dies. Um jedoch nun einen Bezeichner aus mehr als einem Wort bestehen lassen zu können, verwenden Programmierer verschiedene Formen der Notation, die im Folgenden erklärt werden.
+
= Notationsbegriffe =
  
== Notationsbegriffe ==
+
Im Zusammenhang mit '''Codekonventionen''' haben sich verschiedene Begriffe etabliert:
  
Im Zusammenhang mit Codekonventionen haben sich verschiedene Begriffe etabliert:
+
'''Lower-Case''' (''engl.'' für "Kleinbuchstaben"): Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während alle Buchstaben klein geschrieben werden.
 +
*z.B.: <code>nanosecondsinsecond</code>, <code>valueineuro</code>, <code>positionx</code>, <code>positiony</code>
  
* Lower-Case: Aus dem englischem für "Kleinbuchstaben". Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während alle Buchstaben klein sind. '''Beispiele''': <code>nanosecondsinsecond</code>, <code>valueineuro</code>, <code>positionx</code>, <code>positiony</code>
+
'''Upper-Case'''(''engl.'' für "Großbuchstaben"): Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während alle Buchstaben groß geschrieben werden.
 +
*z.B.: <code>NANOSECONDSINSECOND</code>, <code>VALUEINEURO</code>, <code>POSITIONX</code>, <code>POSITIONY</code>
  
* Upper-Case: Aus dem englischen für "Großbuchstaben". Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während alle Buchstaben groß sind. '''Beispiele''': <code>NANOSECONDSINSECOND</code>, <code>VALUEINEURO</code>, <code>POSITIONX</code>, <code>POSITIONY</code>
+
'''Camel-Case''': Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während jeder Anfangsbuchstabe eines Wortes groß geschrieben wird.
 +
*z.B.: <code>NanosecondsInSecond</code>, <code>ValueInEuro</code>, <code>PositionX</code>, <code>PositionY</code>
  
* Camel-Case: Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während jeder Anfangsbuchstabe eines Wortes groß geschrieben wird. '''Beispiele''': <code>NanosecondsInSecond</code>, <code>ValueInEuro</code>, <code>PositionX</code>, <code>PositionY</code>
+
'''Mixed-Camel-Case''': Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während jeder Anfangsbuchstabe eines Wortes groß geschrieben wird, bis auf der erste.
 +
*z.B.: <code>nanosecondsInSecond</code>, <code>valueInEuro</code>, <code>positionX</code>, <code>positionY</code>
  
* Mixed-Camel-Case: Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während jeder Anfangsbuchstabe eines Wortes groß geschrieben wird, bis auf der erste. '''Beispiele''': <code>nanosecondsInSecond</code>, <code>valueInEuro</code>, <code>positionX</code>, <code>positionY</code>
+
'''Underscored''': Wörter in Bezeichnern werden durch einen Unterstrich '''_''' voneinander getrennt.
 +
*z.B.: <code>nanoseconds_in_sekunde</code>, <code>value_in_euro</code>, <code>position_X</code>, <code>position_Y</code>.
 +
Underscored kann in Kombination mit anderen Begriffen verwendet werden. Die ersten beiden Beispiele sind in der in C für Variablen verwendeten lower-case-underscored Schreibweise gehalten.
  
* Underscored: Wörter in Bezeichnern werden durch einen Unterstrich '''_''' voneinander getrennt. '''Beispiele''': <code>nanoseconds_in_sekunde</code>, <code>value_in_euro</code>, <code>position_X</code>, <code>position_Y</code>
+
=Konventionen in Java=
  
Underscored kann in Kombination mit anderen Begriffen verwendet werden. So z.B. die in C verwendete lower-case-underscored Schreibweise für Variablen: <code>nanosekunden_in_sekunde</code>, <code>wert_in_euro</code>, <code>position_x</code>, <code>position_y</code>.
+
Folgende Konventionen sind beim Programmieren von [[Java]] zwingend einzuhalten:
  
 
== Konventionen für Bezeichner in Java ==
 
== Konventionen für Bezeichner in Java ==
  
Da wir im Praktikum des Modules Java programmieren, wollen wir, dass Sie folgende Konventionen einhalten:
+
1. '''Paketnamen''' werden im '''Lower-Case''' notiert und haben die Form einer "umgekehrten URL".
 +
*z.B.: <code>de.tu-do.eini.blatt01</code>, <code>org.apache</code>, <code>com.jogamp.opengl</code>, <code>myproject.directory</code>
  
* Paketnamen werden im Lower-Case notiert und haben die Form einer "umgekehrten URL". '''Beispiele''': <code>de.tu-do.eini.blatt01</code>, <code>org.apache</code>, <code>com.jogamp.opengl</code>, <code>myproject.directory</code>
+
2. [[Klasse|'''Klassennamen''']] werden im '''Camel-Case''' notiert.  
 +
*z.B.: <code>String</code>, <code>MeinProgramm</code>, <code>AbstractSingletonFactoryBean</code>
  
* Klassennamen werden im Camel-Case notiert. '''Beispiele''': <code>String</code>, <code>MeinProgramm</code>, <code>AbstractSingletonFactoryBean</code>
+
3. [[Variable|'''Variablen- und Attributsnamen''']] werden im '''Mixed-Camel-Case''' notiert.
 +
*z.B.: <code>x</code>, <code>result</code>, <code>processRunning</code>
  
* Variablen- und Attributsnamen werden im Mixed-Camel-Case notiert. '''Beispiele''': <code>x</code>, <code>result</code>, <code>processRunning</code>
+
4. [[Methode|'''Methodennamen''']] werden im ''''Mixed-Camel-Case''' notiert.
 +
*z.B.: <code>calculate(int x, int y)</code>, <code>doSomething()</code>, <code>cleanupAtShutdown(String message)</code>
  
* Methodennamen werden im Mixed-Camel-Case notiert. '''Beispiele''': <code>calculate(int x, int y)</code>, <code>doSomething()</code>, <code>cleanupAtShutdown(String message)</code>
+
5. Klassenweite '''Konstanten'' werden im '''Underscored-Upper-Case''' notiert.
 +
*z.B.: <code>PI</code>, <code>NANOSECONDS_IN_SECOND</code>, <code>ARRAY_SIZE</code>
  
* Klassenweite Konstanten werden im Underscored-Upper-Case notiert. '''Beispiele''': <code>PI</code>, <code>NANOSECONDS_IN_SECOND</code>, <code>ARRAY_SIZE</code>
 
  
Dies sorgt dafür, dass alles was einen '''Wert''' besitzt schnell durch den Kleinbuchstaben am Anfang erkannt werden kann, während von Typen mit Großbuchstaben unterschieden werden kann. Konstanten nehmen dabei eine traditionelle Sonderrolle ein, damit sie schnell als solche identifiziert werden können.
+
Alles was einen '''Wert''' besitzt, kann so schnell durch den '''Kleinbuchstaben''' am Anfang erkannt werden kann, während von Typen mit Großbuchstaben unterschieden werden kann. Konstanten fallen schnell ins Auge.
  
Bei Paketnamen kann durch die Form der Notation bei Großprojekten insbesondere erkannt werden, in welcher Sprache das Projekt dokumentiert ist. Für das Anlegen von Klassen zu den Übungsblättern reicht jedoch etwas wie <code>eini.blatt01</code> vollkommen aus.
+
Bei '''Paketnamen''' kann durch die Form der Notation bei Großprojekten insbesondere erkannt werden, in welcher Sprache das Projekt dokumentiert ist. Für das Anlegen von Klassen zu den Übungsblättern reicht jedoch etwas wie <code>eini.blatt01</code> vollkommen aus.
  
 
== Konventionen für Einrückung und geschweifte Klammern in Java ==
 
== Konventionen für Einrückung und geschweifte Klammern in Java ==
  
In Java, wie auch in vielen anderen Programmiersprachen, wird blockebenenweise eingerückt. Das bedeutet, dass die Anzahl an umgebenden Blöcken von geschweiften Klammern die Anzahl an Leerzeichen oder Tabs vor dem Beginn einer Zeile angibt. So stehen z.B. die Deklarationen von Attributen und Methoden immer im Block der sie beinhaltenden Klasse und werden deswegen um eine Ebene eingerückt:
+
In Java wird, wie auch in vielen anderen Programmiersprachen, '''blockebenenweise''' eingerückt. Das bedeutet, dass die Anzahl an umgebenden Blöcken von geschweiften Klammern die Anzahl an Leerzeichen oder Tabs vor dem Beginn einer Zeile angibt. So stehen z.B. die Deklarationen von Attributen und Methoden immer im Block der sie beinhaltenden Klasse und werden deswegen um eine Ebene eingerückt:
  
 
<source lang="java">
 
<source lang="java">
Zeile 86: Zeile 109:
 
</source>
 
</source>
  
Ob Sie die öffnenden Klammern eines Blockes in die Zeile des ihn öffnenden Ausruckes schreiben (wie im vorherigen Beispiel), oder die öffnende Klammer in die gleiche Ebene wie der den Block öffnende Ausdruck in einer einzelnen Zeile notieren (wie im lesbareren Beispiel unter Verständlichkeit eines Algorithmus) ist Ihnen überlassen. Sie sollten dabei aber auf jedenfall konstant bleiben und sich für einen der beiden Stile entscheiden und dabei bleiben.
+
Ob Sie die öffnenden Klammern eines Blockes in die Zeile des ihn öffnenden Ausdruckes schreiben (wie im vorherigen Beispiel), oder die öffnende Klammer in die gleiche Ebene wie der den Block öffnende Ausdruck in einer einzelnen Zeile notieren (wie im lesbareren Beispiel unter Verständlichkeit eines Algorithmus) ist Ihnen überlassen. Sie sollten dabei aber auf jeden Fall konstant bleiben.
  
=== Beispiele ===
+
= Beispiele =
  
 
<source lang="java" title="Korrekte Vorgabe">
 
<source lang="java" title="Korrekte Vorgabe">

Version vom 13. Juni 2016, 22:35 Uhr

Eine Codekonvention ist eine Übereinkunft unter Programmierern, beim Schreiben ihrer Programme einen gewissen Stil einzuhalten. Über die Jahre hinweg haben sich in fast allen Programmiersprachen eine oder mehrere solcher Standards gebildet.

Verständlichkeit eines Algorithmus

Erläuterung

Ein wichtiges Merkmal eines Algorithmus ist, dass ein menschlicher Leser ihn verstehen kann, obwohl er nicht in umgangssprachlicher Form vorliegt.

Beispiel

Als Beispiel sei folgender Algorithmus gegeben, der zwei Zahlen miteinander multipliziert, ohne explizit einen Multiplikationsoperator zu verwenden.

1. In Pseudocode sieht das ganze so aus:

Eingabe: Zwei ganze Zahlen a und b
Ausgabe: Produkt aus a und b
Vorgehensweise:
    Initialisiere das Ergebnis mit 0
    Addiere a mal b auf das Ergebnis
    Gebe das Ergebnis zurück

2. Beispiel für eine schwer verständliche Formulierung des Algorithmus:

  public static int berechnen2(int a, int b){int erg=0;for(int i=0;i<a;i++){erg+=b;}return erg;}
  

3. Das gleiche Beispiel, lesbarer und mit Syntaxhighlighting:

public static int berechnen(int a, int b)
  {
    int erg = 0;
    for(int i = 0; i<a ; i++)
    {
        erg += b;
    }
    return erg;
  }

Beide Programme führen dasselbe aus. Beide berechnen das Produkt von a und b, ohne eine Multiplikation durchzuführen. Sie addieren b a-mal auf eine Ergebnisvariablen erg auf. Diese Variable wird zum Schluss zurückgegeben.

Genaueres zur Funktionsweise des Algorithmus: siehe Schleife

Bezeichner und Leerzeichen

Da in Programmiersprachen der Text maschinell analysiert werden muss, um später vom Compiler übersetzt werden zu können, gilt es immer folgendes zu beachten:

Eine Zeichenkette, die als Bezeichner für ein Programmelement genutzt wird, darf keine Leerzeichen (engl. whitespaces) beinhalten.

Mit Leerzeichen versehen werden Beginn und Ende des Bezeichners uneindeutig deklariert. Daher ist dies in fast allen Programmiersprachen verboten. Um trotzdem einen Bezeichner aus mehr als einem Wort bestehen zu lassen, verwenden Programmierer verschiedene Formen der Notation, die im Folgenden erklärt werden.

Notationsbegriffe

Im Zusammenhang mit Codekonventionen haben sich verschiedene Begriffe etabliert:

Lower-Case (engl. für "Kleinbuchstaben"): Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während alle Buchstaben klein geschrieben werden.

  • z.B.: nanosecondsinsecond, valueineuro, positionx, positiony

Upper-Case(engl. für "Großbuchstaben"): Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während alle Buchstaben groß geschrieben werden.

  • z.B.: NANOSECONDSINSECOND, VALUEINEURO, POSITIONX, POSITIONY

Camel-Case: Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während jeder Anfangsbuchstabe eines Wortes groß geschrieben wird.

  • z.B.: NanosecondsInSecond, ValueInEuro, PositionX, PositionY

Mixed-Camel-Case: Bezeichner werden als eine zusammenhängende Zeichenkette hintereinander geschrieben, während jeder Anfangsbuchstabe eines Wortes groß geschrieben wird, bis auf der erste.

  • z.B.: nanosecondsInSecond, valueInEuro, positionX, positionY

Underscored: Wörter in Bezeichnern werden durch einen Unterstrich _ voneinander getrennt.

  • z.B.: nanoseconds_in_sekunde, value_in_euro, position_X, position_Y.

Underscored kann in Kombination mit anderen Begriffen verwendet werden. Die ersten beiden Beispiele sind in der in C für Variablen verwendeten lower-case-underscored Schreibweise gehalten.

Konventionen in Java

Folgende Konventionen sind beim Programmieren von Java zwingend einzuhalten:

Konventionen für Bezeichner in Java

1. Paketnamen werden im Lower-Case notiert und haben die Form einer "umgekehrten URL".

  • z.B.: de.tu-do.eini.blatt01, org.apache, com.jogamp.opengl, myproject.directory

2. Klassennamen werden im Camel-Case notiert.

  • z.B.: String, MeinProgramm, AbstractSingletonFactoryBean

3. Variablen- und Attributsnamen werden im Mixed-Camel-Case notiert.

  • z.B.: x, result, processRunning

4. Methodennamen werden im 'Mixed-Camel-Case notiert.

  • z.B.: calculate(int x, int y), doSomething(), cleanupAtShutdown(String message)

5. Klassenweite Konstanten werden im Underscored-Upper-Case' notiert.

  • z.B.: PI, NANOSECONDS_IN_SECOND, ARRAY_SIZE


Alles was einen Wert besitzt, kann so schnell durch den Kleinbuchstaben am Anfang erkannt werden kann, während von Typen mit Großbuchstaben unterschieden werden kann. Konstanten fallen schnell ins Auge.

Bei Paketnamen kann durch die Form der Notation bei Großprojekten insbesondere erkannt werden, in welcher Sprache das Projekt dokumentiert ist. Für das Anlegen von Klassen zu den Übungsblättern reicht jedoch etwas wie eini.blatt01 vollkommen aus.

Konventionen für Einrückung und geschweifte Klammern in Java

In Java wird, wie auch in vielen anderen Programmiersprachen, blockebenenweise eingerückt. Das bedeutet, dass die Anzahl an umgebenden Blöcken von geschweiften Klammern die Anzahl an Leerzeichen oder Tabs vor dem Beginn einer Zeile angibt. So stehen z.B. die Deklarationen von Attributen und Methoden immer im Block der sie beinhaltenden Klasse und werden deswegen um eine Ebene eingerückt:

public class Cube {
    private int x,y,z;
    
    private int calculateVolume(){
        /* Berechnung */
    }
}

Ob Sie die öffnenden Klammern eines Blockes in die Zeile des ihn öffnenden Ausdruckes schreiben (wie im vorherigen Beispiel), oder die öffnende Klammer in die gleiche Ebene wie der den Block öffnende Ausdruck in einer einzelnen Zeile notieren (wie im lesbareren Beispiel unter Verständlichkeit eines Algorithmus) ist Ihnen überlassen. Sie sollten dabei aber auf jeden Fall konstant bleiben.

Beispiele

public class Classname {
    private int variable;
    private int another;
}
public class Cube {
private int x,y,z;
private int calculateVolume(){
/* Berechnung */
}
}
public class Cube {
    private int x,y,z;
    private int calculateVolume(){
        /* Berechnung */
    }}
public class Cube {
    private     int x,y,z;
    
        private int calculateVolume(){
        /* Berechnung */
    }
}
public class Calculator {
    private int calculate(int x, int y){
        for(int i = 0; i < y; i++)
        {
            /* Berechung */
        }
    }
}
public class Cube
{
    private int x,y,z;
    
    private int calculateVolume()
    {
        /* Berechnung */
    }
}