Interfaces und Factories fürTestdriven Development             Notwendige        Perl6 Erweiterungen     für die Entwicklu...
Überblick Eine reale Fabrik Vom Code zum testbaren Code Erweiterungsvorschläge für Perl6             Interfaces und Factor...
Ein realeFabrik Gigaset in Bocholt              Interfaces und Factories für Testdriven DevelopmentRalf Peine             ...
Aufgabe   Verpackung für das neue Supertelefon SL910A            entwickeln und produzieren             Interfaces und Fac...
Paketinhalt             Interfaces und Factories für Testdriven DevelopmentRalf Peine            14. Deutscher Perlworksho...
Im Einsatz                  Software                                   ▼                         Paket             Interfa...
Herstellung               new Paket();                                      ▼              Paket herstellen             an...
Packen           zip(paket);               ▼    Paket falten und füllen       Paket auf Palette Palette in Container auf L...
Transport     upload_http(„www/paket.zip“);                  ▼      Container zu Hafen fahren          Container auf Schif...
Transport (2)      get_http(„www/paket.zip“);                  ▼           Schiff in Hafen         Container auf LKW      ...
auspacken          unzip(„paket.zip“);                  ▼        Palette aus Container  Einige Pakete aus Palette nehmen  ...
Software entwickeln                     ▼              Paket entwickeln               Interfaces und Factories für Testdri...
Paket-Entwicklung             Paketdesigner ruft bei                     Gigaset an:                 Interfaces und Factor...
Paket-Entwicklung  „Bitte einmal den kompletten   Inhalt des SL910-Pakets!“             Interfaces und Factories für Testd...
Paket-Entwicklung                        Gigaset:         „Den gibt es noch nicht!“              Interfaces und Factories ...
Paket-Entwicklung             „Wir entwickeln ja selbst                      noch!“                  Interfaces und Factor...
Paket-Entwicklung                    Designer:  „Wie soll ich dann das Paket          entwickeln?“             Interfaces ...
Paket-Entwicklung                       Gigaset:             „Wir haben eine              Beschreibung!“             Inter...
Paket-Entwicklung             „Ihrem Kollegen hat das                  ausgereicht!“                 Interfaces und Factor...
Beschreibung ?               Interfaces und Factories für Testdriven DevelopmentRalf Peine              14. Deutscher Perl...
Fabrik                                         Software      ▼                                               ▼ Beschreibun...
Definition SW-Schnittstelle                      (Interface)                            Wikipedia:         „Eine Schnittst...
Interfaces             Fabrik                                    Software             Handset                             ...
Interfaces (2)             Paket                                           IPaket Geometrie                       IGeometr...
Gigaset-Fabrik                                                                  !! Produziere Telefon SL910A (INation fuer...
Gigaset unterwegs VersendeTelefone(IHafen nachHafen)     {      IContainer containerMitTelefonen =           GigasetFactor...
Gigaset             Unit-Test             Interfaces und Factories für Testdriven DevelopmentRalf Peine            14. Deu...
Implementiert                 dieselbe                                                 Das Fixture baut               Schn...
Gigaset Unit-Test (2) TestFalten()   {      IPaket testObject = testFixture.CreatePaket();       IPaket gefaltetesPaket = ...
Gigaset Unit-Test (3)                                                     Weil Add nur das Interface TestAdd()     # Teil ...
Gigaset Unit-Test (4)                 Aber wie               schreibt man             testbaren Code?              Interfa...
Überleitung                  Das wird              im nächsten Teil             des Vortrags erklärt               Interfa...
2. Teil               Vom Code                  zum             testbaren Code             Interfaces und Factories für Te...
Vom Code zum testbaren Code                        Aufgabe Wörter aus einer Webseite zählen und  der Anzahl nach auflisten...
Vom Code zum testbaren Code (2) my $wordCounter = new WordCounter(); $wordCounter->         CountWordsOfWebFile           ...
Vom Code zum testbaren Code (3)             Denn dieses Codestück             wird überall verwendet.                  Int...
Vom Code zum testbaren Code (4)             !!! 27 000 mal !!             !!! Mindestens !!!              Interfaces und F...
Initiale Implementierung  Alles wurde in einer Sub realisiert.  Für ein schnelles Script ist das ok,  aber in einem großen...
Initiale Implementierung (2)                                                                      Das ist der             ...
Initiale Implementierung (3)Hier ist das Codestück.                                 Selbst aus dem Web lesen,Aber wo ist d...
2. Implementierung  Der WordCounter liest selbst aus dem Web  und analysiert in zweiter Methode             Interfaces und...
2. Implementierung (2)     Der kritische Code besteht           nur noch aus 3            Anweisungen       Analyse wurde ...
3. Implementierung  Der WordCounter liest selbst aus dem Web  mit einer dritten Methode  und analysiert in zweiter Methode...
3. Implementierung (2)                                                          Web-Datei lesen                           ...
3. Implementierung (3)                                  Web-Datei lesen                                                   ...
4. Implementierung  Der WordCounter lässt  einen WebReader aus dem Web lesen,  den er aber selbst mit new erzeugt.  Die An...
4. Implementierung (2)             Das „new“ verhindert                                                                   ...
5. Implementierung  Der WordCounter lässt  einen WebReader aus dem Web lesen,  den er von einer Factory erzeugen lässt.  D...
5. Implementierung                                               Die Factory muss         Das „new“ verhindert            ...
6. Implementierung  Der WordCounter lässt einen WebReader aus  dem Web lesen,  den er von einer Factory erzeugen lässt.  D...
6. Implementierung (3)    Code des   Testrahmens     (außen)                                                              ...
6. Implementierung (3)      Code der       Klasse       (innen)                                                           ...
7. Test-Implementierung  Es muss keine neue Reader-Klasse erstellt werden,  WordCounter ist testbar implementiert.  Im Tes...
7. Test-Implementierung (2)  Er verwendet die globale Factory, wie in der  vorherigen Implementierung.  Er erhält einen St...
7. Test-Implementierung (3)               Der Test ist jetzt             unabhängig vom Web,              und der Code ble...
7. Test-Implementierung (4)         Fertig sind der WebReader oder Test-Stub,                            Als Klassenvariab...
7. Test-Implementierung (5)             Aber jedesmal eine             neue Factory-Klasse                 zu schreiben,  ...
8. Implementierung             Einfacher geht es             mit DI-Containern              statt Factories.              ...
Dependency Injection                  Container                                Aha !      ?!? DI-Container ?!?        Etwa...
Ein DI-Container                                                              Fächer, in denen etwas Fach mit             ...
8. Implementierung (2)             Der WordCounter muss             für die Verwendung von                   DI-Containern...
8. Implementierung (3)                                              Den globalen DiContainer                              ...
8. Implementierung (4)Code der Klasse                 Fertig sind der (innen)          WebReader oder Test-Stub,          ...
9. Test-Implementierung  Und jetzt einfach über ein Closure etwas  anderes als einen WebReader  hinterlegen  durch  $DiCon...
9. Test-Implementierung (2)                    Für welche  Code des                                                       ...
9. Test-Implementierung (3)             Die Implementierung              bleibt unverändert                               ...
Ziel erreicht!               Der Produktcode               kann unverändert               getestet werden.             Die...
Ziel erreicht (2)!       Es gibt zwei Lösungen:                                                                         Di...
Überleitung                Aber wann             soll man welche             Lösung wählen ?              Interfaces und F...
Überleitung             Damit befasst                sich der               letzte Teil             des Vortrags          ...
Ende Teil 2              Interfaces und Factories für Testdriven DevelopmentRalf Peine             14. Deutscher Perlworks...
3. Teil   Erweiterungs-    Vorschläge     für Perl6             Interfaces und Factories für Testdriven DevelopmentRalf Pe...
Interfaces              Ein Interface ist             eine abstrakte Role,      in der alle Methoden = undef              ...
Interfaces (2)             Mit einem Unterschied:               In der Role muss               man nachsehen,             ...
Interfaces (3)                Ein Interface             muss dagegen                          immer              implement...
Interfaces (4)                                            Dieser Teil wird mit                                            ...
Interfaces (5)      Neues                   Konvention:  Schlüsselwort:          Interfaces beginnen   „interface“        ...
Interfaces (6)            Schlüsselwort                                    Der Name des zu       „impl“ für „implements“, ...
Interfaces (7)         Das war schon alles!              Keine weiteren             Syntaxänderungen                notwen...
Factory oder DI-Container ?                      DI-Container                   verwendet man immer                     da...
Factory oder DI-Container ? (2)                       Eine        Factory                      verwendet man immer        ...
Factories für UI und GUI                                                                 Ein Interface interface IUiFactor...
Factories für UI und GUI (2)             Diese Variable sollte                    zum                                  Hie...
TextUiFactoryAutomaticTestUiFactory                                 IUiFactory      Ein Gui-Test-       Framework,        ...
Factories für UI und GUI (4)                   Damit das möglich ist,                    müssten alle diese Guis          ...
Factories für UI und GUI (5)                Vielleicht erleben                wir das ja noch...                  Interfac...
Testdriven Development                       Damit sind                   in der Perl Syntax                alle Vorausset...
Testdriven Development (2)              Der Code und der Test               können       können             gleichzeitig g...
Testdriven Development (3)    Zur Entwicklung großer Applikationen              fehlen aber noch           Unit-Test-Frame...
Zusammenfassung             Beispie                                                                Vertrag                ...
Abschluss  Gibt es denn überhaupt große Perl-Applikationen?             Interfaces und Factories für Testdriven Developmen...
Abschluss (2)             Ja, und sogar eine,             die hier jeder kennt!                Interfaces und Factories fü...
Abschluss (3)                    Eine,              die davon sehr             profitieren würde.               Interfaces...
CPAN!!             Interfaces und Factories für Testdriven DevelopmentRalf Peine            14. Deutscher Perlworkshop 2012
Nächste SlideShare
Wird geladen in …5
×

Perl6: Interfaces und Factories für Testdriven Development

412 Aufrufe

Veröffentlicht am

In Perl 6 fehlen bislang Interfaces, Factories und DI-Container (DI=Dependency Injection). Diese sind aber für Test-Driven Development unverzichtbar.

Mein Vortrag auf dem 14. Deutschen Perlworkshop bietet einerseits Motivation für und eine Einführung in Testdriven Development und zeigt zudem Realisierungsmöglichkeiten für die fehlenden Spracheelemente / globalen Variablen/Subs auf.

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
412
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
2
Aktionen
Geteilt
0
Downloads
2
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie
  • Bevor ich Factories in der SW-Entwicklung vorstelle, möchte ich zunächst in eine reale Fabrik schauen. Denn hier sind die für die SW neuen Komponenten schon länger im Einsatz.
  • Hier werden Telefone entwickelt, gefertigt und verpackt.
  • Jetzt drehen wir das Ganze mal um Und Lernen von der Paketentwicklung für die SW-Entwicklung.
  • Hier noch im SourceCode-Beispiel WordReader durch WordCounter ersetzen.
  • Perl6: Interfaces und Factories für Testdriven Development

    1. 1. Interfaces und Factories fürTestdriven Development Notwendige Perl6 Erweiterungen für die Entwicklung großer Applikationen. 14. Deutscher Perlworkshop Ralf Peine Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    2. 2. Überblick Eine reale Fabrik Vom Code zum testbaren Code Erweiterungsvorschläge für Perl6 Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    3. 3. Ein realeFabrik Gigaset in Bocholt Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    4. 4. Aufgabe Verpackung für das neue Supertelefon SL910A entwickeln und produzieren Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    5. 5. Paketinhalt Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    6. 6. Im Einsatz Software ▼ Paket Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    7. 7. Herstellung new Paket(); ▼ Paket herstellen an Gigaset liefern Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    8. 8. Packen zip(paket); ▼ Paket falten und füllen Paket auf Palette Palette in Container auf LKW Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    9. 9. Transport upload_http(„www/paket.zip“); ▼ Container zu Hafen fahren Container auf Schiff Schiff nach Singapur Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    10. 10. Transport (2) get_http(„www/paket.zip“); ▼ Schiff in Hafen Container auf LKW LKW zu Großhändler Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    11. 11. auspacken unzip(„paket.zip“); ▼ Palette aus Container Einige Pakete aus Palette nehmen Pakete an Einzelhändler senden Pakete in Regal stellen Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    12. 12. Software entwickeln ▼ Paket entwickeln Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    13. 13. Paket-Entwicklung Paketdesigner ruft bei Gigaset an: Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    14. 14. Paket-Entwicklung „Bitte einmal den kompletten Inhalt des SL910-Pakets!“ Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    15. 15. Paket-Entwicklung Gigaset: „Den gibt es noch nicht!“ Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    16. 16. Paket-Entwicklung „Wir entwickeln ja selbst noch!“ Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    17. 17. Paket-Entwicklung Designer: „Wie soll ich dann das Paket entwickeln?“ Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    18. 18. Paket-Entwicklung Gigaset: „Wir haben eine Beschreibung!“ Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    19. 19. Paket-Entwicklung „Ihrem Kollegen hat das ausgereicht!“ Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    20. 20. Beschreibung ? Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    21. 21. Fabrik Software ▼ ▼ Beschreibung Interface Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    22. 22. Definition SW-Schnittstelle (Interface) Wikipedia: „Eine Schnittstelle gibt an, welche Methoden vorhanden sind oder vorhanden sein müssen ...“ Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    23. 23. Interfaces Fabrik Software Handset IHandset: { IGeometrie; IGewicht } Basis IBasis Ladeschale ILadeschale Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    24. 24. Interfaces (2) Paket IPaket Geometrie IGeometrie Außenmaße; Gewicht IGewicht Gewicht; Barcode IBarcode Barcode; falten IPaket Falten(); öffnen IPaket Oeffnen(); Basis einlegen Bool Add(IBasis basis); schließen IPaket Schliessen(); versiegeln IPaket Versiegeln(); auspacken Object[] objs Auspacken(); Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    25. 25. Gigaset-Fabrik !! Produziere Telefon SL910A (INation fuerLand) () w { IPaket paket = lager.HolePaket(fuerLand).Falten(); ne bool ok = true; ok &&= paket.Add(Lager.HoleBasis(fuerLand)); n ok &&= paket.Add(Lager.HoleHandset(fuerLand)); vo ok &&= paket.Add(Lager.HoleLadeschale(fuerLand)); ok &&= paket.Add(Lager.HoleNetzteilBasis(fuerLand)); f ok &&= paket.Add(Lager.HoleNetzteilHS(fuerLand)); # … ru uf if (ok) { A IGewicht gewicht = paket.Schließen().Versiegeln().Gewicht; n paket = pruefer.Check(paket) if ! ei IsKorrekt(gewicht); palette.Add(paket) if paket != null; K } } Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    26. 26. Gigaset unterwegs VersendeTelefone(IHafen nachHafen) { IContainer containerMitTelefonen = GigasetFactory .GetContainer(nachHafen); # Nicht etwa new() ILkw lkw = Spedition.LkwAnfordern(); # Nicht new() lkw.aufladen(containerMitTelefonen); lkw.fahrenZu(nachHafen); # … } # Was sich im Container befindet, # ist dem Fahrer egal, # aber nicht dem Empfänger! Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    27. 27. Gigaset Unit-Test Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    28. 28. Implementiert dieselbe Das Fixture baut Schnittstelle wie Unit-Test die Testumgebung auf und erzeugt das Original auch die Testdoubles. Die Objekte aus der Wird im System Umgebung des SUTFolgenden Under werden durchverwendet Test Testdoubles ersetzt Eine Einführung in testgetriebene Entwicklung liefert Martin Fowler: http://martinfowler.com/bliki/TestDrivenDevelopment.html http://www.martinfowler.com/bliki/TestDouble.html Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
    29. 29. Gigaset Unit-Test (2) TestFalten() { IPaket testObject = testFixture.CreatePaket(); IPaket gefaltetesPaket = testObject.Falten(); testFixture.Validate(gefaltetesPaket.Geometrie); } # fertig ist der Test! TestÖffnen() … TestSchließen() … TestVersiegeln() … Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    30. 30. Gigaset Unit-Test (3) Weil Add nur das Interface TestAdd() # Teil einlegen IBasis als Parameter { verlangt, kann hier ein TestDouble statt einer # Testvorbereitung Basis übergeben werden! IPaket testObject = testFixture.CreatePaket().Falten(); IBasis basisTestDouble = testFixture.CreateBasisTestDouble(); # Test testObject.Add(basisTestDouble); # Validierung testObject.Schließen(); # Geht zu !! # Keine Exceptions !! } # Fertig! Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    31. 31. Gigaset Unit-Test (4) Aber wie schreibt man testbaren Code? Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    32. 32. Überleitung Das wird im nächsten Teil des Vortrags erklärt Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    33. 33. 2. Teil Vom Code zum testbaren Code Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    34. 34. Vom Code zum testbaren Code Aufgabe Wörter aus einer Webseite zählen und der Anzahl nach auflisten. Dazu wird der folgende Code verwendet, der keinesfalls verändert werden darf: Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    35. 35. Vom Code zum testbaren Code (2) my $wordCounter = new WordCounter(); $wordCounter-> CountWordsOfWebFile ($remote_file, $minimalCount); Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    36. 36. Vom Code zum testbaren Code (3) Denn dieses Codestück wird überall verwendet. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    37. 37. Vom Code zum testbaren Code (4) !!! 27 000 mal !! !!! Mindestens !!! Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    38. 38. Initiale Implementierung Alles wurde in einer Sub realisiert. Für ein schnelles Script ist das ok, aber in einem großen System nicht testbar. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    39. 39. Initiale Implementierung (2) Das ist der kritische Teil Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    40. 40. Initiale Implementierung (3)Hier ist das Codestück. Selbst aus dem Web lesen,Aber wo ist das Problem ? das ist schwer zu testen Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    41. 41. 2. Implementierung Der WordCounter liest selbst aus dem Web und analysiert in zweiter Methode Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    42. 42. 2. Implementierung (2) Der kritische Code besteht nur noch aus 3 Anweisungen Analyse wurde in zweite Methode verschoben Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    43. 43. 3. Implementierung Der WordCounter liest selbst aus dem Web mit einer dritten Methode und analysiert in zweiter Methode Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    44. 44. 3. Implementierung (2) Web-Datei lesen wurde in eigene Methode verschoben Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    45. 45. 3. Implementierung (3) Web-Datei lesen wurde in eigene Methode verschoben Selbst aus dem Web lesen, das ist immer noch schwer zu testen Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    46. 46. 4. Implementierung Der WordCounter lässt einen WebReader aus dem Web lesen, den er aber selbst mit new erzeugt. Die Analyse führt er dann selbst in einer eigenen Methode durch. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    47. 47. 4. Implementierung (2) Das „new“ verhindert Jetzt liest automatisiertes Testen der WebReader ohne Web-Zugriff. den Inhalt der Webseite ein Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    48. 48. 5. Implementierung Der WordCounter lässt einen WebReader aus dem Web lesen, den er von einer Factory erzeugen lässt. Die Factory erzeugt er noch selbst. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    49. 49. 5. Implementierung Die Factory muss Das „new“ verhindert außerhalb automatisiertes Testen. erzeugt werden. Die Factory erstellt den WebReader Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    50. 50. 6. Implementierung Der WordCounter lässt einen WebReader aus dem Web lesen, den er von einer Factory erzeugen lässt. Die Factory erzeugt er nicht mehr selbst, er verwendet die globale Factory. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    51. 51. 6. Implementierung (3) Code des Testrahmens (außen) Factory erstellen und zuweisen NormalerProgrammablauf, kein Testcode! Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    52. 52. 6. Implementierung (3) Code der Klasse (innen) Kein Aufruf von „new()“ mehr notwendig! Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    53. 53. 7. Test-Implementierung Es muss keine neue Reader-Klasse erstellt werden, WordCounter ist testbar implementiert. Im Testrahmen muss nur die Factory angepasst werden. Der WordCounter lässt einen Web-Reader aus dem Web lesen (denkt er !), den er von einer Factory erzeugen lässt. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    54. 54. 7. Test-Implementierung (2) Er verwendet die globale Factory, wie in der vorherigen Implementierung. Er erhält einen Stub statt der Original-Klasse. Der Stub liefert nämlich einfach einen Das ist festen Text, ohne aus dem Web zu lesen! der Trick! Die Analyse führt er dann wie immer selbst in einer eigenen Methode durch. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    55. 55. 7. Test-Implementierung (3) Der Test ist jetzt unabhängig vom Web, und der Code bleibt unverändert! Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    56. 56. 7. Test-Implementierung (4) Fertig sind der WebReader oder Test-Stub, Als Klassenvariable welcher es gerade ist, kann man nie wissen! Die Factory erzeugt den WebReader Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    57. 57. 7. Test-Implementierung (5) Aber jedesmal eine neue Factory-Klasse zu schreiben, ist zu aufwendig... Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    58. 58. 8. Implementierung Einfacher geht es mit DI-Containern statt Factories. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    59. 59. Dependency Injection Container Aha ! ?!? DI-Container ?!? Etwas ähnliches wie ein Postfach/ Schlüsselboard an der Hotelrezeption Man fragt einfach nach, ob etwas für die Instanz/die Klasse hinterlegt wurde. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    60. 60. Ein DI-Container Fächer, in denen etwas Fach mit abgelegt werden kann WebReaderStub Fach mit WebReader Leeres Fach Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    61. 61. 8. Implementierung (2) Der WordCounter muss für die Verwendung von DI-Containern ein letztes Mal angepasst werden. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    62. 62. 8. Implementierung (3) Den globalen DiContainer in Klassenvariablen speichern Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    63. 63. 8. Implementierung (4)Code der Klasse Fertig sind der (innen) WebReader oder Test-Stub, welcher genau, kann man nie wissen! Statt „new ()“ Schnittstelle des gesuchten Objekts Für wen Falls hinterlegt nichts hinterlegt wurde Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    64. 64. 9. Test-Implementierung Und jetzt einfach über ein Closure etwas anderes als einen WebReader hinterlegen durch $DiContainer->DepositForCreate(...). Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    65. 65. 9. Test-Implementierung (2) Für welche Code des Eine Closure Instanz /Testrahmens für die Erzeugung Klasse (außen) hinterlegen hinterlegt Schnittstelle des hinterlegten Objekts Für den Nachfrager Aber nur, falls der eine Instanz erzeugen WordCounter keinen WebReader verwenden soll. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    66. 66. 9. Test-Implementierung (3) Die Implementierung bleibt unverändert Diesmal ist es ein Stub, der einen festen Text liefert und nicht aus dem Web liest. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    67. 67. Ziel erreicht! Der Produktcode kann unverändert getestet werden. Die Änderungen werden nur im Testrahmen vorgenommen. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    68. 68. Ziel erreicht (2)! Es gibt zwei Lösungen: Diese 2 Beide Lösungen Lösungen decken alle 6. + 7. mit Factories Haben ihre Einsatzgebiete Einsatzgebiete ab. 8. + 9. mit DIContainern Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    69. 69. Überleitung Aber wann soll man welche Lösung wählen ? Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    70. 70. Überleitung Damit befasst sich der letzte Teil des Vortrags Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    71. 71. Ende Teil 2 Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    72. 72. 3. Teil Erweiterungs- Vorschläge für Perl6 Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    73. 73. Interfaces Ein Interface ist eine abstrakte Role, in der alle Methoden = undef gesetzt sind. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    74. 74. Interfaces (2) Mit einem Unterschied: In der Role muss man nachsehen, ob noch etwas implementiert werden muss. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    75. 75. Interfaces (3) Ein Interface muss dagegen immer implementiert werden Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    76. 76. Interfaces (4) Dieser Teil wird mit Interfaces überflüssig role WebReaderRole { method ReadWebFile = { … }; } Huch! Versehentlich leer definiert! Damit muss die Methode in der Ableitung nicht mehr definiert werden... role WebReaderRole { method ReadWebFile { }; } Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    77. 77. Interfaces (5) Neues Konvention: Schlüsselwort: Interfaces beginnen „interface“ mit „I“ interface IWebReader { method ReadWebFile; } Keine ungewollte, leere Implementierung mehr möglich Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    78. 78. Interfaces (6) Schlüsselwort Der Name des zu „impl“ für „implements“, implementierenden danach folgt ein Interface Interfaces class WebReader impl IWebReader { method ReadWebFile { Andere Vorschläge für das neue KeyWord ? # … … … } } Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    79. 79. Interfaces (7) Das war schon alles! Keine weiteren Syntaxänderungen notwendig! Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    80. 80. Factory oder DI-Container ? DI-Container verwendet man immer dann, wenn man nur Testdoubles zum Testen erzeugen muss. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    81. 81. Factory oder DI-Container ? (2) Eine Factory verwendet man immer dann, wenn man aus mehreren Implementierungs- Varianten einer Klasse (zur Laufzeit) eine für den Produktivcode auswählen möchte. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    82. 82. Factories für UI und GUI Ein Interface interface IUiFactory { für eine Factory ! method CreateForm; method CreateCloseButton; } interface IForm impl IWidget { method Add (IWidget widget); method Run; } interface IButton impl IWidget { method Push; } Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    83. 83. Factories für UI und GUI (2) Diese Variable sollte zum Hier wird die UiFactory Standard werden. für alle zentral eingestellt Sub HelloWorld { my $uiFactory = $FactoryService.UiFactory; my $form = $uiFactory.CreateForm(); my $button = $uiFactory.CreateCloseButton(); $form.Add($button); Irgendeine UI-Factory aus der reichhaltigen $form.Run(); Auswahl } Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    84. 84. TextUiFactoryAutomaticTestUiFactory IUiFactory Ein Gui-Test- Framework, ?!? mit dem man Eingaben und Ausgaben aus Dateien lesen IGuiFactory und schreiben kann.TkGuiFactory WinForms- GtkGuiFactory Factory WxGuiFactory Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    85. 85. Factories für UI und GUI (4) Damit das möglich ist, müssten alle diese Guis dieselben Schnittstellen für IButton IForm ... unterstützen. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    86. 86. Factories für UI und GUI (5) Vielleicht erleben wir das ja noch... Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    87. 87. Testdriven Development Damit sind in der Perl Syntax alle Voraussetzungen für Testdriven-Development erfüllt. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    88. 88. Testdriven Development (2) Der Code und der Test können können gleichzeitig gleichzeitig entwickelt entwickelt werden werden Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    89. 89. Testdriven Development (3) Zur Entwicklung großer Applikationen fehlen aber noch Unit-Test-Frameworks P-Unit und (Perl-Unit-Tester) siehe N-Unit, J-Unit Mocking-Frameworks Leichte Erstellung von TestDoubles wie Stubs, Spys und ?!? Mocks, ohne eigene Klassen schreiben zu müssen Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    90. 90. Zusammenfassung Beispie Vertrag Vertrag l zwischen zwischen Code Vertrag Entwickler Entwickler und Nutzer und Nutzer Test-Lib Produkt-LibTest 2 Push- TestCode IPushButton ProductCode Button- Test- Double Optional ITest- TestFixture PushButton Nur Test- Implementierun PBImpl1 PB2 PB3 Diese Fixture gs- Klassen anweisung Sollten eines new() new() PB.new() anderen aufrufen Factory1 F2 F3 Tests IUIFactory DIContainer Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    91. 91. Abschluss Gibt es denn überhaupt große Perl-Applikationen? Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    92. 92. Abschluss (2) Ja, und sogar eine, die hier jeder kennt! Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    93. 93. Abschluss (3) Eine, die davon sehr profitieren würde. Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012
    94. 94. CPAN!! Interfaces und Factories für Testdriven DevelopmentRalf Peine 14. Deutscher Perlworkshop 2012

    ×