BO-Ich Benutzeroberflaechen und Software - Ergonomie Prof. Dr. Stephan Kleuker Prof. Michaela Ramm Fachhochschule Osnabrück Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm • [email protected], Raum SI 0109 • Sprechstunde nach Vereinbarung und wenn ich da bin 1 Ablauf Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 2 Verhaltenscodex • 2h Vorlesung + 2h Praktikum = 5 CP • Planung: 6 VL zu BO + 7 VL zu SE • Praktikum in BO: – Anwesenheit = (Übungsblatt vorliegen + Lösungsversuche zum vorherigen Aufgabenblatt) – 6-7 Übungsblätter mit jeweils 7-8 Punkten (Σ ≥ 50), 2 Studis – Praktikumsteil mit 40 oder mehr Punkten bestanden • Prüfung: Projektaufgabe (Kenntnisse aus der Vorlesung anwenden + eigene Untersuchungen) • Folienveranstaltungen sind schnell, bremsen Sie mit Fragen • von Studierenden wird hoher Anteil an Eigenarbeit erwartet Benutzeroberflächen und Software-Ergonomie • Prof. Dr. Stephan Kleuker, geboren 1967, verheiratet, 2 Kinder • seit 1.9.09 an der FH, Professur für Software-Entwicklung • vorher 4 Jahre FH Wiesbaden • davor 3 Jahre an der privaten FH Nordakademie in Elmshorn • davor 4 ½ Jahre tätig als Systemanalytiker und Systemberater in Wilhelmshaven Stephan Kleuker Michaela Ramm • • • • Rechner sind zu Beginn der Veranstaltung aus Handys sind aus Wir sind pünktlich Es redet nur eine Person zur Zeit • Sie haben die Folien zur Kommentierung in der Vorlesung vorliegen, ab So-Abend mit Aufgaben im Netz, Aufgabenzettel liegen in der Übung vor (Ihre Aufgabe) http://www.edvsz.fh-osnabrueck.de/kleuker/index.html • Probleme sofort melden • Wer aussteigt teilt mit warum 3 Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 4 Minimale Grundvoraussetzungen Themengebiete BO (Planung) Gute Programmierkenntnisse in C++ • Klasse • Methode • Klassenvariable und Klassenmethode • Sichtbarkeit • Vererbung • abstrakte Klassen • Collections (z. B. Liste, Menge) • Polymorphie Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 1 2 3 4 5 6 7 5 Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 6 1. Klassen und Objekte Literatur • C. Heinisch, F. Müller, J. Goll, Java als erste Programmiersprache, Vieweg+Teubner • G. Krüger, Handbuch der Java-Programmierung, AddisonWesley http://www.javabuch.de/download.html • C. Ullenboom, Java ist auch eine Insel, Galileo Computing http://openbook.galileocomputing.de/javainsel8/ • • • • • • • • Java-Seiten von Sun (sehr lesenswert): http://www.oracle.com/technetwork/java/javase/overview /index.html Klassendokumentation: http://download.oracle.com/javase/6/docs/api/ (auch herunterladbar) Benutzeroberflächen und Software-Ergonomie Klassen und Objekte Vererbung und Polymorphie Abstrakte Klassen, Interfaces, Collections Einige wichtige Java-Dinge Frames, Knöpfe und Ereignisbehandlung Layout, hierarchischer GUI-Aufbau Rundflug über GUI-Bausteine Stephan Kleuker Michaela Ramm 7 Klasse Sichtbarkeit Objekterzeugung this Methoden Klassenvariablen - und Methoden Array String Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 8 Java - Bedeutung in der Praxis (Stellenbörsen) <name> stepstone monster jobscanner stellenanzeigen zeit Suchbegriff Informatik Java wwj 2615 >1000 3855 >500 11450 6905 1975 3407 2691 514 12621 6902 Java - Bedeutung im Studium speed.ch 171 23.4.07 31 28.1.10 881 >1000 1441 >500 4679 3238 203 791 1408 1252 149 5211 3100 111 382 >1000 114 194 *** 2563 394 754 781 66 2167 24 C# 175 531 47 61 *** 755 38 237 556 28 823 56 PHP 111 543 350 >500 2014 887 10 303 608 269 71 1523 1014 13 SAP 2509 >1000 4357 >500 17213 7330 396 1889 4647 2567 359 14019 6844 168 319 745 312 115 1752 743 22 150 427 170 60 1727 614 11 187 234 81 29 647 4 C++ ABAP Flash (28.1.10) Benutzeroberflächen und Software-Ergonomie 37 534 ! 36 Stephan Kleuker Michaela Ramm ! 9 ! ! ! Java ! ! ! ! Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 10 Vom Source Code zum ausführbaren Programm • Objekt-orientierte Programmierung ist für komplexe und umfangreiche Aufgaben unerlässlich Java Source (Punkt.java) • Plattformunabhängigkeit und Netzwerkfähigkeit sind Voraussetzungen für eine weltweite Verfügbarkeit einer Anwendung Just-in-time Compiler Java Virtual Machine (java) • Source Code wird vom Compiler in Bytecode übersetzt • Bytecode wird von JVM ausgeführt (d.h. interpretiert) • Ggf. werden über den JIT-Compiler bestimmte Befehlssequenzen in nativen Code übersetzt • Java macht Spaß Stephan Kleuker Michaela Ramm Java Bytecode (Punkt.class) Java Compiler (javac) • Sehr umfangreiche und gute Klassenbibliothek als Standard vorhanden Benutzeroberflächen und Software-Ergonomie ! ! 11 Benutzeroberflächen und 11.11.2010 Software-Ergonomie Stephan Kleuker Michaela Ramm BOSE WS 2010/2011 12 12 Vorgehensweise und Verknüpfung zu OOP-VL Klassendefinition • Einführung in wesentliche Sprachkonzepte von Java (nicht was ist noch so alles möglich) • Syntaxbestandteile, die in C++ und Java ähnlich sind, werden nicht explizit behandelt – Deklaration mit Zuweisung int x=0; – Blockklammern { und } (weglassbar bei Einzeilern) – Alternative if(<Bedingung>){<if-Teil>} [else{<else-Teil}] – verschachtelte Alternative switch(<Variable>) { case <Wert>: {...} ... default: {...} } – statische Schleife for (<Initialisierung>,<Abbruch>, <Schleifenendeaktion>){...} – dynamische Schleife while(<Bedingung>){...} – Datentypen (sind leider keine Klassen): char, byte, int, long, float, double, boolean Benutzeroberflächen und Software-Ergonomie class Punkt { int x; int y; Punkt void moveTo(int newX, int newY){ x = newX; y = newY; } void moveRel(int dx, int dy){ x += dx; y += dy; } x: int y: int moveTo(int,int) moveRel(int,int) } Stephan Kleuker Michaela Ramm 13 Sichtbarkeiten [Teil 1] Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 14 Objekterzeugung - Konstruktorennutzung • Für Klassen, Exemplarvariablen und Methoden sind „Sichtbarkeiten“ anzugeben, wer darf darauf zugreifen (Kapselung) • public: alle private: nur innerhalb der Klasse ...[später] • Standard: Exemplarvariablen private public class Punkt { private int x; private int y; Punkt -x: int -y: int public void moveTo(int newX, int newY){ x = newX; y = newY; } ... Benutzeroberflächen und Software-Ergonomie • Eine Klassendefinition besteht aus dem Schlüsselwort class und dem Klassennamen; jede Klasse in eigener Datei • Der Körper einer Klasse enthält Exemplarvariablen- (bzw. Attribut-, Instanzvariablen) und Methodendefinitionen Stephan Kleuker Michaela Ramm +moveTo(int,int) +moveRel(int,int) 15 • Erzeugen von Objekten (Exemplaren) einer Klasse in einer Methode Punkt Punkt start ende start; ende; = new Punkt(); = new Punkt(); • Nach der Deklaration Punkt start; gilt zunächst start hat den Wert null (null-Referenz) • Bei der Benutzung des new-Operators wird • Speicherplatz für ein Objekt einer Klasse angefordert • der Konstruktor, eine spezielle Methode zum Initialisieren von Objekten, aufgerufen Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 16 Konstruktoren einer Klasse Beispiel für Konstruktoren • Konstruktoren einer Klasse haben den gleichen Namen wie die Klasse • Konstruktoren haben keinen Ergebnistyp, liefern ein Objekt der Klasse zurück • eine Klasse kann mehrere Konstruktoren mit unterschiedlichen Signaturen haben • ist für eine Klasse kein Konstruktor definiert, so wird für die Klasse ein impliziter parameterloser Konstruktor verwendet • Wenn ein Konstruktor einen anderen Konstruktor aufruft, dann muss dieser Aufruf die erste Anweisung des Konstruktors sein • Coding Guideline: Konstruktor immer angeben Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 17 this public class Punkt { private int x; private int y; public Punkt(){ x = 0; y = 0; //schlechtester Zeilenschreibstil! } public Punkt(int newX){ x = newX; y = 0; } public Punkt(int newX, int newY){ x = newX; y = newY; } public void moveTo(int newX, int newY){ . . . } public void moveRel(int dx, int dy){ . . . } } Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 18 Methoden • this liefert einen Verweis auf das Objekt in dem dieses Schlüsselwort steht • Verwendung des this-Schlüsselwortes • Zugriff auf überdeckte Exemplarvariablen • Eine Methode wird folgendermaßen definiert: sichtbarkeit returntyp methodenname([parameter]){ . . . } Punkt(int x){ this.x = x; this.y = 0; } • Ist der returntyp nicht void, muss jeder Methodenablauf mit return <ergebnis>; enden • Methoden können lokale Variablendefinitionen enthalten, diese müssen vor dem ersten Gebrauch immer initialisiert werden, können Exemplar- und Klassenvariablen überdecken • Zugriff auf andere Konstruktoren einer Klasse Punkt(int x, int y){ this(x); //Konstruktor nutzen (erste Zeile) this.y = y; } public boolean aufXAchse(){ boolean ergebnis = false; if (y == 0) ergebnis = true; return ergebnis; // geht alles in einer Zeile } • Aufruf einer Methode mit dem aktuellen Objekt als Parameter einObjekt.drawPunkt(this); Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 19 Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 20 Nutzung von Exemplarvariablen Nutzung von Klassen und Methodenaufrufe public class Linie { private Punkt anfang; private Punkt ende; • Generell ist es sinnvoll, für Exemplarvariablen get- und setMethoden zu definieren public int getX(){ return x; //this kann weggelassen werden } public void setX(int x){ this.x = x; } public Linie(int x1, int y1, int x2, int y2){ anfang = new Punkt(x1,y1); Linie ende = new Punkt(x2,y2); } +Linie(int,int,int,int) public int xAbstand(){ +xAbstand():int return anfang.getX()-ende.getX(); } • Innerhalb der Implementierung einer Klasse wird häufig auf die Nutzung von get- und set- verzichtet • private für Exemplarvariablen garantiert, dass Methoden in anderen Klassen nur über get und set zugreifen können, sonst public static void main(String[] args) { Linie linie= new Linie(1,1,4,4); System.out.println(linie.xAbstand()); } Punkt pkt= new Punkt(2,3); pkt.x=4; //schlechtester Stil -ende -anfang Punkt } Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 21 Ausführbarkeit und Kompilierung Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 22 Klassenvariablen • Jede Klasse steht in eigener Datei mit Endung .java • Gute Idee: Startmethode main (Parameter beachten) in eigene Klasse auslagern • Klassenvariablen sind globale Variablen innerhalb einer Klasse • Klassenvariablen werden mit dem Modifier static definiert public class Mitarbeiter { static private int anzahl=0; final static public String FIRMA = "FH"; ... public class Main{ // Datei Main.java public static void main(String[] args) { Linie linie= new Linie(1,1,4,4); System.out.println(linie.xAbstand()); } } // Main und Linie in einem Verzeichnis • Klassenvariablen werden für eine Klasse nur einmal angelegt • Klassenvariablen werden (wenn durch public erlaubt) von außen mit Klassenname.Variablenname angesprochen • 1. Schritt: Übersetzung in Byte-Code (entsteht Main.class) System.out.println("Isch bin in "+Mitarbeiter.FIRMA); javac Main.java • in der Klasse selbst anzahl=42; möglich • 2.Schritt: Ausführung des Programms java Main Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 23 Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 24 Klassenmethoden Beispiel zu Exemplar- und Klassenvariablen (1/2) public class Mitarbeiter{ private static int anzahl=0; private int miNr; private String name; • gehören zu einer Klasse und nicht zu einem bestimmten Objekt der Klasse • werden mit dem Schlüsselwort static definiert • können nur statische Teile (Variablen, Methoden) einer Klasse verwenden public Mitarbeiter(String name){ this.name=name; miNr= anzahl++; } public static int gibAnzahl(){ return(anzahl); } • Methodenaufruf – Exemplarmethoden – Klassenmethoden public String toString(){ return "Nr."+miNr+" : "+name; } exemplar.methode(…) Klasse.methode(…) oder exemplar.methode(…) [schlecht] Mitarbeiter -anzahl:int -miNr:int -name:String +Mitarbeiter(String) +toString():String +istChef():boolean +bisherAngestellt():int public boolean istChef(){ return(miNr==0); } public static int bisherAngestellt(){ return anzahl; } } Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 25 Beispiel zu Exemplar- und Klassenvariablen (2/2) Stephan Kleuker Michaela Ramm Stephan Kleuker Michaela Ramm 26 Nutzung von Klassenmethoden public class Main { public static void main(String[] args) { Mitarbeiter m1= new Mitarbeiter("Erhard M."); Mitarbeiter m2= new Mitarbeiter("Stephan K."); System.out.println (m2); // ruft automatisch toString System.out.println("Chef? "+m2.istChef()); System.out.println (m1); System.out.println("Chef? "+m1.istChef()); System.out.println("# Angestellte: " +Mitarbeiter.bisherAngestellt()); } Nr.1 : Stephan K. } Chef? false Nr.0 : Erhard M. Chef? true # Angestellte: 2 Benutzeroberflächen und Software-Ergonomie Benutzeroberflächen und Software-Ergonomie • Klassenmethoden werden dann angeboten, wenn Berechnungen gewünscht sind, die nicht vom Zustand eines Objekts abhängen. Beispiel: Klasse die von der Console liest public class Eingabe { public static String leseString(){...} public static int leseInt(){...} public static float leseFloat(){...} public static double leseDouble(){...} public static boolean leseBoolean(){...} }... public static void main (String[] s){ int eingabe; System.out.print("Gib Zahl: "); eingabe= Eingabe.leseInt(); ... 27 Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 28 Parameterübergabe Arrays (Felder) (1/4) • Datentypen werden „Call by Value“ übergeben • Objekttypen werden „Call by Reference“ übergeben public void machWas(int z, Punkt punkt){// in Klasse Punkt z=0; punkt.setX(42); • In Java sind Arrays (Felder, Reihungen) spezielle Objekte • jedes Element eines Arrays hat den gleichen Typ, dieser wird bei der Deklaration festgelegt • die Länge eines Arrays wird einmal festgelegt und kann nicht einfach verändert werden } public static void main(String[] args) { Punkt pkt= new Punkt(3,3); int y=11; pkt.machWas(y,pkt); System.out.println("y: "+y+" pkt.x: "+pkt.getX()); } y: 11 pkt.x: 42 Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 29 Arrays (Felder) (2/4) • Gemeinsamkeiten von Objekten und Arrays • Arrays werden wie Objekte dynamisch angelegt • Arrays sind Objekte • Wenn ein Array als Exemplarvariable genutzt wird, werden seine Elemente automatisch initialisiert Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 30 Arrays (Felder) (3/4) • Unterschiede zwischen Objekten und Arrays • Arrays haben als einzigen Konstruktor eine spezielle Syntax des new-Operators • Es können keine Unterklassen von Arrays definiert werden • Erzeugen von Arrays durch den new-Operator int[] a1; a1 = new int[4]; int[] a2 = new int[4]; String[] names = new String[4]; • Zugriff auf Arrays • Deklaration von Arrays a1[0] = 1; a1[1] = 2; a1[2] = 3; a1[3] = 4; names[0]="Karl"; names[1]="Jan"; names[2]="Uwe"; names[3]=new String("Hans"); int a1[]; //geht auch, nicht schön int[] a1; String[] names; • Nach einer solchen Deklaration hat die Variable den Wert null (sollte nicht verwundern) Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 31 Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 32 Arrays (Felder) (4/4) Mehrdimensionale Felder • Direktes Initialisieren von Array-Elementen • Arrays die als Basistyp ein Array haben int[] a1 = {1, 2, 3, 4}; String[] names = {"Karl", "Jan", "Uwe", new String("Hans")}; ChessPiece [][] chessBoard ; chessBoard = new ChessPiece[8][8]; chessBoard[0][0] = new ChessPiece("Rook"); • Durch Initialisieren ist die Array-Größe festgelegt • Array-Länge ist durch die sichtbare :( Exemplarvariable length gegeben • direktes Initialisieren mehrdimensionaler Arrays int[][] a = {{1, 2, 3},{1, 2, 3}}; for(int i = 0; i < a1.length; i++) a1[i] = i + 1; • mehrdimensionale Arrays müssen nicht rechteckig sein • Cooler, aber ohne Zugriff auf Laufindex: int[][] a = {{0},{1,2},{1,2,1}}; for(String s:names) System.out.println(s); for(int i:a1) System.out.println(i); Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 33 Zeichenketten (Strings) Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 34 Methoden bei Zeichenketten • Zeichenketten sind Objekte der Klasse java.lang.String String s1 = "konstante Zeichenkette"; StringBuffer s2 = new StringBuffer("änderbare Zeichenkette"); • Verkettung von Zeichenketten String s = "Ein String aus" + " zwei Hälften" • Umwandeln von Zeichenketten (eine Möglichkeit) StringBuffer sb = new StringBuffer("ABC"); sb.append("DEF"); String s = sb.toString(); • Strings mit + zu verknüpfen benötigt mehr Rechenzeit als mit StringBuffer und append zu arbeiten und am Ende toString zu nutzen • einige Methoden der Klasse java.lang.String – length() liefert die Länge des String-Objekts – charAt(int) liefert das Zeichen an Position – equals(String) Vergleichen von Zeichenketten (== testet nur auf Identität) – substring(int,int) liefert den Teilstring • einige Methoden der Klasse java.lang.StringBuffer – append(String) anhängen am Ende des Strings – insert(int,String) fügt Zeichenkette an bestimmter Stelle ein – delete(int,int) löscht einen Teil des Strings – replace(int,int,String) ersetzt Teil des Strings • Hinweis: Stringbuffer-Objekte verstehen auch length(), charAt(int), substring(int,int) Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 35 Benutzeroberflächen und Software-Ergonomie Stephan Kleuker Michaela Ramm 36