designpatterns in ruby
TRANSCRIPT
Design Patterns in Ruby
Sven Pfleiderer
HdM Stuttgart, Medieninformatik Bachelor
20. Mai 2009
1 Duck TypingProblemstellungBeispiel
2 Monkey PatchingProblemstellungBeispiele
3 Higher-order FunctionsWas sind Higher-order Functions?Beispiele
4 LizenzLizenz
1. Duck Typing Problemstellung
Duck Typing
Sven Pfleiderer Design Patterns 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
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
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
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
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
2. Monkey Patching Problemstellung
Monkey Patching
Sven Pfleiderer Design Patterns 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
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
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
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
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
3. Higher-order Functions Was sind Higher-order Functions?
Higher-order Functions
Sven Pfleiderer Design Patterns 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
3. Higher-order Functions Was sind Higher-order Functions?
Wie bitte?
Demo oder weitere Slides?
Sven Pfleiderer Design Patterns 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
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
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
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
4. Lizenz Lizenz
Lizenz: Creative Commons BY-SA 3.0
Sven Pfleiderer Design Patterns in Ruby