f h

19
Fh Fachhochschule Flensburg Refactoring Überarbeiten von Programmcode Hans Werner Lang

Upload: haracha

Post on 15-Jan-2016

28 views

Category:

Documents


0 download

DESCRIPTION

F h. Fachhochschule Flensburg. Refactoring Überarbeiten von Programmcode Hans Werner Lang. Software ist Literatur. Software wird von Menschen geschrieben und von Menschen gelesen. Software. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: F h

Fh Fachhochschule Flensburg

RefactoringÜberarbeiten von Programmcode

Hans Werner Lang

Page 2: F h

Software ist Literatur

Für mich ist die Literatur eine Form der Freude. Wenn wir etwas mit Mühe lesen, so ist der Autor gescheitert.

Software

Software wird von Menschen geschrieben und von Menschen gelesen.

H. W. Lang (deutscher Informatiker)Jorge Luis Borges (argentinischer Schriftsteller, 1899-1986)

Page 3: F h

"Weniger Teile"Schild im Büro eines japanischen Unternehmensgründers, der in Deutschland studiert hatte

"Make it work first before you make it work fast."

"Essentially, three: Revise, revise, revise."C.A.R. Hoare auf die Frage, ob er Tipps habe, wie man einen guten wissenschaftlichen Artikel schreibt

Einfachheit

Rapid Prototyping

Refactoring

Prinzipien der Softwarekonstruktion

Page 4: F h

"Ich bin ein Berliner." (J.F. Kennedy)

"Wir sind Papst." (Bild-Zeitung)

"Ja, wir sind ein Paar." (Anne Will)

Einfachheit

Page 5: F h

Programme sollen sein ...

einfach

knapp

lesbar

elegant

schön

korrekt

Page 6: F h

Lesbarkeit von Programmen

Benennung von Klassen, Variablen, Funktionen

Formatierung (in Python kein Thema)

Kommentare

Page 7: F h

Benennung von Klassen, Variablen, Funktionen

Klassen: Position, Placement, Client

Variablen: i, p, pos, lastmove, startfields

Funktionen:

Rückgabetyp

boolean: isValid(), hasNext(), comesDigit()

void: findMove(), setPosition()

andere:evaluationOf(), bestMove(), getPosition()

Konstanten: G, MAX_SIZE, ALPHANUMERIC

Sprache: Englisch

Page 8: F h

Benennung von Variablen

Lokale Variablen, Parameter: kurzif array_to_be_sorted[currentIndex1-1]>array_to_be_sorted[currentIndex1]: temporaryValue=array_to_be_sorted[currentIndex1-1] array_to_be_sorted[currentIndex1-1]=array_to_be_sorted[currentIndex1] array_to_be_sorted[currentIndex1]=temporaryValue

Besser so:

if a[i-1]>a[i]: t=a[i-1] a[i-1]=a[i] a[i]=t

Globale Variablen, Objektvariablen: länger

lastmove, startfields usw.

Page 9: F h

Kommentare

# prueft, ob alle vorhandenen Nachbarfelder# von Position p frei sinddef hasOnlyFreeNeighbours(self, p):

self.hand.clear() # alle Steine entfernen

vor Funktionen:

hinter Anweisungen:

i=i+1 # i um 1 erhoehen

nicht:

Page 10: F h

EinfachheitSonderfälle vermeiden

Berechnung von n!

if (n==0 || n==1) f=1;else{ f=n; for (i=n-1; i>1; i=i-1)

f=f*i;}

Besser so:

f=1;for (i=1; i<=n; i=i+1) f=f*i;

Page 11: F h

EleganzQuicksort

void quicksort (int lo, int hi){ int i=lo, j=hi, x=a[(lo+hi)/2]; while (i<=j) { while (a[i]<x) i++; while (a[j]>x) j--; if (i<=j) exchange(i++, j--); } if (lo<j) quicksort(lo, j); if (i<hi) quicksort(i, hi);}

Page 12: F h
Page 13: F h

Refactoring code

Page 14: F h

double potentialEnergy(){ return mass*9.81*height;}

static final double G=9.81;

double potentialEnergy(){ return mass*G*height;}

Introduce symbolic constant

Page 15: F h

double amountReceived(Date start, Date end){ ...}

double amountDelivered(Date start, Date end){ ...}

class DateRange{ Date start, end;}

double amountReceived(DateRange range){ ...}double amountDelivered(DateRange range){ ...}

Introduce parameter object

Page 16: F h

class Complex{ public double re, im;

}

class Complex{ private double re, im;

public getRe() { return re; }

public getRe() { return re; }

}

Encapsulate field

Page 17: F h

void printOwing(){ printBanner();

// print details System.out.println("Name: "+name); System.out.println("Amount: "+amount);}

void printOwing(){ printBanner(); printDetails();}

void printDetails(){ System.out.println("Name: "+name); System.out.println("Amount: "+amount);}

Extract method

Page 18: F h

class Order{ double getPrice() { double baseprice, secondaryprice; // long computation of price .... }}

class Order{ double getPrice() { return new PriceCalculator.compute(); }}

class PriceCalculator{ private double baseprice, secondaryprice; public double compute() { // computation of price }}

Replace method with object

Page 19: F h

class Stack extends Vector{ public void push(Object element) { insertElement(element, 0); }}

class Stack{ private Vector v;

public void push(Object element) { v.insertElement(element, 0); }}

Replace inheritance with delegation