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)