designpatterns in ruby

22
Design Patterns in Ruby Sven Pfleiderer HdM Stuttgart, Medieninformatik Bachelor 20. Mai 2009

Upload: pfleidi

Post on 13-May-2015

833 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Designpatterns in Ruby

Design Patterns in Ruby

Sven Pfleiderer

HdM Stuttgart, Medieninformatik Bachelor

20. Mai 2009

Page 2: Designpatterns in Ruby

1 Duck TypingProblemstellungBeispiel

2 Monkey PatchingProblemstellungBeispiele

3 Higher-order FunctionsWas sind Higher-order Functions?Beispiele

4 LizenzLizenz

Page 3: Designpatterns in Ruby

1. Duck Typing Problemstellung

Duck Typing

Sven Pfleiderer Design Patterns in Ruby

Page 4: Designpatterns in Ruby

1. Duck Typing Problemstellung

Problemstellung

• Ruby ist eine dynamisch typisierte Programmiersprache• Referenzen können während Laufzeit unterschiedliche Objekttypenannehmen

• Ruby besitzt Mixins• Woran “weiss” eine Methode welche Objekte übergeben werdendürfen?

Sven Pfleiderer Design Patterns in Ruby

Page 5: Designpatterns in Ruby

1. Duck Typing Problemstellung

Lösung

• Vorhandene Eigenschaften und Methoden bestimmen Gültigkeit• “If it walks like a duck and quacks like a duck, I would call it a duck”• Es interessieren nur verwendete Methoden und Eigenschaften stattVererbungshierarchie

Sven Pfleiderer Design Patterns in Ruby

Page 6: Designpatterns in Ruby

1. Duck Typing Beispiel

Beispielklassen

1 c l a s s Duck2 def quack3 put s " I quack ! "4 end5 def walk6 put s " I waddle l i k e a duck ! "7 end8 end9 c l a s s Human

10 def quack11 put s " I can immitate a duck ! "12 end13 def walk14 put s " I walk l i k e a human ! "15 end16 end

Sven Pfleiderer Design Patterns in Ruby

Page 7: Designpatterns in Ruby

1. Duck Typing Beispiel

Verwendung der Objekte

1 def t e s t e r ( duck )2 duck . quack ( )3 duck . walk ( )4 end5

6 put s "−−−−−− Duck −−−−−−−"7 t e s t e r (Duck . new )8 put s "−−−−−− Human −−−−−−−"9 t e s t e r (Human . new )

Sven Pfleiderer Design Patterns in Ruby

Page 8: Designpatterns in Ruby

1. Duck Typing Beispiel

Ausführung

1 −−−−−− Duck −−−−−−−2 I quack !3 I waddle l i k e a duck !4

5 −−−−−− Human −−−−−−−6 I can immitate a duck !7 I walk l i k e a human !

Sven Pfleiderer Design Patterns in Ruby

Page 9: Designpatterns in Ruby

2. Monkey Patching Problemstellung

Monkey Patching

Sven Pfleiderer Design Patterns in Ruby

Page 10: Designpatterns in Ruby

2. Monkey Patching Problemstellung

Problemstellung

Man möchte• bestehende Klassen um Methoden erweitern• bestehende Methoden von Klassen verändern• bestimmte Objekte mit zusätzlichen Methoden ausstatten• Fehler in vorhandenen Bibliotheken reparieren ohne auf einenoffiziellen Fix warten zu müssen

Sven Pfleiderer Design Patterns in Ruby

Page 11: Designpatterns in Ruby

2. Monkey Patching Beispiele

Einfaches Beispiel

1 c l a s s S t r i n g2 def f oo3 put s s e l f + " sag t foo "4 end5 def bar6 put s s e l f + " sag t bar "7 end8 end

Sven Pfleiderer Design Patterns in Ruby

Page 12: Designpatterns in Ruby

2. Monkey Patching Beispiele

Angewandtes Beispiel

1 r e q u i r e ’ net / h t tp ’2 r e q u i r e ’ u r i ’3

4 c l a s s URI : :HTTP5

6 def s h o r t e n_u r l7 a p i_u r l = " ht tp : // b i t . l y / ap i "8 r e s = Net : :HTTP. post_form (9 URI . p a r s e ( a p i_u r l ) ,{ ’ u r l ’=> s e l f }

10 )11 return URI . p a r s e ( r e s . body )12 end13

14 end

Sven Pfleiderer Design Patterns in Ruby

Page 13: Designpatterns in Ruby

2. Monkey Patching Beispiele

Ausführung

1 # e r s t e s B e i s p i e l2 >> "Der Patchmonkey " . foo3 Der Patchmonkey sag t foo4

5 >> "Die Typente " . bar6 Die Typente s ag t bar7

8 # z w e i t e s B e i s p i e l9 >> u r i = URI . pa r s e (

10 " h t tp : // b log . r oo thausen . de "11 ) . s h o r t e n_u r l12

13 >> u r i . to_s14 => " ht tp : // b i t . l y /2BTVbK"

Sven Pfleiderer Design Patterns in Ruby

Page 14: Designpatterns in Ruby

2. Monkey Patching Beispiele

Patchen von erstellten Objeten

1 t x t = "Patchmonkey "2

3 def t x t . h e l l o4 put s s e l f + " sag t h a l l o "5 end6

7 >> tx t . h e l l o8 Patchmonkey sag t h a l l o

Sven Pfleiderer Design Patterns in Ruby

Page 15: Designpatterns in Ruby

3. Higher-order Functions Was sind Higher-order Functions?

Higher-order Functions

Sven Pfleiderer Design Patterns in Ruby

Page 16: Designpatterns in Ruby

3. Higher-order Functions Was sind Higher-order Functions?

Was sind Higher-order Functions eigentlich?

• Funktionen sind selbst Werte und werden als solche beandelt• Können anderen Funktionen übergeben werden• Können von anderen Funktionen zurück gegeben werden• Können Variablen zugewiesen werden

Sven Pfleiderer Design Patterns in Ruby

Page 17: Designpatterns in Ruby

3. Higher-order Functions Was sind Higher-order Functions?

Wie bitte?

Demo oder weitere Slides?

Sven Pfleiderer Design Patterns in Ruby

Page 18: Designpatterns in Ruby

3. Higher-order Functions Beispiele

Aufruf und Rückgabe

1 >> b lock = lambda { | v a r i a b l e |2 put s " H i e r r u f t jemand " + v a r i a b l e3 }4

5 => #<Proc : 0 xb7afd61c@ ( i r b ) :3>6

7 >> b lock . c a l l ( " h a l l o " )8

9 Hie r r u f t jemand h a l l o

Sven Pfleiderer Design Patterns in Ruby

Page 19: Designpatterns in Ruby

3. Higher-order Functions Beispiele

Methoden, die HO-Functions erwarten

1 >> 5 . t imes { | x |2 put s " Ha l l o Nr . " + x . to_s3 }4

5 Ha l l o Nr . 06 Ha l l o Nr . 17 Ha l l o Nr . 28 Ha l l o Nr . 39 Ha l l o Nr . 4

Sven Pfleiderer Design Patterns in Ruby

Page 20: Designpatterns in Ruby

3. Higher-order Functions Beispiele

Auflisten einer HashMap

1 >> hashmap = {"a " => 1 , "b" => 2 , " c " => 3}2

3 >> hashmap . each { | key , v a l u e |4 put s "#{key } e n t s p r i c h t #{va l u e }"5 }6

7 a e n t s p r i c h t 18 b e n t s p r i c h t 29 c e n t s p r i c h t 3

Sven Pfleiderer Design Patterns in Ruby

Page 21: Designpatterns in Ruby

3. Higher-order Functions Beispiele

Realworld Code: Rubinious

1 def t imes2 i = 03 whi le ( i < s e l f )4 y i e l d ( i )5 i += 16 end7 return s e l f8 end9 def upto ( v a l )

10 i = s e l f11 whi le ( i <= va l )12 y i e l d ( i )13 i += 114 end15 return s e l f16 end

Sven Pfleiderer Design Patterns in Ruby

Page 22: Designpatterns in Ruby

4. Lizenz Lizenz

Lizenz: Creative Commons BY-SA 3.0

Sven Pfleiderer Design Patterns in Ruby