Advanced Software Engineering WS0910 Kapitel3. Dr. Dominik Haneberg

Größe: px
Ab Seite anzeigen:

Download "Advanced Software Engineering WS0910 Kapitel3. Dr. Dominik Haneberg"

Transkript

1 Advanced Software Engineering WS0910 Kapitel3 Dr. Dominik Haneberg

2 REFACTORING Advanced Software Engineering 2

3 Inhalte dieses Kapitels Was ist Refactoring? Wozu und wann refactorn? Wie geht man vor? Beispiel für ein Refactoring (im Kleinen und im Großen) Code Smells und übliche Refactorings Advanced Software Engineering 3

4 GRUNDBEGRIFFE IM REFACTORING Advanced Software Engineering 4

5 Was ist Refactoring? Refactoring (noun): A change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior. Refactoring (verb): To restructure software by applying a series of refactorings. Definition: Systematische Umstrukturierung von Code ohne dessen Verhalten zu ändern Nutzen: Bessere Lesbarkeit und Verständlichkeit Besseres Design Besser Wartbarkeit und Wiederverwendbarkeit M. Fowler: Refactoring Improving the Design of Existing Code, Addison- Wesley, Advanced Software Engineering 5

6 Warum Refactorings anwenden Refactoring verbessert das Design der Software Oft geänderte Software verliert mit der Zeit ihre Struktur Redundanter Code erfordert vielfache Änderungen Extraktion gemeinsamer Teile ermöglicht jede Änderung an genau einer Stelle durchzuführen Refactoring macht die Software verständlicher Verständlichkeit für den Programmierer, der vielleicht später am Programm Erweiterungen vornimmt Wenn man sich in ein Programm einarbeitet, kann man es besser verstehen, wenn man es restrukturiert Refactoring hilft Bugs zu finden Im Prozess des Refactorings erwirbt man ein tiefes Verständnis für den Code. Man kann Bugs leichter finden Refactoring macht das Programmieren schneller Wenn der Code ein gutes Design hat, gut verständlich ist und daher auch wenig Bugs hat, kann man schneller programmieren Advanced Software Engineering 6

7 Vorgehen Wann refactorn? Ständig: Es gibt keinen festen Refactoring Zeitslot Wenn man Code liest und zu verstehen versucht Rule of Three Beim Hinzufügen neuer Funktionalität Beim Entfernen von Fehlern Bei Code Reviews Vorgehen Code Smell erkannt Ausreichend Unittests vorhanden und erfolgreich Refactoring anwenden Mit Unittests Erhalt der Funktionalität prüfen Advanced Software Engineering 7

8 Code Smells und Refactorings Code Smell: code smell is any symptom in the source code of a program that possibly indicates a deeper problem. Der Begriff geht auf Kent Beck zurück Bezeichnet Strukturen/Muster im Code, die auf schlechtes OO-Design, schlechte Wartbarkeit, Verständlichkeit usw. hindeuten Beispiele: Duplicate Code Large Class Inappropriate intimacy Large Method Advanced Software Engineering 8

9 Code Smells und Refactorings Refactoring: Präzise Vorgehensbeschreibung für eine Änderung am Code, mit dem Ziel einer Strukturverbesserung Bestandteile eines Refactorings: Problembeschreibung (Code Smell) Kurze Beschreibung der Codeänderung Schritt für Schritt Änderungsvorschrift Motivation für die Codeänderung (folgt oftmals aus den Grundprinzipien für gutes OO-Design) Ggf. Beispiele Advanced Software Engineering 9

10 Beispiel für ein Refactoring Introduce Explaining Variable Problem: You have a complicated expression Kurzfassung der Änderung: Put the result of the expression, or parts of the expression, in a temporary variable with a name that explains the purpose. Motivation: Expressions can become very complex and hard to read. In such situations temporary variables can be helpful to break down the expression into something more manageable. Introduce Explaining Variable is particularly valuable with conditional logic Advanced Software Engineering 10

11 Beispiel für ein Refactoring Introduce Explaining Variable Vorgehensweise: Declare final temporary variable, and set it to the result of a part of the complex expression. Replace the result part of the expression with the temp. If the result part of the expression is repeated, you can replace the repeats one at a time Compile and test. Repeat for other parts of the expression Advanced Software Engineering 11

12 Beispiel für ein Refactoring Introduce Explaining Variable Beispiel: if ( (platform.touppercase().indexof("mac") > -1) && (browser.touppercase().indexof("ie") > -1) && wasinitialized() && resize > 0) { // do something Advanced Software Engineering 12

13 Beispiel für ein Refactoring Introduce Explaining Variable Beispiel: if ( (platform.touppercase().indexof("mac") > -1) && (browser.touppercase().indexof("ie") > -1) && wasinitialized() && resize > 0) { // do something final boolean ismaxos = platform.touppercase().indexof("mac") > -1; final boolean isiebrowser = browser.touppercase().indexof("ie") > -1; final boolean wasresized = resize > 0; if (ismacos && isiebrowser && wasinitialized() && wasresized) { // do something Advanced Software Engineering 13

14 EIN ANWENDUNGSBEISPIEL Advanced Software Engineering 14

15 Videos können im Laufe der Zeit zu verschiedenen Preiskategorien gehören (Normal, Kinder, Neuerscheinung) Jede Preiskategorie beinhaltet eine andere Preisberechnung Jede Ausleihe führt zur Gutschrift von Bonuspunkten, die am Jahresende abgerechnet werden Der Umfang der Gutschrift hängt ebenfalls von der Preiskategorie ab Für jeden Kunden soll es möglich sein, eine Rechnung für die ausgeliehenen Videos auszudrucken Titel und Preis eines jeden ausgeliehenen Videos Summe der Ausleihgebühren Summe der Bonuspunkte Advanced Software Engineering 15

16 name: String Customer statement:string getname(): String addrental(rental) 1 daysrented: int Rental getdaysrented(): int getmovie(): Movie * rentals * 1 movie title: String pricecode: int gettitle(): String getpricecode(): int setpricecode(int) Movie Advanced Software Engineering 16

17 Movie: Eine einfache Datenklasse public class Movie { public static final int CHILDRENS = 2; public static final int REGULAR = 0; public static final int NEW_RELEASE = 1; private String title; private int pricecode; public Movie(String title, int pricecode) { this.title = title; this.pricecode = pricecode; public int getpricecode() { return pricecode; public void setpricecode(int pricecode) { this.pricecode = pricecode; public String gettitle() { return title; Advanced Software Engineering 17

18 Rental: Repräsentiert eine Ausleihe public class Rental { private Movie movie; private int daysrented; public Rental(Movie movie, int daysrented) { this.movie = movie; this.daysrented = daysrented; public int getdaysrented() { return daysrented; public Movie getmovie() { return movie; Advanced Software Engineering 18

19 Customer: Repräsentiert einen Kunden public class Customer { private String name; private Vector rentals = new Vector(); public Customer(String name) { this.name = name; public void addrental(rental newrental) { rentals.addelement(newrental); public String getname() { return name; Advanced Software Engineering 19

20 Customer: Die Methode statement() Advanced Software Engineering 20

21 Customer: Die Methode statement() public String statement() { double totalamount = 0; int frequentrenterpoints = 0; Enumeration rented = rentals.elements(); String result = Rental Record for + getname() + \n ; while (rented.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rented.nextelement(); //determine amounts for each line switch (each.getmovie().getpricecode()) { case Movie.REGULAR: thisamount += 2; if (each.getdaysrented() > 2) thisamount += (each.getdaysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: thisamount += each.getdaysrented() * 3; break; case Movie.CHILDRENS: thisamount += 1.5; if (each.getdaysrented() > 3) thisamount += (each.getdaysrented() 3) * 1.5; break; Advanced Software Engineering 21

22 Customer: Die Methode statement() // add frequent renter points frequentrenterpoints++; // add bonus for a two day new release rental if ((each.getmovie().getpricecode() == Movie.NEW_RELEASE) && each.getdaysrented() > 1) frequentrenterpoints++; // show figures for this rental result += \t + each.getmovie().gettitle() + \t + String.valueOf(thisAmount) + \n ; totalamount += thisamount; // add footer result += Amount owned is + String.valueOf(totalAmount) + \n ; result += You earned + String.valueOf(frequentRenterPoints) + frequent renter points ; return result; Something is rotten in the state of Denmark Advanced Software Engineering 22

23 Eine neue Kundenanforderung ist umzusetzen Zusätzlich zu statement() ist nun auch eine HTML- Ausgabe gewünscht Und nun: Den Code duplizieren?? Advanced Software Engineering 23

24 Aufteilung und Umverteilung der Methode statement() Refactoring: Extract Method //determine amounts for each line switch (each.getmovie().getpricecode()) { case Movie.REGULAR: thisamount += 2; if (each.getdaysrented() > 2) thisamount += (each.getdaysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: thisamount += each.getdaysrented() * 3; break; case Movie.CHILDRENS: thisamount += 1.5; if (each.getdaysrented() > 3) thisamount += (each.getdaysrented() 3) * 1.5; break; Advanced Software Engineering 24

25 Aufteilung und Umverteilung der Methode statement() Refactoring: Extract Method public int amountfor(rental each) { int thisamount = 0; switch (each.getmovie().getpricecode()) { case Movie.REGULAR: thisamount += 2; if (each.getdaysrented() > 2) thisamount += (each.getdaysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: thisamount += each.getdaysrented() * 3; break; case Movie.CHILDRENS: thisamount += 1.5; if (each.getdaysrented() > 3) thisamount += (each.getdaysrented() 3) * 1.5; break; return thisamount; Advanced Software Engineering 25

26 Aufteilung und Umverteilung der Methode statement() Refactoring: Extract Method public String statement() { double totalamount = 0; int frequentrenterpoints = 0; Enumeration rented = rentals.elements(); String result = Rental Record for + getname() + \n ; while (rented.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rented.nextelement(); thisamount = amountfor(each); Advanced Software Engineering 26

27 Aufteilung Falscher und Umverteilung Typ der Methode statement() Refactoring: Extract Method public int amountfor(rental each) { int thisamount = 0; switch (each.getmovie().getpricecode()) { case Movie.REGULAR: thisamount += 2; if (each.getdaysrented() > 2) thisamount += (each.getdaysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: thisamount += each.getdaysrented() * 3; break; case Movie.CHILDRENS: thisamount += 1.5; if (each.getdaysrented() > 3) thisamount += (each.getdaysrented() 3) * 1.5; break; return thisamount; Advanced Software Engineering 27

28 Gute Namen in amountfor() In der neuen Methode sind noch einige Variablennamen schlecht public double amountfor(rental each) { double thisamount = 0; switch (each.getmovie().getpricecode()) { case Movie.REGULAR: thisamount += 2; if (each.getdaysrented() > 2) thisamount += (each.getdaysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: thisamount += each.getdaysrented() * 3; break; case Movie.CHILDRENS: thisamount += 1.5; if (each.getdaysrented() > 3) thisamount += (each.getdaysrented() 3) * 1.5; break; return thisamount; Advanced Software Engineering 28

29 Gute Namen in amountfor() In der neuen Methode sind noch einige Variablennamen schlecht public double amountfor(rental arental) { double result = 0; switch (arental.getmovie().getpricecode()) { case Movie.REGULAR: result += 2; if (arental.getdaysrented() > 2) result += (arental.getdaysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: result += arental.getdaysrented() * 3; break; case Movie.CHILDRENS: result += 1.5; if (arental.getdaysrented() > 3) result += (arental.getdaysrented() 3) * 1.5; break; return result; Any fool can write code that a computer can understand. Good programmers write code that humans can understand Advanced Software Engineering 29

30 amountfor() in die Klasse Rental verschieben Refactoring: Move Method public class Rental {... public double getcharge() { double result = 0; switch (getmovie().getpricecode()) { case Movie.REGULAR: result += 2; if (getdaysrented() > 2) result += (getdaysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: result += getdaysrented() * 3; break; case Movie.CHILDRENS: result += 1.5; if (getdaysrented() > 3) result += (getdaysrented() 3) * 1.5; break; return result; public class Customer { private double amountfor(rental arental) { return arental.getcharge(); Advanced Software Engineering 30

31 amountfor() in die Klasse Rental verschieben Refactoring: Move Method public String statement() { double totalamount = 0; int frequentrenterpoints = 0; Enumeration rented = rentals.elements(); String result = Rental Record for + getname() + \n ; while (rented.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rented.nextelement(); thisamount = each.getcharge(); Advanced Software Engineering 31

32 name: String Customer statement:string getname(): String addrental(rental) 1 daysrented: int Rental getdaysrented(): int getmovie(): Movie getcharge(): double * rentals * 1 movie title: String pricecode: int gettitle(): String getpricecode(): int setpricecode(int) Movie Advanced Software Engineering 32

33 Redundanz in der Methode statement() beseitigen Refactoring: Replace Temp with Query public String statement() { double totalamount = 0; int frequentrenterpoints = 0; Enumeration rented = rentals.elements(); String result = Rental Record for + getname() + \n ; while (rented.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rented.nextelement(); thisamount = each.getcharge(); // show figures for this rental result += \t + each.getmovie().gettitle() + \t + String.valueOf(thisAmount) + \n ; totalamount += thisamount; Advanced Software Engineering 33

34 Redundanz in der Methode statement() beseitigen Refactoring: Replace Temp with Query public String statement() { double totalamount = 0; int frequentrenterpoints = 0; Enumeration rented = rentals.elements(); String result = Rental Record for + getname() + \n ; while (rented.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rented.nextelement(); // show figures for this rental result += \t + each.getmovie().gettitle() + \t + String.valueOf(each.getCharge()) + \n ; totalamount += each.getcharge(); Advanced Software Engineering 34

35 Die frequent renter points in eigener Methode berechnen Refactoring: Extract Method while (rented.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rented.nextelement(); // add frequent renter points frequentrenterpoints++; // add bonus for a two day new release rental if ((each.getmovie().getpricecode() == Movie.NEW_RELEASE) && each.getdaysrented() > 1) frequentrenterpoints++; // show figures for this rental result += \t + each.getmovie().gettitle() + \t + String.valueOf(each.getCharge()) + \n ; totalamount += each.getcharge(); // add footer result += Amount owned is + String.valueOf(totalAmount) + \n ; result += You earned + String.valueOf(frequentRenterPoints) + frequent renter points ; return result; Advanced Software Engineering 35

36 Die frequent renter points in eigener Methode berechnen Refactoring: Extract Method und Move Method while (rented.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rented.nextelement(); frequentrenterpoints += each.getfrequentrenterpoints(); // show figures for this rental result += \t + each.getmovie().gettitle() + \t + String.valueOf(each.getCharge()) + \n ; totalamount += each.getcharge(); // add footer result += Amount owned is + String.valueOf(totalAmount) + \n ; result += You earned + String.valueOf(frequentRenterPoints) + frequent renter points ; return result; public class Rental { public int getfrequentrenterpoints() { if ((getmovie().getpricecode() == Movie.NEW_RELEASE) && getdaysrented() > 1) return 2; else return1; Advanced Software Engineering 36

37 name: String Customer statement:string getname(): String addrental(rental) 1 daysrented: int Rental getdaysrented(): int getmovie(): Movie getcharge(): double getfrequentrenterpoints(): int * rentals * 1 movie title: String pricecode: int gettitle(): String getpricecode(): int setpricecode(int) Movie Advanced Software Engineering 37

38 Die Methode statement() nach dem Refactoring Advanced Software Engineering 38

39 Weitere Hilfsvariablen eliminieren Refactoring: Replace Temp with Query while (rented.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rented.nextelement(); frequentrenterpoints += each.getfrequentrenterpoints(); // show figures for this rental result += \t + each.getmovie().gettitle() + \t + String.valueOf(each.getCharge()) + \n ; totalamount += each.getcharge(); // add footer result += Amount owned is + String.valueOf(totalAmount) + \n ; result += You earned + String.valueOf(frequentRenterPoints) + frequent renter points ; return result; Advanced Software Engineering 39

40 totalamount durch gettotalcharge() ersetzt Refactoring: Replace Temp with Query while (rented.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rented.nextelement(); frequentrenterpoints += each.getfrequentrenterpoints(); // show figures for this rental result += \t + each.getmovie().gettitle() + \t + String.valueOf(each.getCharge()) + \n ; // add footer result += Amount owned is + String.valueOf(getTotalCharge()) + \n ; result += You earned + String.valueOf(frequentRenterPoints) + frequent renter points ; return result; private double gettotalcharge() { double result = 0; Enumeration rented = rentals.elements(); while (rented.hasmoreelements()) { Rental each = (Rental) rented.nextelement(); result += each.getcharge(); return result; Advanced Software Engineering 40

41 name: String Customer statement:string getname(): String addrental(rental) gettotalcharge(): double gettotalfrequentrenterpoints(): int 1 daysrented: int Rental getdaysrented(): int getmovie(): Movie getcharge(): double getfrequentrenterpoints(): int * rentals * 1 movie title: String pricecode: int gettitle(): String getpricecode(): int setpricecode(int) Movie Advanced Software Engineering 41

42 Die Methode statement() nach dem Refactoring II Advanced Software Engineering 42

43 Eine neue Kundenanforderung ist umzusetzen Der Kunde denkt an eine Erweiterung seines Geschäfts. Es gibt neue Klassifikationen von Filmen und bestehende werden vielleicht geändert Und nun: Änderung in mehreren Methoden von Rental erforderlich (Fallunterscheidung über pricecode von Movie). Nichtlokale Änderungen sind nicht gut Advanced Software Engineering 43

44 Schritt 1: getcharge und getfrequentrenterpoints in Klasse Movie public class Movie { public double getcharge(int daysrented) { double result = 0; switch (getpricecode()) { case Movie.REGULAR: result += 2; if (daysrented() > 2) result += (daysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: result += daysrented() * 3; break; case Movie.CHILDRENS: result += 1.5; if (daysrented() > 3) result += (daysrented() 3) * 1.5; break; return result; public class Rental { public double getcharge() { return movie.getcharge(daysrented); Advanced Software Engineering 44

45 name: String Customer statement:string getname(): String addrental(rental) gettotalcharge(): double gettotalfrequentrenterpoints(): int 1 daysrented: int Rental getdaysrented(): int getmovie(): Movie getcharge(): double getfrequentrenterpoints(): int * rentals * movie 1 title: String pricecode: int Movie gettitle(): String getpricecode(): int setpricecode(int) getcharge(): double getfrequentrenterpoints(): int Advanced Software Engineering 45

46 title: String pricecode: int Movie gettitle(): String getpricecode(): int setpricecode(int) getcharge(): double getfrequentrenterpoints(): int 1 Price getcharge(int) : double RegularPrice ChildrensPrice NewReleasePrice getcharge(int) : double getcharge(int) : double getcharge(int) : double Advanced Software Engineering 46

47 Zugriff auf Statusinformation über getter/setter Refactoring: Self Encapsulate Field public class Movie { public Movie(String title, int pricecode) { this.title = title; setpricecode(pricecode); public abstract class Price { public abstract int getpricecode(); public abstract class ChildrensPrice extends Price { public abstract int getpricecode() { return Movie.CHILDRENS; public abstract class RegularePrice extends Price { public abstract int getpricecode() { return Movie.REGULAR; public abstract class NewReleasePrice extends Price { public abstract int getpricecode() { return Movie.NEW_RELEASE; Advanced Software Engineering 47

48 pricecode wird durch ein price-feld ersetzt public class Movie { private Price price; public int getpricecode() { return price.getpricecode(); public void setpricecode(int pricecode) { switch (pricecode) { case REGULAR: price = new RegularPrice(); break; case CHILDRENS: price = new ChildrensPrice(); break; case NEW_RELEASE: price = new NewReleasePrice(); break; default: throw new IllegalArgumentException("Incorrect Price Code"); Advanced Software Engineering 48

49 getcharge() in Klasse Price public class Movie { public double getcharge(int daysrented) { return price.getcharge(daysrented) ; public class Price { public double getcharge(int daysrented) { double result = 0; switch (getpricecode()) { case Movie.REGULAR: result += 2; if (daysrented() > 2) result += (daysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: result += daysrented() * 3; break; case Movie.CHILDRENS: result += 1.5; if (daysrented() > 3) result += (daysrented() 3) * 1.5; break; return result; Advanced Software Engineering 49

50 Der letzte Schritt public class RegularPrice { public double getcharge(int daysrented) { double result = 2; if (daysrented > 2) result += (daysrented 2) * 1.5; return result; public class ChildrensPrice { public double getcharge(int daysrented) { double result = 1.5; if (daysrented > 3) result += (daysrented 3) * 1.5; return result; public class NewReleasePrice { public double getcharge(int daysrented) { return daysrented * 3; public class Price { public abstract double getcharge(int daysrented) ; Advanced Software Engineering 50

51 Die Aufrufsequenz nach den Refactorings Advanced Software Engineering 51

52 EINIGE REFACTORINGS Advanced Software Engineering 52

53 (Self) Encapsulate Field Zugriff auf Feld erfolgt direkt, aber die Koppelung an das Feld wird ungünstig Bei indirekten Zugriff übergang auf abgeleitetes Attribut möglich (z.b. in Unterklasse) Direkter Zugriff auf Feld von außen verlangt nach Wissen über Implementierungsdetail. Solche Informationen sollten verborgen werden. Zugriff über get-methode erlaubt lazy-initialization Advanced Software Engineering 53

54 (Self) Encapsulate Field Vorgehen get- und set-methoden anlegen Alle Referenzen auf das Feld suchen und durch Aufruf von get- bzw. set-methode ersetzen Feld als private deklarieren Nochmals prüfen, ob alle Verweise auf das Feld geändert wurden Kompilieren und testen Advanced Software Engineering 54

55 (Self) Encapsulate Field Beispiel private int low, high; boolean includes(int arg) { return arg >= low && arg <= high; private int low, high; boolean includes(int arg) { return arg >= getlow() && arg <= gethigh(); int getlow() { return low; int gethigh() { return high; Advanced Software Engineering 55

56 Move Method Eine Methode nutzt jetzt oder in Zukunft mehr Features einer anderen Klasse als derjenigen, in der sie definiert ist, oder die Methode wird häufiger von einer fremden Klasse benutzt als von der eigenen. Geschickte Positionierung von Methoden macht Klassen einfacher Coupling kann reduziert werden, Cohesion erhöht Verschieben von Feldern führt oft dazu, dass auch Methoden verschoben werden sollten Advanced Software Engineering 56

57 Move Method Vorgehen Alle Features, die die Quellmethode nutzt und die in der Quellklasse definiert sind, untersuchen, ob sie auch verschoben werden sollten Sub- und Superklassen auf weitere Definitionen der Methoden untersuchen Methode in der Zielklasse deklarieren Code in die Zielklasse kopieren. Ggf. an neue Umgebung anpassen, z.b. weitere Parameter Zielklasse kompilieren Festlegen, wie das korrekte Zielobjekt in der Quellklassen referenziert werden kann Advanced Software Engineering 57

58 Move Method Vorgehen Die Quellmethode in der Quellklasse in eine Methode abändern, die einen Aufruf an die neue Methode weiterleitet Kompilieren und testen Entscheiden ob die Quellmethode als Weiterleitungsmethode bleiben oder gelöscht werden soll Wenn die Quellmethode entfernt wird, alle Verweise auf sie mit Verweisen auf die neue Methode ersetzen Kompilieren und testen Advanced Software Engineering 58

59 Move Method Beispiel class Account double overdraftcharge() { if (type.ispremium()) { double result = 10; if (daysoverdrawn > 7) result += (daysoverdrawn 7) * 0,85; return result; else return daysoverdrawn * 1,75; double bankcharge() { double result = 4,5; if (daysoverdrawn > 0) result += overdraftcharge(); return result; private AccountType type; private int daysoverdrawn; Advanced Software Engineering 59

60 Move Method Beispiel class Account double bankcharge() { double result = 4,5; if (daysoverdrawn > 0) result += type.overdraftcharge(daysoverdrawn); return result; class AccountType double overdraftcharge(int daysoverdrawn) { if (ispremium()) { double result = 10; if (daysoverdrawn > 7) result += (daysoverdrawn 7) * 0,85; return result; else return daysoverdrawn * 1,75; Advanced Software Engineering 60

61 Push Down Method Verhalten einer Oberklasse ist nur für einige der Unterklassen relevant. Im Laufe der Zeit sind Unterklasse entstanden und ein Verhalten, dass einst in der Oberklasse definiert wurde ist nun nur noch in einigen Unterklasse relevant Mit dem Refactoring Extract Subclass wurde eine Unterklasse angelegt und einige Methoden gehören dorthin Advanced Software Engineering 61

62 Push Down Method Vorgehen Die Methode in allen Subklassen deklarieren und den Code hineinkopieren Methode aus Oberklasse löschen Kompilieren und testen Methode aus jeder Subklasse entfernen, die sie nicht benötigt Kompilieren und testen Advanced Software Engineering 62

63 Extract Interface Mehrere Klienten benutzen denselben Teil der Schnittstelle einer Klasse oder zwei Klassen haben einen Teil ihrer Schnittstellen gemeinsam. Zuständigkeiten von Klassen zerfallen oft in mehrere Bereiche. Oft ist es sinnvoll, diese einzelnen Bereiche als eigenständige Entitäten auszuzeichnen Programmieren gegen Interfaces besser als gegen Klassen, da so die Kopplung an änderbare Teile reduziert wird Interfaces erlauben eine schwache Mehrfachvererbung Advanced Software Engineering 63

64 Extract Interface Vorgehen Ein leeres Interface erstellen Alle gemeinsamen Operationen im neuen Interface deklarieren Alle relevanten Klassen als implementierende Klassen für das Interface deklarieren Typdeklarationen in den Klienten auf das neue Interface umstellen Advanced Software Engineering 64

65 Extract Interface Beispiel class Employee { public int getrate() { public boolean hasspecialskill() { double charge(employee emp, int days) { int base = emp.getrate() * days; if (emp.hasspecialskill()) return base * 1,05; else return base; Advanced Software Engineering 65

66 Extract Interface Beispiel interface Billable { public int getrate(); public boolean hasspecialskill(); class Employeee implements Billable { double charge(billable emp, int days) { int base = emp.getrate() * days; if (emp.hasspecialskill()) return base * 1,05; else return base; Advanced Software Engineering 66

67 Replace Magic Number with Symbolic Constant Im Code gibt es eine Zahlen-Literal mit einer spezifischen Bedeutung. Magic numbers machen jeden Code unverständlich und schlecht wartbar Änderungen an mehreren Orten erforderlich Advanced Software Engineering 67

68 Replace Magic Number with Symbolic Constant Vorgehen Eine Konstante deklarieren und auf den Wert der magic number setzen Alle Auftreten der magic number finden Prüfen, ob die Intention der magic number die Konstante ist. Wenn ja, ersetzen Kompilieren Wenn alle Auftreten der magic number ersetzt sind, kompilieren und testen Advanced Software Engineering 68

69 Replace Magic Number with Symbolic Constant Beispiel double potentialenergy(double mass, double height) { return mass * 9,81 * height; double potentialenergy(double mass, double height) { return mass * GRAVITATIONAL_CONSTANT * height; static final double GRAVITATIONAL_CONSTANT = 9,81; Advanced Software Engineering 69

70 Weitere Refactorings Es gibt noch viele, viele mehr Advanced Software Engineering 70

71 Literaturtipps M. Fowler: Refactoring Improving the Design of Existing Code; Addison-Wesley; 1999 R.C. Martin: Clean Code Refactoring, Patterns, Testen und Techniken für sauberen Code; mitp Verlag; 2009 Refactoring Home Page: Refactoring auf Wikipedia: Advanced Software Engineering 71

Advanced Software Engineering WS0910 Kapitel3. Dr. Dominik Haneberg

Advanced Software Engineering WS0910 Kapitel3. Dr. Dominik Haneberg Advanced Software Engineering WS0910 Kapitel3 Dr. Dominik Haneberg REFACTORING 26.01.2010 Advanced Software Engineering 2 Inhalte dieses Kapitels Was ist Refactoring? Wozu und wann refactorn? Wie geht

Mehr

Refactoring. PG Reclipse Seminar: Refactoring Jan-Christopher Bals (1/30)

Refactoring. PG Reclipse Seminar: Refactoring Jan-Christopher Bals (1/30) Refactoring PG Reclipse Seminar: Refactoring Jan-Christopher Bals (1/30) Gliederung des Vortrags Definition Hintergrund und Motivation Refactoring am Beispiel Refactoring-Katalog Unterstützung durch Tools

Mehr

0/100. Refactoring. Andreas Zeller. Lehrstuhl Softwaretechnik Universität des Saarlandes, Saarbrücken

0/100. Refactoring. Andreas Zeller. Lehrstuhl Softwaretechnik Universität des Saarlandes, Saarbrücken 0/100 Refactoring Andreas Zeller Lehrstuhl Softwaretechnik Universität des Saarlandes, Saarbrücken Refactoring im Überblick 1/100 Refactoring (wörtl. Refaktorisieren ) bedeutet das Aufspalten von Software

Mehr

Klassen sollten nicht Wissen über die ganze Hierarchie, sondern nur über Nachbarklassen haben. Dies reduziert die Kopplung!

Klassen sollten nicht Wissen über die ganze Hierarchie, sondern nur über Nachbarklassen haben. Dies reduziert die Kopplung! Kapitel 11 Refactoring 11.1 Die Demeter-Regel (Lieberherr 89) Klassen sollten nicht Wissen über die ganze Hierarchie, sondern nur über Nachbarklassen haben. Dies reduziert die Kopplung! Demeter-Prinzip:

Mehr

Klassen sollten nicht Wissen über die ganze Hierarchie, sondern nur über Nachbarklassen haben. Dies reduziert die Kopplung!

Klassen sollten nicht Wissen über die ganze Hierarchie, sondern nur über Nachbarklassen haben. Dies reduziert die Kopplung! Kapitel 11 Refactoring 11.1 Die Demeter-Regel (Lieberherr 89) Klassen sollten nicht Wissen über die ganze Hierarchie, sondern nur über Nachbarklassen haben. Dies reduziert die Kopplung! Demeter-Prinzip:

Mehr

Modularisierung. Klausur. Evaluation. Andreas Zeller. Objektorientierung C++ Sonstiges 33% 33% 33%

Modularisierung. Klausur. Evaluation.  Andreas Zeller. Objektorientierung C++ Sonstiges 33% 33% 33% Modularisierung Andreas Zeller 1 Klausur Objektorientierung C++ Sonstiges 33% 33% 33% 2 Evaluation http://frweb.cs.uni-sb.de/03.studium/08.eva/ 3 Modularisierung Andreas Zeller 4 Modularisierung Änderungen

Mehr

86 Software Engineering, SoSe 07, WSI, D. Huson, (Original Author: A. Zeller), 2. Juli 2007

86 Software Engineering, SoSe 07, WSI, D. Huson, (Original Author: A. Zeller), 2. Juli 2007 86 Software Engineering, SoSe 07, WSI, D. Huson, (Original Author: A. Zeller), 2. Juli 2007 Hinweis Die Wahlen zum AStA, dem Senat sowie zu den Fakultätsräten der Universität Tübingen finden am Mittwoch,

Mehr

Kapitel 11 Kapitel 11 Refactoring

Kapitel 11 Kapitel 11 Refactoring Vorlesung Softwaretechnologie 2007/8 Dr. Günter Kniesel R O O T S Kapitel Kapitel Refactoring "Refactoring" Einstiegs-Beispiel Refactoring: Schritt für Schritt Beispiel: Extract Method Indikationen für

Mehr

Vorlesung Softwaretechnologie. Wintersemester este 2009 R O O T S. Refactoring. Stand:

Vorlesung Softwaretechnologie. Wintersemester este 2009 R O O T S. Refactoring. Stand: Vorlesung Softwaretechnologie Wintersemester este 2009 R O O T S Kapitel 0 Refactoring Stand: 28.02.2009 "Refactoring" Einstiegs-Beispiel Refactoring: Schritt für Schritt Beispiel: Extract Method Indikationen

Mehr

Vorlesung Softwaretechnologie. Wintersemester este 2008 R O O T S. Refactoring. Stand: (Selbsttestfolie eingefügt)

Vorlesung Softwaretechnologie. Wintersemester este 2008 R O O T S. Refactoring. Stand: (Selbsttestfolie eingefügt) Vorlesung Softwaretechnologie Wintersemester este 2008 R O O T S Kapitel 0 Refactoring Stand: 5.02.2009 (Selbsttestfolie eingefügt) "Refactoring" Einstiegs-Beispiel Refactoring: Schritt für Schritt Beispiel:

Mehr

Kapitel 11 Refactoring

Kapitel 11 Refactoring Vorlesung Softwaretechnologie Wintersemester 203/4 R O O T S Kapitel Refactoring Stand: 22..204 "Refactoring" Einstiegs-Beispiel Refactoring: Schritt für Schritt Beispiel: Extract Method Indikationen für

Mehr

Kapitel 10 Refactoring

Kapitel 10 Refactoring Vorlesung Softwaretechnologie Wintersemester 204/5 R O O T S Kapitel 0 Refactoring Stand: 30.0.205 Was ist überhaupt Refactoring? Refactoring (noun): a change made to the internal structure of software

Mehr

Kapitel 11 Refactoring

Kapitel 11 Refactoring Vorlesung Softwaretechnologie Wintersemester 20 R O O T S Kapitel Refactoring Stand: 25..202 "Refactoring" Einstiegs-Beispiel Refactoring: Schritt für Schritt Beispiel: Extract Method Indikationen für

Mehr

2 + 1, 50 pro Tag ab dem 3. Tag. 1, 50 plus 1, 50 pro Tag ab dem 4. Tag

2 + 1, 50 pro Tag ab dem 3. Tag. 1, 50 plus 1, 50 pro Tag ab dem 4. Tag Fallstudie: Videothek-Verwaltung Aufgabenstellung Abrechnung einer Videothek: 3 Arten von Videos Normalpreis Neuerscheinung Kindervideos 2 + 1, 50 pro Tag ab dem 3. Tag 3 pro Tag 1, 50 plus 1, 50 pro Tag

Mehr

Refactoring. Programmiermethodik. Eva Zangerle Universität Innsbruck

Refactoring. Programmiermethodik. Eva Zangerle Universität Innsbruck Refactoring Programmiermethodik Eva Zangerle Universität Innsbruck Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle Themen

Mehr

Refactoring. Dominique Steiner 1 und Monica De Donato 2. dedom1@bfh.ch

Refactoring. Dominique Steiner 1 und Monica De Donato 2. dedom1@bfh.ch Refactoring Dominique Steiner 1 und Monica De Donato 2 1 Berner Fachhochschule Technik und Informatik, 2502 Biel, CH, steid3@bfh.ch, 2 Berner Fachhochschule Technik und Informatik, 2502 Biel, CH, dedom1@bfh.ch

Mehr

Software-Refactoring. 29. Mai 2013

Software-Refactoring. 29. Mai 2013 Software-Refactoring 29. Mai 2013 Überblick Was ist Refactoring und wozu dient es? Welche Refactorings gibt es? Refactoring-Katalog: www.refactoring.com Wann, wo und wie führt man Refactorings durch? Wie

Mehr

Kapitel 3 Software Quality II

Kapitel 3 Software Quality II Kapitel 3 Software Quality II Software Architecture, Quality, and Testing FS 2016 Prof. Dr. Jana Koehler jana.koehler@hslu.ch Agenda Heute Was ist Refactoring? Problem des Designverfalls Wann wird Refactoring

Mehr

Vorlesung Software-Reengineering

Vorlesung Software-Reengineering Vorlesung Software-Reengineering Prof. Dr. Rainer Koschke Arbeitsgruppe Softwaretechnik Fachbereich Mathematik und Informatik Universität Bremen Wintersemester 2007/08 Überblick I 1 Refactoring Refactorings

Mehr

Vorlesung Software-Reengineering

Vorlesung Software-Reengineering Vorlesung Software-Reengineering Prof. Dr. Rainer Koschke 1 1 Arbeitsgruppe Softwaretechnik Fachbereich Mathematik und Informatik Universität Bremen Wintersemester 2005/06 Überblick I 1 Refactoring 1 Refactoring

Mehr

Software-Refactoring. 27. Mai 2015

Software-Refactoring. 27. Mai 2015 Software-Refactoring 27. Mai 2015 Überblick Was ist Refactoring und wozu dient es? Welche Refactorings gibt es? Refactoring-Katalog: www.refactoring.com Wann, wo und wie führt man Refactorings durch? Wie

Mehr

Refactoring Transformationen. Martin Freund Januar 2003 Seminar Refactoring in extreme Programming AG Kastens Universität Paderborn

Refactoring Transformationen. Martin Freund Januar 2003 Seminar Refactoring in extreme Programming AG Kastens Universität Paderborn Refactoring Transformationen Martin Freund bbl@upb.de Januar 2003 Seminar Refactoring in extreme Programming AG Kastens Universität Paderborn Gliederung 1. Transformationen-Übersicht 2. Beispiel: Methode

Mehr

Java Einführung Vererbung und Polymorphie. Kapitel 13

Java Einführung Vererbung und Polymorphie. Kapitel 13 Java Einführung Vererbung und Polymorphie Kapitel 13 Inhalt Klassifikation (UML) Implementierung von Vererbungshierarchien Überschreiben von Methoden Polymorphismus: Up-Casting und Dynamisches Binden Schlüsselwort

Mehr

Refactoring. Uschi Beck

Refactoring. Uschi Beck Refactoring Uschi Beck uschibeck@web.de Gliederung Was ist Refactoring Definition, Einordnung in das Seminar Motivation Testen Code-Smells Katalog von Refactorings Aufbau, Beispiele Design Patterns als

Mehr

Java Einführung Abstrakte Klassen und Interfaces

Java Einführung Abstrakte Klassen und Interfaces Java Einführung Abstrakte Klassen und Interfaces Interface Interface bieten in Java ist die Möglichkeit, einheitliche Schnittstelle für Klassen zu definieren, die später oder/und durch andere Programmierer

Mehr

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck Javadoc Programmiermethodik Eva Zangerle Universität Innsbruck Überblick Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle

Mehr

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung Javakurs FSS 2012 Lehrstuhl Stuckenschmidt Tag 3 - Objektorientierung Warum Objektorientierung Daten und Funktionen möglichst eng koppeln und nach außen kapseln Komplexität der Software besser modellieren

Mehr

Interface. So werden Interfaces gemacht

Interface. So werden Interfaces gemacht Design Ein Interface (=Schnittstelle / Definition) beschreibt, welche Funktionalität eine Implementation nach Aussen anzubieten hat. Die dahinter liegende Algorithmik wird aber der Implementation überlassen.

Mehr

Refactoring. Vortrag im Rahmen des Softwareprojekts: Übersetzerbau. Referenten: Vivienne Severa Alpin Mete Sahin Florian Mercks. Datum:

Refactoring. Vortrag im Rahmen des Softwareprojekts: Übersetzerbau. Referenten: Vivienne Severa Alpin Mete Sahin Florian Mercks. Datum: Refactoring Vortrag im Rahmen des Softwareprojekts: Übersetzerbau Referenten: Vivienne Severa Alpin Mete Sahin Florian Mercks Datum: 20.06.2013 Überblick Einführung Refactoring im Einsatz Werkzeugunterstützung

Mehr

12 Abstrakte Klassen, finale Klassen und Interfaces

12 Abstrakte Klassen, finale Klassen und Interfaces 12 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java Vorlesung vom 18.4.07, Grundlagen Übersicht 1 Kommentare 2 Bezeichner für Klassen, Methoden, Variablen 3 White Space Zeichen 4 Wortsymbole 5 Interpunktionszeichen 6 Operatoren 7 import Anweisungen 8 Form

Mehr

Info B VL 11: Innere Klassen/Collections

Info B VL 11: Innere Klassen/Collections Info B VL 11: Innere Klassen/Collections Objektorientiere Programmierung in Java 2003 Ute Schmid (Vorlesung) Elmar Ludwig (Übung) FB Mathematik/Informatik, Universität Osnabrück Info B VL 11: Innere Klassen/Collections

Mehr

1 Abstrakte Klassen, finale Klassen und Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces 1 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,

Mehr

Programmiermethodik 3. Klausur Lösung

Programmiermethodik 3. Klausur Lösung Programmiermethodik 3. Klausur Lösung 9. 1. 2014 Name Matrikelnummer Aufgabe mögliche Punkte erreichte Punkte 1 20 2 16 3 45 4 19 5 20 Gesamt 120 1 Seite 2 von 10 Aufgabe 1) Objekt-Orientierung und Vererbung

Mehr

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik Programmieren II Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz 9.6 KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft www.kit.edu Abstrakte Klassen: Motivation Prinzip der Vererbung: Aus

Mehr

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass: OOP (Java), 22. Aufzählungstypen 1/20 Objektorientierte Programmierung Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester

Mehr

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält, heißt ebenfalls abstrakt. Für eine abstrakte Klasse

Mehr

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen Auswertung von Ausdrücken Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält, heißt ebenfalls abstrakt.

Mehr

5. Tutorium zu Programmieren

5. Tutorium zu Programmieren 5. Tutorium zu Programmieren Dennis Ewert Gruppe 6 Universität Karlsruhe Institut für Programmstrukturen und Datenorganisation (IPD) Lehrstuhl Programmierparadigmen WS 2008/2009 c 2008 by IPD Snelting

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Tafelübung 03 Vererbung, Polymorphie, Sichtbarkeit, Interfaces Clemens Lang T2 11. Mai 2010 14:00 16:00, 00.152 Tafelübung zu AuD 1/26 Klassen und Objekte Klassen und Objekte

Mehr

Kapitel 5: Interfaces

Kapitel 5: Interfaces Liste P: Programmieren mit Java WS 2001/2002 Prof. Dr. V. Turau FH Wiesbaden Kapitel 5: Interfaces Folie 82 : Einleitung Betrachtet man die Programmierleistung für ein Produkt über einen längeren Zeitraum,

Mehr

Übersetzen des Quelltexts in ausführbaren Maschinen-Code Translation of source code into executable machine code

Übersetzen des Quelltexts in ausführbaren Maschinen-Code Translation of source code into executable machine code Informatik II D-BAUG Self-Assessment, 2. März 2017 Lösung Name, Vorname:............................................................. Legi-Nummer:.............................................................

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java Vorlesung 02: Methoden Prof. Dr. Peter Thiemann Albert-Ludwigs-Universität Freiburg, Germany SS 2017 Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 1 / 17 Inhalt Scanner

Mehr

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete 2 Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, und Pakete Martin Wirsing Ziele Den Begriff der einfachen und mehrfachen Vererbung verstehen Verstehen, wann Vererbung eingesetzt wird deklarationen

Mehr

Kapitel 7 Refactoring I

Kapitel 7 Refactoring I Kapitel 7 Refactoring I Software Engineering FS 2014 Prof. Dr. Jana Köhler jana.koehler@hslu.ch Was ist Refactoring? 2 Das Movie Beispiel 3 Metriken für Movie 4 Die statement() Methode der Customer Klasse

Mehr

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen Kapitel 9 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Attribute von Klassen, Methoden und Variablen Interfaces WS 07/08 1/ 18 2/ 18

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 35 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 35 1 Grundlagen 2 Verdeckte Variablen 3 Verdeckte Methoden 4 Konstruktoren

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1 Kapitel 13 Listen Listen 1 Ziele Implementierungen für Listen kennenlernen Einfach verkettete und doppelt verkettete Listen verstehen Listen-Implementierungen in der Java-Bibliothek kennenlernen Durch

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1 Kapitel 12 Listen Listen 1 Ziele Implementierungen für Listen kennenlernen Einfach verkettete und doppelt verkettete Listen verstehen Listen-Implementierungen in der Java-Bibliothek kennenlernen Durch

Mehr

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0 Objects First With Java A Practical Introduction Using BlueJ Mehr über Vererbung Exploring polymorphism 1.0 Zentrale Konzepte dieses Kapitels Methoden-Polymorphie statischer und dynamischer Typ Überschreiben

Mehr

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell Klassen - Technisch Eine Klasse ist eine Einheit mit einem Namen, die Daten und Funktionalität beinhaltet 12. Java Klassen Klassen, Typen, Objekte, Deklaration, Instanzierung, Konstruktoren, Kapselung,

Mehr

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik Programmieren II Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz 9.6 KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft www.kit.edu Abstrakte Klassen: Motivation Grundidee abstrakter Klassen:

Mehr

Seminar: CASE-Tools WS 06/ Refactoring. Thomas Löffler

Seminar: CASE-Tools WS 06/ Refactoring. Thomas Löffler Seminar: CASE-Tools WS 06/07 31.01.2007 Refactoring Thomas Löffler Überblick 1. Einführung: Refactoring Was ist das? Warum Refactoring? Ziele 2. Vorgehen Wo wird refactorisiert? Beispiele 3. Refactoringtools

Mehr

7.0 Arbeiten mit Objekten und Klassen

7.0 Arbeiten mit Objekten und Klassen 252-0027 Einführung in die Programmierung I 7.0 Arbeiten mit Objekten und Klassen Thomas R. Gross Department Informatik ETH Zürich Copyright (c) Pearson 2013. and Thomas Gross 2016 All rights reserved.

Mehr

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5. Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 23.5.07 G. Bohlender (IANM UNI Karlsruhe) Vererbung 23.5.07 1 / 22 Übersicht 1

Mehr

Softwaretechnik WS 16/17. Übungsblatt 01

Softwaretechnik WS 16/17. Übungsblatt 01 Softwaretechnik WS 16/17 Übungsblatt 01 Was ist eine Klasse? Definition der Object Management Group: A class describes a set of objects that share the same specifications of features, constraints, and

Mehr

Theorie zu Übung 8 Implementierung in Java

Theorie zu Übung 8 Implementierung in Java Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Theorie zu Übung 8 Implementierung in Java Klasse in Java Die Klasse wird durch das class-konzept

Mehr

Programmieren 2 Java Überblick

Programmieren 2 Java Überblick Programmieren 2 Java Überblick 1 Klassen und Objekte 2 Vererbung 4 Innere Klassen 5 Exceptions 6 Funktionsbibliothek 7 Datenstrukturen und Algorithmen 8 Ein-/Ausgabe 9 Graphische Benutzeroberflächen 10

Mehr

Refactoring I. Nach Martin Fowler - Refactoring

Refactoring I. Nach Martin Fowler - Refactoring Refactoring I Nach Martin Fowler - Refactoring Kapitel 6 : Methoden zusammenstellen Kapitel 9 : Bedingte Ausdrücke vereinfachen Kapitel 10: Methodenaufrufe vereinfachen - Mario Boley - Methoden zusammenstellen

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 13 Einstieg in die Informatik mit Java Schnittstellen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 13 1 Einführung 2 Definition einer Schnittstelle 3 Implementierung

Mehr

Java Tools JDK. IDEs. Downloads. Eclipse. IntelliJ. NetBeans. Java SE 8 Java SE 8 Documentation

Java Tools JDK. IDEs.  Downloads. Eclipse. IntelliJ. NetBeans. Java SE 8 Java SE 8 Documentation Java Tools JDK http://www.oracle.com/technetwork/java/javase/ Downloads IDEs Java SE 8 Java SE 8 Documentation Eclipse http://www.eclipse.org IntelliJ http://www.jetbrains.com/idea/ NetBeans https://netbeans.org/

Mehr

Vererbung, Polymorphie

Vererbung, Polymorphie Vererbung, Polymorphie Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 21.1.08 G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1 Kapitel 11 Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 2 Ziele Implementierungen für

Mehr

Jan Schumann, G+J Manuel Pichler, Trainer & Consultant - Qafoo. Statische Codeanalyse wirklich effektiv nutzen

Jan Schumann, G+J Manuel Pichler, Trainer & Consultant - Qafoo. Statische Codeanalyse wirklich effektiv nutzen Jan Schumann, G+J Manuel Pichler, Trainer & Consultant - Qafoo Statische Codeanalyse wirklich effektiv nutzen Über uns Jan Schumann Jahrgang 1976 System- / Softwarearchitekt Entwickler von: PHP_Depend,

Mehr

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe: Musterlösung Übung 7 Aufgabe 1 Sehen wir uns zu allererst das gegebene Forth Programm an: 0 3 new - list constant list1 list1 5 new - list constant list2 list1 6 new - list constant list3 list2 2 new -

Mehr

4. Kontrollstrukturen Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

4. Kontrollstrukturen Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt 4. Kontrollstrukturen Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt 1 Kontrollfragen Variablen und Datentypen Was ist eine Variable? Was

Mehr

Johannes Link. jl@johanneslink.net

Johannes Link. jl@johanneslink.net Johannes Link jl@johanneslink.net Bevor ich es vergesse... Dank an Malte Finsterwalder Dank an Jens Coldewey (coldewey.com) Ich suche einen studentischen Mitarbeiter Refactoring anhand von Beispielen Evolutionäres

Mehr

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure 7. Objektorientierte Softwareentwicklung/3 Informatik II für Verkehrsingenieure Überblick FOLGENDE BEGRIFFE/PRINZIPIEN SOLLTEN BEKANNT SEIN Objekte Klasse Attribute Fähigkeiten ZIEL DER HEUTIGEN LEHRVERANSTALTUNG

Mehr

Assoziation und Aggregation

Assoziation und Aggregation Assoziation und Aggregation Martin Wirsing in Zusammenarbeit mit Matthias Hölzl, Nora Koch 05/03 2 Ziele Verstehen der Begriffe Assoziation und Aggregation Implementierung von Assoziationen in Java schreiben

Mehr

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Grundzüge der Programmierung. Wiederverwendung VERERBUNG Grundzüge der Programmierung Wiederverwendung VERERBUNG Inhalt dieser Einheit Syntax: Vererbung in Java Superklassen - Subklassen Konstruktorenaufruf in Subklassen super, abstract und final 2 Code-Reuse

Mehr

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces Programmieren I Martin Schultheiß Hochschule Darmstadt Wintersemester 2010/2011 1 / 20 Polymorphie/Späte Bindung Abstrakte Klassen Interfaces 2 / 20 Definition: Polymorphie Der Begriff Polymorphie (manchmal

Mehr

Programmierung für Mathematik (HS13)

Programmierung für Mathematik (HS13) software evolution & architecture lab Programmierung für Mathematik (HS13) Übung 11 1 Aufgabe: Codeverständnis 1.1 Aufgabenstellung Notieren Sie, was der folgende Code ausgeben würde, wenn er so in einer

Mehr

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden. Grundwissen Informatik Objekt Attribut Methoden Als Objekte bezeichnet man alle Gegenstände, Dinge, Lebewesen, Begriffe oder Strukturen unserer Welt ( Autos, Räume, Bakterien, Lehrer, Schüler, Kunden,

Mehr

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. ) Technische Informatik für Ingenieure (TIfI) WS 2006/2007, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Rekursion Datenstrukturen Merge S ( split, s, merge ) Beispiel:

Mehr

Nachklausur Programmieren / Algorithmen und Datenstrukturen 1

Nachklausur Programmieren / Algorithmen und Datenstrukturen 1 Programmieren / Algorithmen und Datenstrukturen Autor: Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt Datum: 7. Oktober 200 Nachklausur Programmieren / Algorithmen und Datenstrukturen Spielregeln

Mehr

Informatik II. Giuseppe Accaputo, Felix Friedrich, Patrick Gruntz, Tobias Klenze, Max Rossmannek, David Sidler, Thilo Weghorn FS 2017

Informatik II. Giuseppe Accaputo, Felix Friedrich, Patrick Gruntz, Tobias Klenze, Max Rossmannek, David Sidler, Thilo Weghorn FS 2017 1 Informatik II Übung 6 Giuseppe Accaputo, Felix Friedrich, Patrick Gruntz, Tobias Klenze, Max Rossmannek, David Sidler, Thilo Weghorn FS 2017 Heutiges Programm 2 1 Klassen - Technisch 2 Prediscussion

Mehr

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D. TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D. Übung zur Vorlesung Einführung in die Informatik 2 für Ingenieure (MSE) Alexander van Renen (renen@in.tum.de)

Mehr

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Kapitel 1 Der vierte Tag 1.1 Vererbung Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Sprachen. Unter Vererbung versteht man die Möglichkeit, Eigenschaften vorhandener

Mehr

Programmieren I + II Regeln der Code-Formatierung

Programmieren I + II Regeln der Code-Formatierung Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme WS 2012/2013, SS 2013 Programmieren I + II Regeln der Code-Formatierung Die hier vorgestellten

Mehr

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 - ! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete II.4.2 Abstrakte Klassen und Interfaces - 1 - Ähnliche Programmteile public class Bruchelement { Bruch wert;

Mehr

Objektorientierung (OO)

Objektorientierung (OO) Objektorientierung (OO) Objekte haben Zustände (oder Eigenschaften, Attribute) und Verhalten Zustände: Objektvariablen (in Java auch fields) Verhalten (oder Aktionen): Methoden (methods, Funktionen) members

Mehr

Übung Informatik I - Programmierung - Blatt 8

Übung Informatik I - Programmierung - Blatt 8 RHEINISCH- WESTFÄLISCHE TECHNISCHE HOCHSCHULE AACHEN LEHR- UND FORSCHUNGSGEBIET INFORMATIK II RWTH Aachen D-52056 Aachen GERMANY http://programmierung.informatik.rwth-aachen.de LuFG Informatik II Prof.

Mehr

Kapitel Was ist ein Header? Was ist ein Body? Header: public Account(String newowner, int newpin)

Kapitel Was ist ein Header? Was ist ein Body? Header: public Account(String newowner, int newpin) Kapitel 2.6 1. Was ist ein Header? Was ist ein Body? Header: public Account(String newowner, int newpin) Body: Alles im Block darunter: [...] 2. Geben Sie die Methodensignaturen der TicketMachine (Code

Mehr

Algorithmen und Datenstrukturen Musterlösung 5

Algorithmen und Datenstrukturen Musterlösung 5 Algorithmen und Datenstrukturen Musterlösung 5 Martin Avanzini Thomas Bauereiß Herbert Jordan René Thiemann

Mehr

Programmieren in Java -Eingangstest-

Programmieren in Java -Eingangstest- Programmieren in Java -Eingangstest- Nummer: 1. Studiengang: Informatik B.Sc. Informatik M.Sc. ESE B.Sc. ESE M.Sc. Sonstiges: Fachsemester: Bitte Fragen, die Sie nicht beantworten können unbedingt mit

Mehr

Ersetzbarkeit und Verhalten

Ersetzbarkeit und Verhalten Ersetzbarkeit und Verhalten U ist Untertyp von T, wenn eine Instanz von U überall verwendbar ist, wo eine Instanz von T erwartet wird Struktur der Typen für Ersetzbarkeit nicht ausreichend Beispiel: void

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine

Mehr

Client-Server-Beziehungen

Client-Server-Beziehungen Client-Server-Beziehungen Server bietet Dienste an, Client nutzt Dienste Objekt ist gleichzeitig Client und Server Vertrag zwischen Client und Server: Client erfüllt Vorbedingungen eines Dienstes Server

Mehr

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich 252-0027 Einführung in die Programmierung I 2.0 Einfache Java Programme Thomas R. Gross Department Informatik ETH Zürich Uebersicht 2.0 Einfache Java Programme Struktur Namen Output 2 Graphische Darstellung

Mehr

Introduction to Python. Introduction. First Steps in Python. pseudo random numbers. May 2016

Introduction to Python. Introduction. First Steps in Python. pseudo random numbers. May 2016 to to May 2016 to What is Programming? All computers are stupid. All computers are deterministic. You have to tell the computer what to do. You can tell the computer in any (programming) language) you

Mehr

Java-Schulung Grundlagen

Java-Schulung Grundlagen Java-Schulung Grundlagen Java 2 Standard Edition JDK 5 / 6 31.05.2008 Marcel Wieczorek 1 Themenübersicht Basiswissen Objektorientierung Datentypen Fehlerbehandlung Sonstiges Einführung Klassen, Strings

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java Vorlesung 06: Das Visitor Pattern Prof. Dr. Peter Thiemann (vertreten durch Luminous Fennell) Albert-Ludwigs-Universität Freiburg, Germany SS 2015 Peter Thiemann (Univ. Freiburg)

Mehr

II.4.2 Abstrakte Klassen und Interfaces - 1 -

II.4.2 Abstrakte Klassen und Interfaces - 1 - 1. Unterklassen und Vererbung 2. Abstrakte Klassen und Interfaces 3. Modularität und Pakete 4. Ausnahmen (Exceptions) 5. Generische Datentypen 6. Collections II.4.2 Abstrakte Klassen und Interfaces - 1

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 10: Mehr zur Vererbung und abstrakte Klassen Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil: Mehr zur Vererbung Methoden vererben und überschreiben

Mehr

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen

Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen Th Letschert FH Gießen-Friedberg Th. Letschert OOP 2 Sichtbarkeitsbeziehungen und Geheimnisprinzip Sichtbarkeitsbeziehungen realisieren

Mehr

Ein Stern in dunkler Nacht Die schoensten Weihnachtsgeschichten. Click here if your download doesn"t start automatically

Ein Stern in dunkler Nacht Die schoensten Weihnachtsgeschichten. Click here if your download doesnt start automatically Ein Stern in dunkler Nacht Die schoensten Weihnachtsgeschichten Click here if your download doesn"t start automatically Ein Stern in dunkler Nacht Die schoensten Weihnachtsgeschichten Ein Stern in dunkler

Mehr

Harry gefangen in der Zeit Begleitmaterialien

Harry gefangen in der Zeit Begleitmaterialien Episode 011 Grammar 1. Plural forms of nouns Most nouns can be either singular or plural. The plural indicates that you're talking about several units of the same thing. Ist das Bett zu hart? Sind die

Mehr