Organisatorisches • Folien (u.a.) gibt's auf der Lva-Homepage zum Download • Vertretung in den UE • Neuer Termin Zwischentest (15.12., 18 bis 20 Uhr) • Tutorium montags und mittwochs 18.10.2016 IT I - VO 3 1 Wissensüberprüfung • 16 von 61 Studierenden haben weniger als 3 Punkte (“negativ”). • Stoff bisher: Attribute, Konstruktor, Methodenaufruf, if • Mit zunehmendem neuen Stoff (Schleifen, Vererbung) wird's nicht leichter. 18.10.2016 IT I - VO 3 2 Wissensüberprüfung • Wie ruft man set-Methode public void setBla(int neuerWert) aus einer Klasse Blabla für ein Objekt der Klasse Blabla auf? Blabla dasBlabla = ...; int a = ...; dasBlabla.setBla(a); 18.10.2016 IT I - VO 3 3 Wissensüberprüfung • Der Datentyp der Parameter wird beim Aufruf einer Methode nicht wiederholt! • Vorne steht der Objekt-, nicht der Klassenname! 18.10.2016 IT I - VO 3 4 Wissensüberprüfung Weitere Anmerkung: • Auch parameterlose Methoden brauchen () ! • == (Vergleich) vs = (Zuweisung)! • Wenn strukturell nicht klar ist, dass in jedem Fall return ausgeführt wird, gibt es Compilerfehler missing return statement! 18.10.2016 IT I - VO 3 5 Wissensüberprüfung Weitere Anmerkung: • Variable können nur verwendet werden, wenn deklariert bzw. wenn sie Parameter einer Methode sind. • Lokale vs. globale Variable (Gültigkeitsbereich) 18.10.2016 IT I - VO 3 6 Attribute vs. Hilfsvariable • Attribute stehen für wesentliche Eigenschaften von Objekten der Klasse. • Hilfsvariable sollten möglichst lokal gespeichert werden (dort, wo sie zum ersten Mal benötigt werden). 18.10.2016 IT I - VO 3 7 Entwurf von Klassen • Wie sollen die Klassen für eine Problemstellung gewählt werden, sodass die Lösung leicht zu verstehen und zu verändern ist? • Merkmale für die Qualität der Lösung: – Geringes Coupling – Hohe Cohesion – Wenig/keine Code duplication • Vorgehen: – Responsibility-driven design – Thinking ahead – Refactoring 18.10.2016 IT I - VO 3 8 Coupling • Coupling refers to links between separate units of a program. • If two classes depend closely on many details of each other, we say they are tightly coupled. • We aim for loose coupling. • Loose coupling makes it possible to: – understand one class without reading others; – change one class without affecting others. 18.10.2016 IT I - VO 3 9 Cohesion • Cohesion refers to the number and diversity of tasks that a single unit is responsible for. • If each unit is responsible for one single logical task, we say it has high cohesion. • We aim for high cohesion. – A method should be responsible for one and only one well defined task. – Classes should represent one single, well defined entity. • High cohesion makes it easier to: – understand what a class or method does, – use descriptive names, – reuse classes or methods. 18.10.2016 IT I - VO 3 10 Code duplication • Code duplication – is an indicator of bad design, – makes maintenance harder, – can lead to introduction of errors during maintenance. 18.10.2016 IT I - VO 3 11 Responsibility-driven design • Question: where should we add a new method (to which class)? • Each class should be responsible for manipulating its own data. • The class that owns the data should be responsible for processing it. • RDD leads to low coupling. 18.10.2016 IT I - VO 3 12 Thinking ahead • When designing a class, we try to think what changes are likely to be made in the future. • We aim to make those changes easy. 18.10.2016 IT I - VO 3 13 Refactoring • When classes are maintained, often code is added. • Classes and methods tend to become longer. • Every now and then, classes and methods should be refactored to maintain cohesion and low coupling. 18.10.2016 IT I - VO 3 14 Refactoring and testing • When refactoring code, separate the refactoring from making other changes. • First do the refactoring only, without changing the functionality. • Test before and after refactoring to ensure that nothing was broken. 18.10.2016 IT I - VO 3 15 Summary • Quality of code requires much more than just performing correct at one time. • Code must be understandable and maintainable. • Good quality code avoids duplication, displays high cohesion, low coupling. • Coding style (commenting, naming, etc.) is also important. • There is a big difference in the amount of work required to change poorly structured and well structured code. 18.10.2016 IT I - VO 3 16 Arrays in Java • Arrays sind eine Möglichkeit, um mehrere gleichartige Daten zu verwalten. • Ein Array stellt eine Liste fixer Größe dar, wobei die Listenelemente von beliebigem Datentyp sein können. • Alle Elemente eines Arrays haben aber denselben Datentyp. • Arrays in Java sind eine spezielle Objektart. • Bei der Erzeugung eines Array-Objekts wird seine Größe (=Anzahl der Elemente) festgelegt. • Zum Programmieren mit Arrays gibt es eine spezielle Notation. 18.10.2016 IT I - VO 3 17 Definition einer Array-Variablen Datentyp[] variablenname; Z.B.: int[] a; Auto[] fuhrpark; • Die Elemente eines Arrays können von primitiven oder nicht-primitiven Datentyp sein. • Bei einem nicht-primitiven Datentyp sind die Elemente des Arrays nicht die Objekte selbst, sondern Objekt-Referenzen. 18.10.2016 IT I - VO 3 18 Erzeugen eines Array-Objekts new Datentyp[Größe] Z.B.: int[] zahlenliste; zahlenliste = new int[24]; int n = 100; Auto[] fuhrpark = new Auto[n]; • Der Aufruf des Konstruktors erzeugt ein Array-Objekt der angegebenen Größe mit dem angegebenen Datentyp. • Die Elemente des Arrays werden mit Default-Werten initialisiert: – Objekt-Referenzen werden auf null gesetzt. – int-, long-, double-Werte werden auf 0 gesetzt. – boolean-Werte werden auf false gesetzt. 18.10.2016 IT I - VO 3 19 Zugriff auf ein Array-Objekt • Auf die Elemente eines Arrays kann mit Hilfe ihrer Nummer zu gegriffen werden: int[] a = new int[10]; a[5] = 13; a[6] = 2*a[5]; • In Java sind die Array-Elemente mit 0 beginnend nummeriert, also 0,1,2,… • Auf die Größe eines Arrays kann mit <Array-Variable>.length zugegriffen werden (z.B. a.length). • Das letzte Element eines Arrays a hat also den Index (a.length - 1). 18.10.2016 IT I - VO 3 20 Die while-Schleife in Java while(Bedingung) { Anweisungsblock } • Die Bedingung ist ein Ausdruck, der true oder false liefert. • Der Anweisungsblock der while-Schleife wird ausgeführt, wenn vor Ausführung des Anweisungsblocks die <Bedingung> true liefert. • Nach Ende des Anweisungsblocks wird die <Bedingung> erneut überprüft, und der Anweisungsblock nochmals ausgeführt, wenn die Bedingung true ist. • Das wiederholt sich, bis die Bedingung false ist. 18.10.2016 IT I - VO 3 21 Die do-while-Schleife in Java do{ Anweisungsblock }while(Bedingung) • Funktionsweise wie while-Schleife. • Läuft aber mindestens einmal durch, weil Überprüfung erst am Ende. 18.10.2016 IT I - VO 3 22 Die Objekt-Referenz this • Auf das Objekt, dessen Methode gerade ausgeführt wird, kann mit this zugegriffen werden. • In einem Konstruktor bezeichnet this das Objekt, das gerade erzeugt wird. • Auf Attribute kann eindeutig mit this.attributname zugegriffen werden. 18.10.2016 IT I - VO 3 23 Vordefinierte Java-Klassen • Klassen-Bibliotheken – Sammlungen von nützlichen Klassen, die nicht selbst programmiert werden müssen. – In Java sind diese in packages organisiert. – Für die Java-Programmierung muss man einige wichtige dieser Klassen kennen. – Man muss die Klassen-Dokumentation (Class API) lesen können, um sich über weiter Klassen informieren zu können. – API: Applications Programmers Interface 18.10.2016 IT I - VO 3 24 Lesen der Klassen-Dokumentation • Die Dokumentation beschreibt in der Regel nur die Verwendung der Klassen, nicht wie die Klassen implementiert sind. • Die Dokumentation liegt in HTML-Format vor. • Eine Klassen-Dokumentation enthält: – Name der Klasse – Allgemeine Beschreibung der Klasse – Liste der Konstruktoren und Methoden mit Parametern und Rückgabewerten – Eine Beschreibung für jeden Konstruktor und jede Methode: • Was bewirkt der Konstruktor oder die Methode? 18.10.2016 IT I - VO 3 25 Information Hiding • Die Klassen-Dokumentation enthält keine Implementierungsdetails: – Attribute und Methoden, die private sind. – Die Implementierung der Methoden. 18.10.2016 IT I - VO 3 26 Verwendung von Bibliotheksklassen • Klassen aus einem Java package müssen importiert werden, und können dann wie eine Klasse des eigenen Projektes/Paketes verwendet werden: import <Paketname>.<Klassenname>; • Z.B.: import java.util.Random; Dabei ist java.util das Paket, das die Klasse Random enthält. (Diese Klasse ist für aktuelle Übungsaufgaben nützlich!) 18.10.2016 IT I - VO 3 27 Die Klasse Random • Die Klasse Random stellt verschiedene Methoden zur Erzeugung von Zufallszahlen zur Verfügung. • Mit Konstruktor new Random() wird ein Zufallszahlengenerator erstellt. • Mit Methoden double nextDouble() int nextInt() ... werden dann Zufallszahlen erzeugt. 18.10.2016 IT I - VO 3 28 Strings in Java • Strings sind Objekte der Klasse String im package java.lang. • Die Klassen von java.lang sind die einzigen Klassen, die automatisch importiert werden. • Besondere Syntax für Strings: – Automatisches Erzeugen eines String-Objektes durch Angabe eine Zeichenkette, z.B. "abc". – Zusammenfügen von Strings durch den Operator +, z.B. string1 + "abc". – Datentypen werden automatisch in Strings umgewandelt, wenn das nötig ist, z.B. "" + 17. – Vergleich von Strings mit Methode equals. 18.10.2016 IT I - VO 3 29 Datentyp char • char ist einer der primitiven Datentypen. • In Variable vom Typ char kann man ein einzelnes Zeichen speichern. Beispiel: char x = 'u'; • Umwandlung in String funktioniert analog zu int: String s = “” + x; 18.10.2016 IT I - VO 3 30 switch • Mit switch können mehr als zwei Fälle abgefragt werden (Alternative zu stark verzweigtem if). Beispiel: String farbe = einZuckerl.getFarbe(); boolean gefaelltMir; switch(farbe) { case “rot”: gefaelltMir = false; break; case “orange”: gefaelltMir = true; break; … default: gefaelltMir = false; } 18.10.2016 IT I - VO 3 31