Software Engineering I (02161)
Week 7
- Assoc. Prof. Hubert Baumeister
Informatics and Mathematical Modelling Technical University of Denmark
Spring 2011
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 50 / 111
Software Engineering I (02161) Week 7 Assoc. Prof. Hubert - - PowerPoint PPT Presentation
Software Engineering I (02161) Week 7 Assoc. Prof. Hubert Baumeister Informatics and Mathematical Modelling Technical University of Denmark Spring 2011 2011 H. Baumeister (IMM) c Software Engineering I (02161) Spring 2011 50 / 111
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 50 / 111
Recap
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 52 / 111
Layered Architecture: Persistence Layer
Persistency Layer Presentation Layer Application Layer LibraryUI LibraryApp Medium User Book Cd PersistentObject PersistencyLayer
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 54 / 111
Layered Architecture: Persistence Layer
LibraryApp PersistencyLayer ... clearDatabase() createMedium(m:Medium) createUser(u:User) readMedium(sig:String):Medium readUser(cpr:String):User updateMedium(m:Medium) updateUser(m:User) deleteMedium(sig:String) deleteUser(cpr:String) getUsers(): List<User> getMedia(): List<Medium> ... 1 User ... ... getKey():String storeOn(out:PrintWriter) readFromReader(r:Buff.Read.
PersistentObject storeOn(out:PrintWriter) getKey():String key:String 0..1 cache_users key:String 0..1 cache_media Medium ... ... getKey():String storeOn(out:PrintWriter) readFromReader(r:Buff.Read.
{ return getSignature(); } { return getCprNumber(); } * borrowedMedia
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 55 / 111
Layered Architecture: Persistence Layer
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 56 / 111
Layered Architecture: Persistence Layer
User ... ... getKey():String storeOn(out:PrintWriter) readFromReader(r:Buff.Read.
readFrom(r:Buff.Read.
Medium ... ... getKey():String storeOn(out:PrintWriter) readFromReader(r:Buff.Read.
* borrowedMedia PersistentObject storeOn(out:PrintWriter) getKey():String Cd readFrom(r:Buff.Read., pl:PersistencyLayer):Cd Book readFrom(r:Buff.Read., pl:PersistencyLayer):Book
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 57 / 111
Layered Architecture: Persistence Layer
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 58 / 111
Layered Architecture: Persistence Layer
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 59 / 111
Layered Architecture: Persistence Layer
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 60 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 62 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 63 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 64 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 65 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 66 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 67 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 68 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 69 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 70 / 111
Architecture
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 71 / 111
Basic Principles of Good Design Duplication
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 73 / 111
Basic Principles of Good Design Duplication
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 75 / 111
Basic Principles of Good Design Duplication
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 76 / 111
Basic Principles of Good Design Simplicity
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 77 / 111
Project
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 79 / 111
Patterns (I) Introduction
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 81 / 111
Patterns (I) Introduction
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 82 / 111
Patterns (I) Introduction
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 83 / 111
Patterns (I) Template Method
ConcreteClass2 primitiveMethod1 primitiveMethod2 ... AbstractClass templateMethod primitiveMethod1 primitiveMethod2 ... ConcreteClass1 primitiveMethod1 primitiveMethod2 ... The template method defines its algortihm based on primitiveMethod1, ... PrimitiveMethod1, ... in AbstractClass are usually abstract, but they could also define some default behavior. c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 84 / 111
Patterns (I) Template Method
Cd .. .. getMaxDaysForLoan():int Medium .. .. getMaxDaysForLoan():int isOverdue():bool Book .. .. getMaxDaysForLoan():int if (!isBorrowed()) { return false; } Calendar date = libApp.getDate(); Calendar latestReturnDate = new GregorianCalendar(); latestReturnDate.setTime(borrowDate.getTime()); latestReturnDate.add(Calendar.DAY_OF_YEAR, getMaxDaysForLoan()); return latestReturnDate.before(date);
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 85 / 111
Patterns (I) Observer Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 86 / 111
Patterns (I) Observer Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 87 / 111
Patterns (I) Observer Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 88 / 111
Patterns (I) Observer Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 89 / 111
Patterns (I) Observer Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 90 / 111
Patterns (I) Observer Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 91 / 111
Patterns (I) Observer Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 92 / 111
Patterns (I) Observer Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 93 / 111
Patterns (I) Observer Pattern
sample
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 94 / 111
Patterns (I) State pattern
* State request1 request2 AClass request1 request2 ... changeState State1 request1 request2 State2 request1 request2
sd: StatePattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 95 / 111
Patterns (I) Composite Pattern
Component computeCost() {int costs = 0; foreach (Component c : components) { costs += c.computeCost(); } return costs; } * {return catalogueEntry.cost} Assembly computeCost() Part computeCost() CatalogueEntry cost computeCost() * c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 96 / 111
Patterns (I) Composite Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 97 / 111
Patterns (I) Visitor Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 98 / 111
Patterns (I) Visitor Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 99 / 111
Patterns (I) Visitor Pattern
Visitor visitPart(Component c) visitAssembly(Component c) Function visitPart visitAssembly ComputeCosts visitPart(Component c) visitAssembly(Component c) { int costs = 0; foreach (Component co : c.getComponents()) { costs += co.accept(this); } return costs; } {v.visitAssembly(this)} {return c.getCost()} {v.visitPart(this)} Component acceptVisitor(Visitor v) * Assembly acceptVisitor() Part cost acceptVisitor(Visitor v)
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 100 / 111
Patterns (I) Visitor Pattern
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 101 / 111
Patterns (I) Visitor Pattern
Double Dispatch Here it is known that a is an integer and thus needs to be converted to the more general type (i.e. float) Here we know that both arguments are floats and that we can use the addition on floats Here the method is based on the type of the receiver and the argument => "Dynamic binding" on both arguments => "double dispatch"
e.g. found in Smalltalk or Ruby where numbers are first class objects
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 102 / 111
Patterns (I) Summary
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 103 / 111
Recap
c 2011 H. Baumeister (IMM) Software Engineering I (02161) Spring 2011 105 / 111