Оглавление
Stefan Lieser. Dojos für Entwickler 2
Einleitung
Aufgabe 1
MarkDown-Control selbst gebaut. Einfach, einfacher, MarkDown
Lösung 1
Ein UserControl für Markdown-Textauszeichnungen. Show up Mark down
Kleine Schritte
Listing 1. Grundlegende Datenstruktur
Listing 2. Erst mal testen: Fett-Formatierungen erkennen
Listing 3. Eine Klasse für den Schriftstil
Implementation
Listing 4. Fette Markierungen erkennen
Platine
Listing 5. Teile auf der Platine integrieren
UserControl
Listing 6. Textblöcke testen
Listing 7. Textblöcke erzeugen
Listing 8. Das fertige Steuerelement
Fazit
Aufgabe 2
Schlagworte für Digitalfotos. Ordnung im Fotokarton
Lösung 2. JPEG-Metadaten auslesen. Ausgezeichnete Fotos
Metadaten lesen
Listing 1. Metadaten ausgeben
Listing 2. Den Spike starten
Erstaunen und Ärger
Erste Iteration
Mal nicht Test-first
Listing 3. Dateinamen suchen
Listing 4. Test: Dateinamen
Der Spike zahlt sich aus
Listing 5. Stichwörter ermitteln
Listing 6. LINQ nutzen
Listing 7. Test: Stichwörter ermitteln
Listing 8. Doppelte Einträge herausfiltern
Listing 9. Test auf eindeutige Stichwörter
Listing 10. Den Flow zusammensetzen
Listing 11. Integrationstest
Eine App
Listing 12. Integration in eine Konsolenanwendung
Listing 13. Konsolenausgabe auslagern
Listing 14. Das Hauptprogramm
Fazit
Aufgabe 3. Bilddateien parallel verarbeiten. Alle anpacken!
Lösung 3. Parallelisierung im Flow-Design. Erst trennen, dann vereinen
Async/Sync
Listing 1. Den Datenfluss durchreichen
Listing 2. Den neuen Thread explizit starten
Asynchronen Code testen
Listing 3. Nicht optimal: Thread.Sleep
Listing 4. Besser : WaitHandle
ThreadPool
Und wieder synchron
Listing 5. InvokeRequired nutzen
Listing 6. Synchronizer für Windows Forms
Listing 7. Den Synchronizer testen
Trickreicher Test
Listing 8. Test für Windows Forms
Scatter/Gather
Listing 9. Stichwörter ermitteln, einfache Version
Listing 10. Stichwörter ermitteln, parallel
Realisierung
Listing 11. Der Scatter-Baustein
Listing 12. Scatter testen
Gather
Listing 13. Der Gather-Baustein
Der Haken an der Sache
Fazit
Aufgabe 4. Screen-Scraping für Webanwendungen. Wann kommt der Bus?
Lösung 4. Screen Scraping. Nach Daten angeln
Wie geht’s?
Listing 1. HTML-Code der Datenquelle
Listing 2. XPath-Ausdruck testen
Listing 3. Abfahrtzeiten auflisten
Listing 4. Abfahrtzeiten ermitteln
Testen
Lieber gleich asynchron
Listing 5. Einen Handler übergeben
Listing 6. Asynchroner Download
Listing 7. Den HTML-Code parsen
Listing 8. Rohdaten bereinigen
Verbindungen
Listing 9. Den Flow zusammensetzen
Fazit
Aufgabe 5. Mit kleinen Schritten zum Erfolg. Fette Fische fangen
1. Iteration
2. Iteration
3. Iteration
4. Iteration
Lösung 5. Iterativ und evolvierbar entwickeln. Aufbauen statt umbauen
Erst mal nur Konsole
Nachdenken hilft
Listing 1. Den Pfad ermitteln
Listing 2. Test: Pfad ermitteln
Listing 3. Dateien ermitteln
Listing 4. Test: Dateien ermitteln
Listing 5. Klasse für Dateiinformationen
Listing 6. Dateien herausfiltern
Listing 7. Den Filter testen
Listing 8. An der Konsole ausgeben
Jetzt alle zusammen
Listing 9. Elemente miteinander verdrahten
Listing 10. Das Hauptprogramm
Ist der Code evolvierbar?
Ein WPF-UI
Listing 11. Das GUI testen
Listing 12. Code-behind des Formulars
Listing 13. ViewModel
Listing 14. Daten aus dem Flow in das ViewModel mappen
Listing 15. Alle Bestandteile integrieren
Iteration drei
Listing 16. Einen separaten Thread verwenden
Listing 17. Das Abbrechen der Operation ermöglichen
Fazit
Aufgabe 6. Algorithmen und Datenstrukturen. Listig testen
Üben ..
... und reflektieren
Lösung 6. Algorithmen und Datenstrukturen. Fingerübung für den Kopf
Bevor es losging
Was zuerst?
Und welche Methode?
Listing 1. Die ersten Tests zu Add und Count
Listing 2. Add und Count implementieren
Welch ein Aufwand!
O-Notation
Der Haken an der Sache
Listing 3. Ein früher Test
Enumerator
Listing 4. Den Enumerator implementieren
Clear
Contains
Listing 5. Die Tests für die Contains-Methode
CopyTo
Remove
IndexOf
Insert
RemoveAt
Indexer
Listing 6. Der Indexer
Fazit
Aufgabe 7. Dateien verschlüsselt übertragen. Streng geheim
Schritt für Schritt ..
... zur Schlüsselgewalt
Lösung 7. Dojo: Dateien verschlüsselt übertragen. In geheimer Mission
Streams
Listing 1. Dateiverschlüsselung per CryptoStream
Streams und using
Gesalzenes Passwort
Dateien servieren
Verschlüsseln
Client
Listing 2. Implementierung der Datenflüsse des UI
Listing 3. DecryptionJob als Ergebnis von Passwort_ermitteln
Listing 4. Implementieren von Datei_laden
Integration
Listing 5. Implementieren der Platine. Ansicht_aktualisieren
Listing 6. Die Program_cs des Clients
Fazit
Aufgabe 8. Die App als Metronom. Nicht so schnell!
Lösung 8. dotnetpro.dojo: Entwicklung einer Metronom-App mit der Flow-Runtime. Immer schön im Takt!
Wo anfangen?
Start
Wie tickt es denn?
Erster Entwurf
Alles fließt
Nächste Aufgabe starten
Listing 1. Flow für „Nächste Aufgabe starten“
Implementation
Listing 2. Die Klasse Mapper
Listing 3. Operation aufgabe_anzeigen der Runtime bekannt machen
Feature vervollständigen
Listing 4. Der Klasse Metronom eine Instanz von Play übergeben
Listing 5. Timer implementieren
Listing 6. Sound abspielen
Listing 7. Die nächste Aufgabe und das nächste Metrum ermitteln
Pausieren
Gesamtübungsdauer
Listing 8. Die vollständige Konfiguration der Flow-Runtime
Listing 9. Die Klasse Pausenuhr
Und was ist mit Tests?
Fazit
Aufgabe 9. Eine Forms-over-Data-Anwendung entwickeln. Haben Sie noch CDs?
Lösung 9. MP3-Verwaltung mit Flow-Runtime implementieren. Im Fluss der Musik
Slice me nice?
Spike
Listing 1. Spike zum Auslesen der Tags
Endlich eine Scheibe schneiden
Listing 2. INotifyPropertyChanged implementieren (Ausschnitt)
Listing 3. Data Binding testen
Alles ist im Fluss
Arbeitsorganisation
Erste Überraschung
Operationen
Listing 4. Die Operation „Titel bilden“
Listing 5. Nachrichten auf das ViewModel abbilden
Integration
Listing 6. Definition des Flows
Listing 7. Program.cs
Wie geht’s weiter?
Der Umbau
Listing 8. Das Buildskript
Fazit
Aufgabe 10. Eine Chat-Anwendung für die Cloud. Plaudern in der Wolke
Üben!
Bedienung der Anwendung
Lösung 10. dojoLösung: Eine Chat-Anwendung für die Cloud. Alles auf Wolke
Unsicherheiten ausräumen
Wohin mit den Credentials?
Listing 1. Eingabe und Entnahme von Zeichenketten testen
Slice me nice
Interaktionen
Interaktionen und Features
Entwurf
Verfeinern
Listing 2. Flow-Definition
Klassen bilden
Listing 3. Die Klasse Chat
Infrastruktur
Listing 4. Die Klasse QueueFinder
Listing 5. Die Klasse Queue
Ich will was sehen!
Listing 6. Inputs und Outputs des GUI
Integration
Listing 7. Die Klasse AppChatten
Aspekte
Exceptions synchronisieren
Build
Fazit
Aufgabe 11. dojoAufgabe: Erinnerungen per Mail. Nichts mehr vergessen
Erinnerungsservice ..
... rund um die Uhr
Lösung 11. dotnetpro.dojo: Erinnerungen per Mail. Da war doch noch was?!
Erste Lösungsskizze
Grober Ablauf
Spike
Listing 1. Heraussuchen der Mails mit der Erinnerungsdienst-Adresse
Receiver.App
Listing 2. Das Gerüst der Anwendung
Der Parser
Listing 3. Coco/R-Grammatik des Parsers
Listing 4. Die Datenstruktur „Zeitpunkt“
Listing 5. Erstellen eines Erinnerungsauftrags aus einer Mail
E-Mail laden und verschieben
Listing 6. Testen der Operationen
Persistenz
Listing 7. Die Klasse MailStore
Listing 8. Ersetzen der leeren Lambda-Expressions
Fazit
Aufgabe 12. dojoAufgabe: Fotos verwalten. Bildergalerie – Marke Eigenbau
Übung macht den Meister
Vollbildansicht
Exif-Daten
Taggen
Lösung 12. dotnetpro.dojo: Fotos verwalten (Nicht) lost in Details
Schichten versus Aspekte
Theorie und Praxis
Am Anfang beginnen
Implementation
Listing 1. Das ViewModel
Alles im Fluss
Listing 2. Die Klasse Fotobrowser
Listing 3. Der Mapper
GUI
Listing 4. Das TreeView-Control
Listing 5. Testdaten anlegen
Listing 6. Verzeichnisbaum ermitteln
Fazit
Aufgabe 13. Laufwerke und Verzeichnisse anzeigen. Zeig mir den Baum
Events
Die Aufgabe
Schnittstelle
Aspekte und Entwürfe
Lösung 13. dotnetpro.dojo: Ein TreeView-Control entwerfen und implementieren. Baum der Erkenntnis
Entwerfen? Immer!
Anforderungen
Entwurf beginnt wo?
Endlich Code!
Listing 1. Die Klasse DirectoryTree ist für UI und Flow-Initialisierung zuständig
Listing 2. Die Klasse DirectoryTree_UI kümmert sich jetzt um das UI
Listing 3. Die Klasse DirectoryTree initialisiert nur noch den Flow
UIs testen
Listing 4. Der UI-Test
Listing 5. Definition des Typs Directory im ViewModel
Listing 6. Das ViewModel
Listing 7. Die Methode TreeView_SelectedItemChanged im XAML
Listing 8. Verzeichnisliste ins ViewModel übertragen
Listing 9. Die Operation Wurzelverzeichnisse_ermitteln
Listing 10. Testen der Operation Wurzelverzeichnisse_ermitteln
Listing 11. Die Operation Unterverzeichnisse_ermitteln
Listing 12. Ermittelte Unterverzeichnisse in den Baum einhängen
Listing 13. Testen der Operation Unterverzeichnisse_ermitteln
Fazit
Aufgabe 14. Markdown-Texte verarbeiten. Was ist drin?
Markdown
Lösung 14. dotnetpro.dojo: Markdown-Texte verarbeiten. Eins nach dem andern
Anforderungen
Entwurf
Pragmatismus
Implementation
Kommandozeile
Listing 1. Methode für Kommandozeilenzugriff austauschbar machen
Listing 2. Operationen für Kommandozeilenzugriff testen
Dateizugriff
Listing 3. Dateien lesen und schreiben
Nummerieren
Listing 4. Test zu Überschriften_nummerieren – Ebene 1
Listing 5. Implementation von Überschriften_nummerieren mit drei Ebenen
Integration
Listing 6. Ausgangsevent mit Eingangsmethode verbinden
Inhaltsverzeichnis
Filtern
Listing 7. Überschriftenzeilen herausfiltern
Listing 8. Die Operation Inhaltsverzeichnis_nummerieren
Listing 9. Die Operation Concat
Listing 10. Flow in der Klasse Mainboard anpassen
Überraschung zum Schluss
Listing 11. Implementation von Datei_lesen mit Mehrfachöffnung
Fazit
Aufgabe 15. Kommunikation mit Windows Services. Wie sag’ ich’s dem Service?
Lösung 15. Kommunikation mit Windows-Diensten. So klappt’s auch mit dem Service
Spike
Streams
Listing 1. Spike-Implementation der Serverseite
Listing 2. Spike-Implementation der Clientseite
Connected!
Listing 3. Zugriffsberechtigungen festlegen
Windows Service
Listing 4. Windows Service erstellen
Wie spät?
Listing 5. Logik des Service implementieren
Listing 6. Program.cs des Clients
Listing 7. Aktuelle Uhrzeit abfragen und ausgeben
Verteilt
Fazit
Impressum