Best Practices - In-Secure version of this page (no SSL)
Transcrição
Best Practices - In-Secure version of this page (no SSL)
Vorlesung Programmieren 18 Best Practices 09.02.2015 | Prof. Dr. Ralf H. Reussner Version 1.0 LEHRSTUHL FÜR SOFTWARE-DESIGN UND –QUALITÄT (SDQ) INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD), FAKULTÄT FÜR INFORMATIK sdq.ipd.kit.edu KIT – Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu Literaturhinweis - Weiterlesen Practical Java-Programming Languange Guide, Peter Haggar, Addison Wesley, 2000 Praxis 5, 9, 10, 11, 13, 14 2 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Prinzip 1: Bevorzuge Polymorphie gegenüber instanceof 3 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) instanceof instanceof bestimmt zur Laufzeit zu welcher Klasse ein Objekt gehört. wird häufig im falschen Kontext eingesetzt. kann in vielen Fällen durch Polymorphie ersetzt werden. 4 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Beispiel für ein schlechtes Design interface Employee{ public int salary(); } class Manager implements Employee{ private static final int mgrSal = 40000; public int salary(){ return mgrSal; } class Payroll{ public int calcPayroll(Employee emp){ int money = emp.salary(); //Calculate the bonus. if(emp instanceof Programmer) money+=((Programmer)emp).bonus(); return money; } Arbeit des Java-Laufzeitsystems! public static void main(String arg[]){ Payroll pr = new Payroll(); Programmer prg = new Programmer(); Manager mgr = new Manager(); System.out.println(„Payroll for programmer: “ + pr.calcPayroll(prg) ); System.out.println(„Payroll for Manager: “ + pr.calcPayroll(mgr) ); } } class Programmer implements Employee{ private static final int prgSal = 50000; private static final int prgBonus = 10000; public int salary(){ return prgSal; } public int bonus(){ return prgBonus; } } 5 09.02.2015 Vorlesung Programmieren: Best Practices } Frage: Was passiert, wenn Sie eine weitere Klasse, z.B. Executive hinzufügen möchten? Antwort: zu calcPayroll noch ein instanceof hinzufügen. Schlechtes Design! Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Beispiel für ein geeignetes Design interface Employee{ public int salary(); public int bonus(); } class Manager implements Employee{ private static final int mgrSal = 40000; private static final int mgrBonus = 0; public int salary(){ return mgrSal; } public int bonus(){ return mgrBonus; } } class Programmer implements Employee{ private static final int prgSal = 50000; private static final int prgBonus = 10000; public int salary(){ return prgSal; } public int bonus(){ return prgBonus; } } 6 09.02.2015 Vorlesung Programmieren: Best Practices class Payroll{ public int calcPayroll(Employee emp){ //Calculate the bonus. //No instanceof check needed. return emp.salary() + emp.bonus(); } public static void main(String arg[]){ Payroll pr = new Payroll(); Programmer prg = new Programmer(); Manager mgr = new Manager(); System.out.println(„Payroll for programmer: “ + pr.calcPayroll(prg) ); System.out.println(„Payroll for Manager: “ + pr.calcPayroll(mgr) ); } } Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Prinzip 2: Unterscheidung zwischen == und equals 7 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Häufige Fragen Was ist der Unterschied zwischen == und equals? Kann ich alles mit == vergleichen? Wo brauche ich equals? 8 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Beispiel class Test{ public static void main(String args[]){ int a = 10; int b = 10; System.out.println(„a==b is “+ (a==b)); Integer ia = new Integer(10); Integer ib = new Integer(10); System.out.println(„ia==ib is“+(ia==ib)); class Test{ public static void main(String args[]){ int a = 10; int b = 10; System.out.println(„a is “+ a); System.out.println(„b is “+ b)); System.out.println(„a==b is “+ (a==b)); Integer ia = new Integer(10); Integer ib = new Integer(10); System.out.println(„ia is “+ ia); System.out.println(„ib is “+ ib)); System.out.println(„ia==ib is“+(ia==ib)); } } } } Programmausgabe: a==b is true ia==ib is false 9 09.02.2015 Vorlesung Programmieren: Best Practices Programmausgabe: a is 10 b is 10 a==b is true ia is 10 ib is 10 ia==ib is false Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) == vs. equals Warum verhält sich das Programm so? a und b sind vom Typ int. Sie sind primitive Datentypen. Sie haben keine korrespondierenden Objekte ia und ib sind hingegen vom Typ Integer Sie sind Objektreferenzen ia und ib zeigen auf unterschiedliche Objekte ia == ib liefert also den Vergleich zwischen den Objektreferenzen! Frage: Wie vergleichen Sie dann die gespeicherten Werte in Objekten? Antwort: equals liefert einen semantischen Vergleich! Da equals eine Methode ist, kann sie nur zum Vergleich der Objekte und nicht zum Vergleich der primitiven Datentypen benutzt werden. 10 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Weiteres Beispiel class Test{ public static void main(String args[]){ int a = 10; float b = 10.0f; System.out.println(„a is “+ a); System.out.println(„b is “+ b)); System.out.println(„a==b is “+ (a==b)); Erweiternde Primitivkonvertierung (widening primitive conversion) Integer ia = new Integer(10); Integer fb = new Float(10.0f); System.out.println(„ia is “+ ia); System.out.println(„fb is “+ fb)); System.out.println(„ia.equals(fb) is “+(ia.equals(fb))); System.out.println(„fb.equals(ia) is “+(fb.equals(ia))); } Objekte unterschiedlicher Klassen sind nie gleich. } Programmausgabe: a is 10 b is 10.0 a==b is true ia is 10 fb is 10.0 ia.equals(fb) is false fb.equals(ia) is false 11 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Prinzip 3: Die Standardimplementierung von equals überschreiben 12 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Beispiel class Golfball{ private String brand; private String make; private int compression; public Golfball (String brd, String mk, int comp){ brand = brd; make = mk; compression = comp; } public String brand(){ return brand; } public String make(){ return make; } public int compression(){ return compression; } class Warehouse{ public static void main(String args[]){ Golfball gb1 = new Golfball („BrandX“, „Professional“,100); Golfball gb2 = new Golfball („BrandX“, „Professional“,100); if(gb1.equals(gb2)) System.out.printline („Ball 1 equals Ball 2“); else System.out.printline („Ball 1 does not equal Ball 2“); } } Programmausgabe: Ball 1 does not equal Ball 2 } 13 Zwei Golfbälle sollen genau dann gleich sein, wenn alle Attribute jeweils denselben Wert haben. 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Implementierung der equals-Methode Warum funktionierte equals im Beispiel von Prinzip 2, jedoch hier nicht? Das Beispiel benutzte Objekte der Integer-Klasse. Diese Klasse hat ihre eigene Implementierung der equals-Methode Golfball hat hingegen keine eigene Implementierung der equalsMethode. In diesem Fall wird die Implementierung der equalsMethode der Klasse java.lang.Object verwendet. Wie sieht die Implementierung der equals-Methode der Klasse java.lang.Object aus? public boolean equals(Object obj){ return (this==obj); } 14 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Abhilfe durch eigene Implementierung class Golfball{ // (...), as before public boolean equals(Object obj){ if(this==obj) return true; if(obj !=null && getClass() == obj.getClass()){ Golfball gb = (Golfball)obj; if(brand.equals(gb.brand()) && make.equals(gb.make()) && compression == gb.compression()){ return true; } } return false; } } Programmausgabe: Ball 1 equals Ball 2 Alles funktioniert mit Attributen vom Typ String wie erwartet 15 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Probleme der vorherigen Implementierung Was passiert, wenn brand und make-Attribute von Golfball-Objekt StringBuffer statt String benutzen? class Golfball{ private StringBuffer brand; private StringBuffer make; private int compression; public Golfball(StringBuffer brd, StringBuffer mk, int comp){ brand = brd; make = mk; compression = comp; } public StringBuffer brand(){ return brand; } public StringBuffer make(){ return make; } public int compression(){ return compression; Problem: equals-Implementierung } StringBuffer-Klasse // (...), as before Programmausgabe: } Ball 1 does not equal Ball 2 16 09.02.2015 Vorlesung Programmieren: Best Practices der Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Mögliche Lösungsideen (1) Benutzen von String-Objekt Die einfachste Lösung Abhängig von der konkreten Implementierung kann StringBuffer für brand- und make-Attribut von Golfball benutzt werden. 17 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Mögliche Lösungsideen (2) Benutzen von String statt StringBuffer equals-Methode von Golfball wird so verändert, dass sie StringBuffer-Objekte zu String-Objekte konvertiert, equalsMethode aufgerufen wird. equals-Methode von String wird zum Vergleich verwendet. class Golfball{ // (...), as before public boolean equals(Object obj){ if(this==obj) return true; if(obj !=null && getClass() == obj.getClass()){ Golfball gb = (Golfball)obj; if(brand.toString().equals(gb.brand().toString()) && make.toString().equals(gb.make().toString()) && compression == gb.compression()){ return true; } } Problem: Aufruf einer String-Methode auf einem return false; StringBuffer-Objekt führt jeweils zum Erzeugen eines } neuen String-Objekt. Die Lösung ist sehr aufwendig! } 18 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Mögliche Lösungsideen (3) Eigene StringBuffer-Klasse schreiben, die equals-Methode enthält. Eigene Implementierung von equals-Methode verwenden. Implementierung ist aufwendiger, jedoch sehr vorteilhaft. Folgende Implementierung zeigt eine Enthaltensein-Beziehung zwischen MyStringBuffer und StringBuffer. Grund: StringBuffer ist eine final class Kann von ihr nicht weiter erben. 19 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Beispiel - MyStringBuffer class MyStringBuffer{ private StringBuffer stringbuf; public MyStringBuffer(String str){ stringBuf=new StringBuffer(str); } public int length(){ return StringBuffer.length(); } public synchronised char charAt(int index{ return (stringbuf.charAt(index)); } //Create passthrough methods for the rest of //StringBuffer methods as needed. public boolean equals(Object obj){ if(this==obj) return true; if(obj !=null && getClass() == obj.getClass()){ MyStringBuffer sb= (MyStringBuffer)obj; int len = length(); if(len!=sb.length()) return false; 20 09.02.2015 Vorlesung Programmieren: Best Practices int index = 0; while(index!=len){ if(charAt(index)!=sb.charAt(index)) return false; else index++; } return true; } return false; } } Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Beispiel - Golfball class Golfball{ private MyStringBuffer brand; private MyStringBuffer make; private int compression; public Golfball (MyStringBuffer brd, MyStringBuffer mk, int comp){ brand=brd; make=mk; compression = comp; } public MyStringBuffer brand(){ return brand; } public MyStringBuffer make(){ return make; } public int compression(){ return compression; } 21 09.02.2015 Vorlesung Programmieren: Best Practices public boolean equals(Object obj){ if(this==obj) return true; if(obj !=null && getClass() == obj.getClass()){ Golfball gb = (Golfball)obj; if(brand.equals(gb.brand()) && make.equals(gb.make()) && compression == gb.cmpression()){ return true; } } return false; } //... } Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Mögliche Lösungsideen (4) equals-Methode zunächst nicht weiter berücksichtigen. Eigene compare-Methode implementieren, die zwei StringBufferObjekte vergleicht. equals-Methode der Golfball-Klasse so verändern, dass sie statt equals-Methode compare-Methode verwendet. Vorteile: Implementierung weiterer Klassen nicht nötig Nachteile: equals-Methode der Golfball-Klasse ruft eine compareMethode statt eine equals-Methode auf. Wird in Zukunft beispielsweise wieder eine String-Objekt benutzt, muss die Implementierung der equals-Methode geändert werden. 22 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Prinzip 4: Vorsicht bei der Implementierung von equals 23 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Wichtige Fragen bei der Implementierung Beantworten Sie folgende Fragen, bevor Sie equals-Methode neu implementieren. Benötigt die Klasse überhaupt eine equals-Methode? Nur wenn die Objekte der Klassen logisch miteinander verglichen werden müssen, d.h. wenn der Vergleich zweier Referenzen nicht genügt. Die zuvor gezeigte Implementierungen der equals-Methode können nicht ohne weiteres auf alle Implementierungen angewendet werden. Welche Objekte sollen verglichen werden? Nur Objekte derselben Klasse oder Objekte der Unterklassen mit der Objekte der Basisklasse? Ihre Implementierung muss dies widerspiegeln 24 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Prinzip 5: super.equals verwenden 25 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Vererbung und equals Was passiert mit der equals-Methode bei der Vererbung? Können Objekte der abgeleiteten Klassen mit Objekten der Basisklasse verglichen werden? 26 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Beispiel für einen fehlerhaften Code class MyGolfball extends Golfball{ public static final byte TWO_PIECE=0; public static final byte THREE_PIECE=1; private byte ballConstruction; public MyGolfball(String str, String mk, int comp, byte construction){ super(str, mk, comp); ballConstruction=construction; } public byte construction(){ return ballConstruction; } public boolean equals(Object obj){ if (this==obj) return true; if(obj!=null && getClass()==obj.getClass()){ 2 Golfbälle bereits gleich, wenn bloß MyGolfball gb = (MyGolfball)obj; ballConstruction-Attribute denselben if(ballConstruction==gb.construction()) Wert haben return true; } return false; } } 27 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Beispiel für einen fehlerhaften Code Der Code zum Vergleichen der Golfball-Objekte: class Warehouse{ public static void main(String args[]){ MyGolfball gb1=new MyGolfball(„BrandX“, „Professional“,100, MyGolfball.TWO_PIECE); MyGolfball gb2=new MyGolfball(„BrandX“, „Professional“,100, MyGolfball.TWO_PIECE); //... if(gb1.equals(gb2)) System.out.println(„Ball 1 equals Ball 2“); else System.out.println(„Ball 1 does not equal Ball 2 “); } } Was passiert, wenn zwei Golfball-Objekte unterschiedliche Attributswerte haben? z.B.: MyGolfball gb1=new MyGolfball(„BrandX“, „Professional“,100, MyGolfball.TWO_PIECE); MyGolfball gb2=new MyGolfball(„BrandX“, „Professional“,90, MyGolfball.TWO_PIECE); Obwohl die beiden Objekte unterschiedlich sind, liefert equals: Ball 1 equals Ball 2 28 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Lösung Warum verhält sich das Programm so? Der Code in der main-Methode: if (gb1.equals(gb2)) ruft die equals-Methode von MyGolfball auf. Diese Methode vergleicht nur ballConstruction-Attribute von zwei MyGolfball-Objekten. equals-Methode von Golfball wird nicht weiter ausgeführt. Die Attribute brand, make und compression werden nicht verglichen. Lösung: public boolean equals(Object obj){ if (this==obj) return true; if(obj!=null && getClass()==obj.getClass() && super.equals(obj)){ MyGolfball gb = (MyGolfball)obj; if(ballConstruction==gb.construction()) return true; } return false; } 29 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Alternative Lösung Eine kürzere Lösung: public boolean equals(Object obj){ if(super.equals(obj)){ MyGolfball gb = (MyGolfball)obj; if(ballConstruction==gb.construction()) return true; } return false; } Vorsicht beim Benutzen von kürzeren Lösung. Sie müssen immer wissen, wie equals-Methode in der Basisklasse implementiert ist. 30 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Mehrere Ebenen in der Vererbungshierarchie Was passiert, wenn eine weitere Klasse in der Vererbungshierarchie zwischen den beiden Klassen Golfball und MyGolfball hinzugefügt wird? Da MyGolfball super.equals aufruft, funktioniert alles fehlerfrei. Daumenregel: Sobald eine Basisklasse die equals-Methode implementiert, muss die equals-Methode der abgeleiteten Implementierung super.equals aufrufen. Ausnahme: Basisklasse java.lang.Object, da kein semantischer Vergleich auf Attributbasis durchgeführt wird 31 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Prinzip 6: Vorsicht bei der Verwendung von instanceof in equals 32 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Vergleich der Objekte Bisher wurden Objekte von Klassen in derselben Vererbungsebene miteinander verglichen. Verwendung von getClass Wann können die Objekte der abgeleiteten Klassen mit den Objekten der Basisklasse verglichen werden? Wenn die abgeleitete Klasse nur das Verhalten der Basisklasse ändert Die relevanten Attribute bleiben also gleich Wie können die Objekte der abgeleiteten Klassen mit den Objekten der Basisklasse verglichen werden? Die Basisklasse benutzt in der Implementierung der equals-Methode instanceof statt getClass getClass Die Objekte der abgeleiteten Klassen sind niemals gleich mit den Objekten der Basisklasse Die abgeleitete Klasse darf equals-Methode nicht implementieren. Die abgeleitete Klasse kann keine weiteren Attribute berücksichtigen 33 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Motivierendes Beispiel für Verhaltensänderung class Car{ private String make; private int year; public void drive(){ //code to drive the car } public boolean equals(Object obj){ //compare make and year for equality } } 34 09.02.2015 Vorlesung Programmieren: Best Practices class MyCar extends Car{ public void drive(){ //code to drive the car, differently //than base class, Car } } Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Motivierendes Beispiel für Verhaltensänderung class Base{ public boolean equals(Object obj){ if (obj instanceof Base) //... } } class Derived extends Base{ } Base b = new Base(); Derived d = new Derived(); if (d.equals(b)) Bei Gleichheit liefert true if (b.equals(d)) Bei Gleichheit liefert true Symmetrieeigenschaft ist gegeben: d.equals(b) == b.equals(d) 35 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Motivierendes Beispiel für Verhaltensänderung 36 class Base{ public boolean equals(Object obj){ if (obj instanceof Base) //... } } Base b = new Base(); Derived d = new Derived(); class Derived extends Base{ public boolean equals(Object obj){ if (super.equals(obj)) //... } } Die Symmetrie geht verloren Grund: equals-Methode der abgeleiteten Klasse wird mit einem Objekt vom Typ Base aufgerufen. wegen super.equals(obj) wird der Code der Basisklasse ausgeführt if (obj instanceof Base) liefert true 09.02.2015 Vorlesung Programmieren: Best Practices if (d.equals(b)) liefert immer true Ein ungültiger Vergleich ist möglich Nicht alle Objekte der Unterklassen müssen immer beim Vergleich mit den Objekten der Basisklasse true liefern Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Motivierendes Beispiel für Verhaltensänderung class Base{ public boolean equals(Object obj){ if (obj instanceof Base) //... } } Base b = new Base(); Derived d = new Derived(); class Derived extends Base{ public boolean equals(Object obj){ if (obj instanceof Derived) //... } } if (b.equals(d)) equals-Methode der Basisklasse wird verwendet. instanceof-Überprüfung liefert true if (d.equals(b)) liefert immer false Sind die Attribute gleich liefert immer true 1. Dieses Verhalten ist unintuitiv und fehleranfällig 2. Beim Testen muss dem Programmierer der genaue Code bekannt sein. 3. Dies gilt für alle, die den Code benutzen. 4. Wenn ein Objekt durch seine Basisklasse referenziert wird, kann ein Objekt vom Typ java.lang.Object zurückgeben. Ohne zusätzliche Überprüfung kann nicht die abgeleitete Klasse identifiziert werden. 37 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Zusammenfassung Die Basisklasse implementiert equals-Methode, die abgeleitete Klasse jedoch nicht Wenn die Basisklasse in der Implementierung instanceof benutzt, können die Objekte der Unterklassen mit Objekte der Oberklassen verglichen werden Der Vergleich ist symmetrisch Die Basisklasse und die abgeleitete Klasse implementieren equalsMethode: Wenn die equals-Methode der beiden Klassen instanceof benutzt false wird zurückgegeben, wenn equals-Methode der abgeleiteten Klasse verwendet wird. true wird zurückgegeben, wenn equals-Methode der Basisklasse verwendet wird. Die abgeleitete Klasse implementiert equals-Methode, die Basisklasse jedoch nicht equals-Aufrufe der beiden Methoden liefern false (jedoch aus unterschiedlichen Gründen) 38 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Software-Technik Diese Vorlesung: „Programmieren im Kleinen“ Reicht das aus, um auch große Systeme zu entwickeln? Im Prinzip: ja Aber weitere Probleme kommen hinzu: Wartbarkeit Zusammenspiel verschiedener Komponenten / Subsysteme Programmentwicklung im Team Software-Engineering: Software Engineering is the application of systematic, quantifiable approaches to the development, operation, and maintenance of software; i.e., the application of engineering to software 39 09.02.2015 Vorlesung Programmieren: Objekt-orientierte Design-Prinzipien Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Termine Anmeldung zur Abschlussaufgabe: von 02. Februar bis 27. Februar Anmeldung erst möglich, nachdem Übungsschein als „bestanden“ ins Campus-Management-System eingetragen wurde. Das passiert nicht vor dem 11.02. 40 Abschlussaufgabe 1: Ausgabe: Abgabe: 16. Februar 16. März Abschlussaufgabe 2: Ausgabe: Abgabe: 2. März 30. März 09.02.2015 Vorlesung Programmieren: Objekt-orientierte Design-Prinzipien Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Was noch fehlt Nicht in dieser Vorlesung behandelt: Threads (Nebenläufigkeit, paralleles Programmieren) Remote Method Invocation (Client/Server-Programmierung) Entwurfsmuster (Design Patterns) Programmierung grafischer Oberflächen Java Beans Java Security 41 09.02.2015 Vorlesung Programmieren: Objekt-orientierte Design-Prinzipien Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Proseminar „Software Katastrophen“ im SoSe‘15 „Software Katastrophen – was Software-Fehler anrichten, und was wir aus ihnen lernen können“ Vorläufige Themenliste Softwareprobleme, die bei einem Jahreswechsel auftreten können Der Software-Bug, der 370 Million Dollar kostete: Der Absturz der ersten Ariane 5 Rakete Wie ein Windows-Update zum Ausfall des gesamten Skype-Netzwerks führte Unerlaubter Zutritt zu Hochsicherheitsbereichen durch Schwächen in Software, die biometrischen Merkmale prüft Fehlerhafte Tempomaten in Autos Wie Fehler in CAD-Programmen zum Einsturz von Gebäuden führen können Ausnutzen von Software-Bugs in Spielautomaten Softwarefehler, die zur Verspätung von Zügen führen Wie Softwarefehler zu Börsencrashs führen können Rückrufe bei Automobilherstellern, um Softwarebugs in Steuergeräten von Autos zu beheben Manipulationen von Wahlen durch Ausnutzen von Fehlern in elektronischen Wahlsystemen Bugs in Cloud/Mailsystemen, die zum Verlust von personenbezogenen Daten führten Bekannte Rundungsfehler in Computersystemen und deren Auswirkungen Menschen, die durch Fehler in Computersystemen in Autos oder Fahrstühlen etc. eingeschlossen wurden In Kooperation mit dem Institut für Germanistik Frühzeitige Anmeldung erforderlich Interesse? https://sdqweb.ipd.kit.edu/wiki/Proseminar_Software-Katastrophen_SS15 42 09.02.2015 Vorlesung Programmieren: Best Practices Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Wie geht es weiter? Übungsschein nicht bestanden? Übungsblätter + Abschlussaufgaben auch im SoSe‘15 angeboten, keine Vorlesung, keine Tutorien https://sdqweb.ipd.kit.edu/wiki/Übung_Programmieren_SS15 Für Informatikstudenten: 2. Semester: Vorlesung Softwaretechnik 3. Semester: Praxis der Software-Entwicklung Und wie verbessern Sie Ihre Programmierkenntnisse? Lesen Sie Programme! Schreiben Sie Programme! Nutzen Sie Informationsquellen im Internet (z.B. http://stackoverflow.com) Nehmen Sie an Veranstaltungen teil (z.B. Hackathon Karlsruhe) Viel Erfolg in Ihrem weiteren Studium! Viel Spaß beim Programmieren! 43 09.02.2015 Vorlesung Programmieren: Objekt-orientierte Design-Prinzipien Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD)