3. Grundregeln für die Java-Programmierung Sprachaufbau von Java Programmen Stilistische Konventionen JavaDoc Allgemeine Informatik 2 SS09 Folie 2.1
Allgemeine Vorbemerkung Bei Programmiersprachen sind die lexikalischen, syntaktischen und semantischen Regeln, was korrekt ist und was nicht, sehr viel rigider und pedantischer als etwa in natürlichen Sprachen. Gründe: Es ist wesentlich schwieriger und aufwendiger, einen Spracherkenner und Compiler oder Interpreter für eine weniger pedantische Sprache zu entwickeln. Für natürliche Sprachen ist dieses Problem bis heute ungelöst! Die Möglichkeit mehrdeutiger Texte wäre ab einem gewissen Komplexitätsgrad der Sprache wohl kaum vermeidbar, bei normaler Kommunikation in natürlichen Sprachen ein häufiges Ärgernis, bei Programmiersprachen eine Katastrophe. Allgemeine Informatik 2 SS09 Folie 3.2
Allgemeine Vorbemerkung Bei natürlichen Sprachen sind die Regeln viel weniger rigide, wodurch ein automatisches Verständnis erschwert wird. Z.B. Resultat einer automatische Übersetzung der vorigen Folie D E Chinesisch D E Grund: Er ist enorm sogar mehr ist schwierig und eine kompliziertere Entwicklung spricht mehr erkenner und der Kompilator oder der Interpret ist eine Art von weniger pedantische Sprache Spricht diese Frage für die Natur, bis heutiger Tag die Lösung ist! Die vieldeutige Textmöglichkeit kann sein Anfänge von der Sprache irgendein komplizierter Grad vermutlich fast, zum nicht in der Lage zu sein zu vermeiden In der normalen häufigen Korrespondenzperiode wird in der Naturrede gestört Übersetzung: Babel Fish Programmierspracheunfall http://world.altavista.com/ Allgemeine Informatik 2 SS09 Folie 3.3
Der Sprachaufbau von Java Abstraktionsebenen Spezifikatorische Ebene Logische Ebene Semantische Ebene Syntaktische Ebene Lexikalische Ebene Übereinstimmung der Ergebnisse von Programmaufrufen mit den ursprünglich gesetzten Zielen Ergebnisse von Programmaufrufen ohne Fehler auf darunter liegenden Ebenen Bedeutung von Texten, die lexikalisch und syntaktisch korrekt formuliert sind Gruppierung von lexikalischen Einheiten und trennenden Elementen zu Ausdrücken Unterste Ebene, zusammengesetzt aus lexikalischen Einheiten und trennenden Elementen Allgemeine Informatik 2 SS09 Folie 3.4
Lexikalische Ebene Unterste Ebene, zusammengesetzt aus lexikalischen Einheiten und trennenden Elementen z. B. int i = 7; Schlüsselwörter: Zeichenketten mit besonderer Bedeutung, z. B. int, if, for, class, return in Java immer aus Kleinbuchstaben Bezeichner: Namen von Variablen, Methoden, Klassen, etc. beliebige Zeichenketten aus Buchstaben, Ziffern und Underscore dürfen nicht mit einer Ziffer anfangen Operatoren: Zuweisungen und Rechenzeichen Grundrechenarten +, -, *, / Vergleichsoperatoren <, >, etc. Logische Operatoren!, &&, Klammerzeichen ( ), { }, [ ] Literale: explizite Werte 4711; 3,14159; a ; Hello Separatoren: einer oder mehrere sind gleichbedeutend Leerzeichen, Tab, Umbruch Allgemeine Informatik 2 SS09 Folie 3.5
Syntaktische Ebene Korrekte Gruppierung von lexikalischen Einheiten und trennenden Elementen zu Ausdrücken Beispiele Öffnende und schließende Klammern dürfen nur in Paaren auftreten. Die Öffnende steht vor der Schließenden hintereinander (..)..(..)..(..) geschachtelt (..((..)(..)..)) Anweisung 1 Ein Schlüsselwort ist Teil eines Programmkonstrukts, darf nur dort und in festgelegter Reihenfolge auftreten 1 int i = 3; 2 while(i < 100) 3 { 4 if(i%2 == 0) 5 i--; 6 else 7 i*=2; 8 } Anweisung 2 Allgemeine Informatik 2 SS09 Folie 3.6
Semantische Ebene Der Begriff Semantik einer Sprache bezieht sich auf die Bedeutung von Texten, die lexikalisch und syntaktisch korrekt formuliert sind. Beispiel Bindungsstärke bei Operatoren Verschiedene Operatoren haben verschiedene Bindungsstärken, vgl. Punkt vor Strich in der Mathematik Aber durch Klammerung kann die Bindungsstärke beeinflusst werden int j = 3 (10/(2*(4+1))); Das Ergebnis ist j = 2; Das Ergebnis verändert sich, weil sich die Bearbeitungsreihenfolge geändert hat und damit die Bedeutung des Ausdrucks. int i = 3-10/2*4 + 1; Das Ergebnis ist i = -16; Allgemeine Informatik 2 SS09 Folie 3.7
Logische Ebene Ergebnisse von Programmaufrufen ohne Fehler auf darunter liegenden Ebenen Was heißt dann noch, dass ein Programm korrekt bzw. nicht korrekt ist? Beispiel: Fencepost Syndrom Wie viele Zaunpfähle braucht man, wenn der Zaun 20 Meter lang werden soll alle 2 Meter ein Pfahl stehen muss Ein Programm ist dann korrekt, wenn es alles das tut, was es soll mit allen erwünschten Effekten und darüber hinaus keine Effekte hat, die es nicht haben soll. Programmierfehler auf der logischen Ebene werden nicht beim Kompilieren mit Fehlermeldungen abgefangen. Sie können nur durch ausführliches Testen entdeckt und beseitigt werden. Allgemeine Informatik 2 SS09 Folie 3.8
Spezifikatorische Ebene Auf der spezifikatorischen Ebene geht es um Diskrepanzen zwischen den eigentlichen Intentionen des Programms und seiner Spezifikation Beispiel: Millenium Bug Für ein Datum sind Tag, Monat und Jahr abzuspeichern. Der Programmierer verwendet dafür zweistellige Zahlen und erzeugt Daten der Form 01.01.01 Bis zum 31.12.1999 stimmen Spezifikation und Programm, aber danach Idealbild einer Spezifikation Ein übersichtliches und systematisch strukturiertes Schriftstück Verständlich und zu gleich exakt, eindeutig formuliert Deckt jeden möglichen Fall, der prinzipiell auftreten kann, auch ab. In der Realität führt dies zu einem Dilemma der Softwareindustrie Spezifikation ist zu aufwändig, erfordert Zeit und Geld und wird doch nicht komplett gelesen. Allgemeine Informatik 2 SS09 Folie 3.9
Stilistische Konventionen Zusätzlich zu den syntaktischen Regeln, die eingehalten werden müssen, haben sich in der Java-Programmierung noch einige Konventionen durchgesetzt Konventionen müssen nicht eingehalten werden das Programm kann trotzdem übersetzt werden ist aber für andere Benutzer leichter verständlich Im Gegensatz zu anderen Programmiersprachen hat sich in Java ein Regelwerk für die Stylistik von Identifiern allgemein durchgesetzt. Viele vorgefertigte Java Bausteine und unzählige Java Anwendungsprogramme vertrauen darauf, dass diese Konventionen streng eingehalten werden. Beispiel: JavaDoc Allgemeine Informatik 2 SS09 Folie 3.10
Groß- und Kleinschreibung In Java wird zwischen Groß- und Kleinschreibung bei Bezeichnern unterschieden. hallo, Hallo und HALLO sind drei verschiedene Bezeichner. IF, If und if sind zulässige Bezeichner, obwohl if ein Schlüsselwort ist. Einige stilistische Regeln fürs Programmieren Wortanfänge innerhalb eines Bezeichners werden mit Großbuchstaben gekennzeichnet. Der Underscore sollte vermieden werden. Namen von Klassen beginnen mit Großbuchstaben, z. B. UrRobot Namen von Variablen und Methoden beginnen mit Kleinbuchstaben, z. B. putbeepers(amount) Allgemeine Informatik 2 SS09 Folie 3.11
Whitespace zur Trennung In Java macht es keinen Unterschied, ob als Trennelemente ein oder mehrere Leerzeichen oder Tabs verwendet werden. Deshalb folgende Regeln, die das Lesen des Quellcodes erleichtern: Nach jedem Semikolon kommt ein Zeilenumbruch. Bei Anweisungen, denen ein Block folgt, steht { am Ende der Zeile. Anschließend kommt ein Umbruch. Nach einer { wird der Text eingerückt, nach } ausgerückt. Codebeispiel 01 int quadratsumme(int n){ 02 03 int summe = 0; 04 if(n==0){ 05 return summe; 06 } 07 for(int i=0; i<=n; i++){ 08 summe += i*i; 09 } 10 11 return summe; 12 } Allgemeine Informatik 2 SS09 Folie 3.12
Sprechende Namen für Bezeichner Bezeichner als Kommentare Damit ein Programm lesbar und verständlich bleibt, sollten die Bezeichner so gewählt sein, dass sie die Methode oder Variable beschreiben. zeichnehausvomnikolaus für eine Methode, die das Haus vom Nikolaus zeichnet Methoden aus den Javabibliotheken wie drawstring, drawline, etc. Dies wird sehr wichtig bei größeren und komplexen Programmen oder wenn mehrere Personen am gleichen Projekt arbeiten. Allgemeine Informatik 2 SS09 Folie 3.13
Kommentare Richtig Kommentieren Einzeilige Kommentare sind der Form // Hier steht ein Kommentar Mehrzeilige Kommentare werden Slash und Stern begrenzt wie folgt /* */ Mehrzeilige Kommentare sind hilfreich, wenn längere Beschreibungen zu Methoden gegeben werden. Allgemeine Informatik 2 SS09 Folie 3.14
JavaDoc Was ist JavaDoc? Javadoc ist ein Werkzeug, das eine standardisierte Dokumentation für die Programmiersprache Java unterstützt. Vorteil: Dokumentation findet während der Programmierung statt Code und Dokumentation kann im Quelltext stehen Woher bekomme ich Javadoc? Das Programm javadoc ist in jedem Java 2 SDK von Sun Microsystems enthalten. Nach der Installation befindet es sich im gleichen Verzeichnis wie Javac. Allgemeine Informatik 2 SS09 Folie 3.15
JavaDoc Kommentare JavaDoc sind spezielle Kommentare, die als Anweisungen zur automatischen Dokumentation des Programms zu nützen. Syntax: JavaDoc Kommentare sind mehrzeilige Kommentare, die mit /** statt mit /* beginnen: /** <- JavaDoc!! * Hier steht ein mehrzeiliger JavaDoc Kommentar. * Die Sterne am Beginn jeder Zeile sind nicht * erforderlich, aber allgemein üblich */ Aus derartigen Kommentaren in einem Klassen-File erzeugt javadoc eine HTML-Seite, die diese Klasse dokumentiert. Allgemeine Informatik 2 SS09 Folie 3.16
JavaDoc Tags In den JavaDoc Kommentaren können bestimmte Tags verwendet werden um gezielt Informationen über ein Java-Objekt zu übermitteln. Allgemeine Tags: @author: Den Autor der Klasse / der Methode @version: Die Programm-Version der Klasse / der Methode Tags zur Dokumentation von Methoden: @param name: Die Beschreibung eines Parameters für eine Methode (kann mehrmals vorkommen, falls die Methode mehrere Parameter hat) @return: Beschreibung des Rückgabewerts eines Parameters und viele mehr Als kurze Einführung dient http://de.wikipedia.org/wiki/javadoc Allgemeine Informatik 2 SS09 Folie 3.17
Mit JavaDoc kommentiertes Beispiel-Programm 01 /** 02 * Dies ist ein Javadoc-Kommentar. 03 * @author David Thomas 04 * @version 9.3.98a 05 */ 06 public class Hello { 07 /** 08 * Sprich einen Gruß aus. 09 * 10 * @return String 11 */ 12 public String greet() { 13 System.out.println("Hallo, Welt!"); 14 return "Hallo,Welt!"; 15 } 16 } // class Hello Allgemeine Informatik 2 SS09 Folie 3.18
Mit JavaDoc kommentiertes Beispiel-Programm 01 /** 02 * Dies ist ein Javadoc-Kommentar. 03 * @author David Thomas 04 * @version 9.3.98a 05 */ 06 public class Hello { 07 /** 08 * Sprich einen Gruß aus. 09 * 10 * @return einen Gruß 11 */ 12 public String greet() { Javadoc Tags für Autor und Version Javadoc Tag für Rückgabewert 13 System.out.println("Hallo, Welt!"); 14 return "Hallo,Welt!"; 15 } 16 } // class Hello Javadoc Kommentar für Klasse Hello Javadoc Kommentar für Methode greet() Allgemeine Informatik 2 SS09 Folie 3.19
Erzeugtes Javadoc-Dokument Allgemeine Informatik 2 SS09 Folie 3.20
Erzeugtes Javadoc-Dokument Kommentar für Klasse Hello Kommentar für Methode greet() Allgemeine Informatik 2 SS09 Folie 3.21
JavaDoc macht also folgendes Erstellen eines Grundgerüsts für die Dokumentation Darstellung der Vererbungshierarchie z.b. Hello erbt von java.lang.object (automatisch) Automatisches Ergänzen von wesentlichen Informationen Geerbte Methoden Rückgabe-Typen von Methoden automatsich erstellte Konstruktoren Dazu werden die in den JavaDoc-Kommentaren und den den JavaDoc-Tags gefundenen Informationen ergänzt Allgemeine Informatik 2 SS09 Folie 3.22