SlideShare ist ein Scribd-Unternehmen logo
1 von 110
Funktionaler programmieren ohne Exceptions
Railway Oriented Programming
Exceptions
sind schlimmer
als GOTOs.
JOELSPOLSKY
CEO Stack Exchange Network
Betsy Weber - Joel Spolsky - flickr.com/photos/betsyweber/8044869747
CC Attribution 2.0 Generic - creativecommons.org/licenses/by/2.0/
Quelle: https://www.joelonsoftware.com/2003/10/13/13/
knowyourmeme.com/photos/503645-they-still-do-not-realize
Tomwang112 - Copyright 2011 - www.istockphoto.com/fotos/113592506
Alexas_Fotos - CC0 Public Domain - pixabay.com/de/sprung-new-york-gefährlich-verrückt-2040426/
Die null-Referenz:
Mein
Milliarden-
Dollar-Fehler.
TONYHOARE
Informatik-Pionier
Rama - Sir Charles Antony Richard Hoare giving a talk at the EPFL on 20th of June 2011
commons.wikimedia.org/wiki/File:Sir_Tony_Hoare_IMG_5125.jpg - CC BY-SA 2.0 FR - creativecommons.org/licenses/by-sa/2.0/fr/
Quelle: https://www.infoq.com/presentations/
Null-References-The-Billion-Dollar-Mistake-Tony-Hoare
obpia30 - CC0 Public Domain - pixabay.com/de/katze-box-predator-650770/
obpia30 - CC0 Public Domain - pixabay.com/de/katze-box-predator-650770/
Railway Oriented Programming
quimono - CC0 Public Domain - pixabay.com/de/wasser-tröpfchen-tropfen-spritzen-1281247/
Katie Tegtmeyer - Crossed fingers I - flickr.com/photos/katietegtmeyer/124315323
CC Attribution 2.0 Generic - creativecommons.org/licenses/by/2.0/
Success Failure
Success Failure
onSuccess(fun) fun() -
Success Failure
onSuccess(fun)
onFailure(fun)
fun()
- fun()
-
Success Failure
onSuccess(fun)
onFailure(fun)
onBoth(fun)
fun()
-
fun()
fun()
-
fun()
eak_kkk - CC0 Public Domain - pixabay.com/de/wasserfall-wasser-spritzen-platsch-1049079/
Arcaion - CC0 Public Domain - pixabay.com/de/die-pille-kapsel-medizin-1772275/
onSuccess()
onSuccess()
onSuccess()
ensure()
ensure()
ensure()
true
ensure()
true
false
map()
map()
map()
map()
ok
map()
ok
Fehler
(alle)
(alle)
ensure(…)
Success Failure
map(…)
map(…)
Quelle: https://vimeo.com/113707214
Quelle: https://www.pluralsight.com/courses/csharp-applying-functional-principles
Quelle: https://github.com/StefanMacke/ao-railway
Quelle: https://heise.de/-3598438
pvdv63 - CC0 Public Domain - pixabay.com/de/notbremse-gefahr-zug-blockiert-1053741/
PublicDomainPictures - CC0 Public Domain - pixabay.com/de/domino-dominosteine-spiel-spielen-21176/
Thomas Backa - WTF mug - CC0 Public Domain - flickr.com/photos/backa/4180780815/
obpia30 - CC0 Public Domain - pixabay.com/de/katze-box-predator-650770/
Monaden
Monade
repräsentiert
verhindert/erleichtert
Optional
Wert vorhanden?
null-Checks
Optional
Wert vorhanden?
null-Checks
Stream
mehrere Werte
eigene Iteration
Optional
Wert vorhanden?
null-Checks
Stream
mehrere Werte
eigene Iteration
Promise
asynchrones Ergebnis
eigene Threads
Optional
Wert vorhanden?
null-Checks
Stream
mehrere Werte
eigene Iteration
Promise
asynchrones Ergebnis
eigene Threads
Result
Ergebnis einer Aktion
Exception Handling
1) Typkonstruktor
2) return() oder unit()
3) bind(), >>= oder flatMap()
1) Identität von rechts
m >>= return = m
2) Identität von links
return x >>= f = f x
3) Assoziativität
(m >>= f) >>= g = m >>= (x . f x >>= g)
Quelle: http://www.inf.fu-berlin.de/lehre/SS09/PI02/docs/monaden.pdf
thepoodleanddogblog.typepad.com/the_poodle_and_dog_blog/2010/10/this-is-what-.html
ROP in der Praxis
WikiImages - CC0 Public Domain - pixabay.com/de/lochkartenlocher-datenverarbeitung-62897/
Fazit
https://imgflip.com/i/1m1kp2
stefan.macke.it
anwendungsentwicklerpodcast.de
@StefanMacke
serom.de/feedback

Weitere ähnliche Inhalte

Empfohlen

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Empfohlen (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Railway Oriented Programming - Funktionaler programmieren ohne Exceptions

Hinweis der Redaktion

  1. Ich möchte heute über eine etwas andere Art der Fehlerbehandlung sprechen: Programmierung ohne Exceptions. Doch warum sollte man auf Exceptions verzichten?
  2. Der Gründer von StackOverflow hat schon 2003 diese Aussage in einem Blogartikel getätigt.
  3. Joel Spolsky nennt zwei Punkte, die Exceptions zu „GOTOs“ werden lassen.
  4. Der erste Kritikpunkt ist, dass Exceptions im Code nicht sichtbar sind. Man kann nicht erkennen, ob eine Methode eine Exception wirft oder nicht.
  5. Hier ist weder ersichtlich, welche Methode eine Exception werfen kann, noch wohin der Code im Fehlerfall springt.
  6. Wie gut, dass es in Java Checked Exceptions gibt, nicht wahr?
  7. In diesem klassischen Beispiel für eine Exception ist sofort ersichtlich, welche Methoden einen Fehler provozieren könnten. Allerdings ist nur durch Nachverfolgung der kompletten Aufrufhierarchie der Codepunkt zu finden, zu dem im Fehlerfall gesprungen wird.
  8. Und das ist Spolskys zweiter Kritikpunkt: Es gibt zu viele Ausstiegspunkte aus der Methode. Und da Exceptions den normalen Kontrollfluss unterbrechen, werden Daten ggfs. in einem ungültigen Zustand hinterlassen oder Pfade durch den Code genommen, die nicht vorhersehbar sind.
  9. Wenn z.B. in der Aufrufhierarchie irgendwo ein weiteres Exception-Handling eingebaut wird, landet der Sprung auf einmal an einer ganz anderen Stelle. Das ist für den Entwickler schwer nachzuvollziehen.
  10. Man könnte auch einfach ein GOTO nutzen und wüsste wenigstens verlässlich, wohin gesprungen wird.
  11. Ok, Exceptions sind doof. Aber was können wir nun dagegen tun?
  12. Ein ähnlich schwerwiegendes Problem ist das Konzept von „null“. Java 8 bietet schon eine Lösung für das null-Problem.
  13. So sähe „normaler“ Code aus, der null prüft.
  14. Moderner Code verwendet kein null, sondern kennzeichnet durch Optional<T> explizit, dass evtl. kein Wert vorhanden ist. Allerdings hat man durch den hier gezeigten Aufbau nichts gewonnen…
  15. ...daher sollte man Optional<T> gleich so verwenden, wie es gedacht ist.
  16. Doch wie übertragen wir diese Idee nun auf das Exception-Handling?
  17. Indem wir eine Datenstruktur einführen, die einen möglichen Fehlerzustand explizit macht: das Result-Objekt. Und wie wir damit arbeiten, zeige ich nun in diesem Vortrag.
  18. Dazu habe ich heute drei Bereiche mitgebracht, über die ich sprechen möchte.
  19. Das Titelthema: Railway Oriented Programming.
  20. Was das Ganze mit Monaden zu tun hat.
  21. Und zum Schluss noch ein Praxisbeispiel.
  22. 7:00 Beginnen wir mit einem Überblick über die Idee hinter dem Railway Oriented Programming.
  23. Die Idee basiert auf der Fehlerbehandlung in der funktionalen Programmierung.
  24. Dort verwendet man gerne „reine“ Funktionen, die keine Seiteneffekte auslösen, sondern ausschließlich auf den hineingegebenen Werten arbeiten und ein Ergebnis liefern.
  25. Diese Methode wäre so eine „reine“ Funktion.
  26. Aber sobald die Methode eine Exception erzeugt, ändert sich alles. Sie ist nun nicht mehr rein, sondern erzeugt ggfs. einen anderen Ausgang, als von außen sichtbar ist.
  27. Kurzum: Die Methode „lügt“! Man erkennt von außen nicht mehr, dass es neben dem normalen Ausgang auch einen Fehlerfall geben kann. Und dieser zweite Weg müsste auch anders behandelt werden als der normale, nämlich mit try/catch.
  28. Um dies zu verhindern, kann man den potentiell fehlerhaften Ausgang der Methode explizit machen, indem man anstatt eine Exception zu werfen…
  29. …ein Ergebnis liefert, dass diesen Zustand kapselt: ein „Result“.
  30. Das Result-Objekt kann nun nach seinem Zustand gefragt werden, sodass darauf im aufrufenden Code reagiert werden kann. Aber dadurch hätte man nichts gewonnen. Genau wie bei Optional.isPresent().
  31. Und hier kommt das Railway Oriented Programming ins Spiel. Eine Fluent-API ermöglicht die weitere Programmierung ohne zu wissen, ob das Result fehlerhaft ist oder nicht. Die durchzuführenden Aktionen werden einfach verkettet und das Result-Objekt übernimmt die Steuerung, welche von ihnen tatsächlich ausgeführt werden.
  32. Das Result-Objekt hat zwei interne Zustände (fehlerhaft und erfolgreich), die unterschiedlich auf empfangene Nachrichten reagieren.
  33. Die mit onSuccess() übergebene Funktion wird nur im Zustand Success ausgeführt.
  34. Analog verhält sich onFailure() im Zustand Failure.
  35. Manchmal muss man Operationen auch unabhängig vom Zustand ausführen. Dafür ist onBoth() gedacht.
  36. So einfach sieht das dann im Code des Result-Objekts aus.
  37. Das allein reicht aber nicht, um die Aufrufe schön lesbar verketten zu können. Es muss eine Fluent-API her.
  38. Damit wir die Methoden aneinanderhängen können, muss jeder Methodenaufruf ein Result-Objekt zurückgeben. Also ergänzen wir die void-Methoden um ein entsprechendes return.
  39. Dadurch können wir nun die Methodenaufrufe aneinanderreihen, aber haben auch noch einen weiteren Vorteil geschaffen. Wir müssen nicht mehr wissen, welchen Zustand das Result-Objekt hat. Es entscheidet selbst, ob Operationen ausgeführt werden sollen oder nicht. Also haben wir eine Kapselung des Fehlerzustands erreicht.
  40. 12:00 Die onSuccess-Methode übernimmt das „Auspacken“ des Werts im Result-Objekt…
  41. ….und reicht es an einen Konsumenten weiter.
  42. Danach gibt sie das aktuelle – erfolgreiche – Result-Objekt zurück an den Aufrufer.
  43. Eine weitere hilfreiche Methode ist ensure(). -Methode prüft, ob der enthaltene Wert eine bestimmte Anforderung erfüllt, und gibt das Ergebnis zurück.
  44. Sie prüft, ob der enthaltene Wert eine bestimmte Anforderung erfüllt…
  45. …und gibt im Erfolgsfall das aktuelle Result-Objekt zurück…
  46. …bzw. andernfalls ein leeres fehlerhaftes Result.
  47. Und als letztes Beispiel wendet die map()-Methode...
  48. …die übergebene Funktion auf den Wert an…
  49. …die ihn ggfs. in einen anderen Typen umwandelt…
  50. …und verpackt das Resultat in ein neues Result-Objekt…
  51. …bzw. ein leeres fehlerhaftes Ergebnis.
  52. Wichtig ist noch, dass alle gezeigten Methoden gar nichts machen…
  53. wenn bereits ein fehlerhaftes Result-Objekt vorliegt.
  54. Die Methoden können nun wie in diesem Beispiel verkettet werden.
  55. Sobald eine der Methoden auf einen Fehler stößt, wird der Zustand des Results entsprechend verändert und kann von nun an nicht mehr verlassen werden. Und da dieser Ablauf so aussieht wie zwei parallel verlaufende Bahnschienen, hat der „Erfinder“ das Vorgehen Railway Oriented Programming genannt.
  56. Die Idee von ROP stammt von Scott Wlaschin, der die Website fsharpforfunandprofit.com betreibt.
  57. Aber so richtig darauf aufmerksam geworden bin ich durch den Pluralsight-Kurs von Vladimir Khorikov, in dem er das Konzept auf C# überträgt. Ja, ich weiß: ich habe ein Sakrileg begangen und bei C# rumgeschaut. 
  58. Daran angelehnt habe ich mein eigenes Framework für ROP mit Java entwickelt, das ich bereits in „echten“ Projekten verwende.
  59. Und einen Artikel für Heise Online habe ich auch schon darüber geschrieben.
  60. Kommen wir nun zu einigen Vorteilen, die die Arbeit mit dem Result-Objekt im Vergleich zu Exceptions bietet.
  61. Altbekannter Code enthält oftmals einen Großteil an Exception Handling.
  62. Das macht ihn komplex und schwer zu verstehen.
  63. Die Verwendung der FluentAPI macht den Code kürzer und lesbarer und er enthält nun weniger rein technische Fehlerbehandlungsroutinen.
  64. Es werden keine teuren Exceptions, sondern potentiell leichtgewichtige Fehlerklassen verwendet, die auch einfach zu serialisieren sind. Dafür gibt es nachher noch ein Beispiel.
  65. Außerdem sind z.B. in Streams keine Methoden erlaubt, die Exceptions werfen.
  66. Dem kann man mit Result-Objekten gut begegnen.
  67. ROP hat allerdings – wie so ziemlich jede Idee in der Programmierung – auch ein paar Nachteile.
  68. Ein frühzeitiger Ausstieg aus der Aufrufkette ist nicht möglich und muss mit if/else geregelt werden.
  69. Die Verwendung des Results ist „ansteckend“. Genau wie Checked Exceptions, die sich von Methode zu Methode fortpflanzen.
  70. Der Verzicht auf Exceptions entspricht nicht dem üblichen Vorgehen zur Fehlerbehandlung, das die meisten Entwickler kennen.
  71. Aber dieses Umdenken hat an anderer Stelle schon stattgefunden bzw. nimmt rasant Fahrt auf. Viele Konzepte aus der funktionalen Programmierung verwenden Java-Entwickler seit Java 8 inzwischen täglich. Beispiele sind Optional und die allseits beliebten Streams.
  72. 19:00 Diese beiden Beispiele passen sehr gut zum Ansatz von ROP, da sie alle eins gemeinsam haben: es handelt sich um Monaden.
  73. Monaden kapseln ein abstraktes Konzept und erleichtern dem Entwickler den Umgang mit diesem.
  74. Optional: Repräsentiert das Nicht-/Vorhandensein eines Wertes und vermeidet ausufernde null-Checks.
  75. Stream: Repräsentiert potentiell mehrere Werte und vermeidet Iterationen.
  76. Promise: Repräsentiert das Ergebnis einer asynchronen Operation und vermeidet Thread-Programmierung.
  77. Result: Repräsentiert das potentiell fehlerhafte Ergebnis einer Operation und vermeidet Exception-Handling.
  78. Monaden sind abstrakte Datenstrukturen, die 3 grundlegende Funktionen anbieten müssen.
  79. 1) Ein Typkonstruktor, der die Monade mit einem Datentypen parametrisiert.
  80. Beispiele sind Optional<T> bzw. Result<TSuccess, TFailure>.
  81. 2) Eine Funktion, die aus einem normalen Datentypen eine Monade dieses Datentyps macht, ihn also quasi in der Monade einpackt. Diese Funktion heißt in funktionalen Programmiersprachen z.B. „return“ oder „unit“.
  82. Beispiele: Optional.of(5) macht aus dem Integer 5 ein Optional<Integer> Result.success(„Wert“) macht aus dem String „Wert“ ein Result<String>
  83. Optional.of() „verpackt“ den Basisdatentypen also in der Monade.
  84. 3) Eine Funktion, die eine andere Funktion als Parameter bekommt, die aus dem inneren Datentyp der Monade eine neue Monade eines beliebigen Datentyps erzeugt, und diese neue Monade zurückgibt. Der in der ursprünglichen Monade enthaltene Datentyp wir ausgepackt, die übergebene Funktion wird auf seinen Wert angewendet und das Ergebnis dieser Operation - das wiederum eine Monade ist, aber ggfs. mit einem anderen Datentypen - wird zurückgegeben. In funktionalen Sprachen heißt diese Funktion z.B. „bind()“ oder „flatMap()“.
  85. 22:00 Schauen wir uns ein Beispiel für flatMap() auf Stream an.
  86. Die erste Methode der Kette erzeugt einen Stream…
  87. …der allerdings Arrays als Elemente enthält, also eigentlich nicht nur jeweils einen Wert, sondern gleich mehrere.
  88. Auf die Elemente dieses Streams wird nun Stream.of() angewendet…
  89. …eine Methode, die aus einer Liste von Werten einen Stream dieser Werte erzeugt.
  90. Somit werden die einzelnen Arrays jeweils in einen neuen Stream umgewandelt.
  91. Und als Ergebnis erhalten wir einen Stream<Stream<Integer>>. Aber eigentlich hätten wir gerne einen „flachen“ Stream<Integer>.
  92. Und das übernimmt nun flatMap(). Die Methode „extrahiert“ die Teilstreams und hängt sie zu einem langen Stream einzelner Werte hintereinander.
  93. Die drei Funktionen müssen noch drei Gesetze einhalten.
  94. Dies sind die drei Gesetze in Haskell-Schreibweise. Wir wollen sie an dieser Stelle aufgrund fehlender Zeit nicht vertiefen. Letztlich geht es darum, wie Monaden und ihre Funktionen miteinander verkettet werden können.
  95. Eigentlich zählt Optional in Java damit nicht zu den Monaden, da eines der Gesetze verletzt wird. Aber das ist für den Praxiseinsatz nicht allzu relevant. „Bereits linke Identität ist nicht gewährleistet, weil es kein "unit" wie für Maybe gibt, das einfach nur den Wert wrappt. Optional hat zwar Optional.of, aber das schmeißt eine Exception, wenn man "null" übergibt und scheidet somit aus. Dann gibt es noch Optional.ofNullable, aber wenn man das mit null füttert, so bekommt man kein Optional(null), sondern ein Optional.Empty. Man hat also keine Möglichkeit, jeden beliegen Wert zu wrappen, daraus folgt, dass Optional.of(A).flatMap(f) == f(A) nicht immer erfüllt ist.“ Quelle: https://www.heise.de/forum/heise-Developer/Kommentare/Railway-Oriented-Programming-in-Java/Re-Java-versagt-Optional-ist-keine-Monade/posting-29819640/show/
  96. 24:00 Schauen wir uns nun ein paar Beispiele für den Praxiseinsatz der Result-Monade an.
  97. ROP lässt sich gut mit den Konzepten von DDD verbinden.
  98. Factory-Methoden für Value Objects bieten sich z.B. für den Rückgabetyp Result an, da sie meistens eine Form der Validierung enthalten, die erwartungsgemäß auch fehlschlagen kann.
  99. Das Result-Objekt könnte als Ersatz für die (teuren) Exceptions eingeführt werden, wenn der Fehlerfall ganz „normal“ ist, wie z.B. bei Validierungen. Eine „echte“ Ausnahme (z.B. Speicher voll), kann (und sollte) weiterhin eine Exception sein, die das Programm beendet.
  100. Hier ist ein Beispiel einer Fehler-Klasse aus einem echten Projekt, die als TFailure genutzt wird. Sie ermöglicht z.B. eine einfache Übersetzung aller möglichen Fehler an einer zentralen Stelle.
  101. Außerdem ist sie auch einfach zu serialisieren und z.B. per REST zu übertragen.
  102. Das mag aussehen wie ein Rückschritt zu prozeduralem Code mit Return Codes, aber in der Praxis ist das Vorgehen sehr gut einsetzbar und hat mir viel Zeit gespart. Außerdem wollen wir ja funktional entwickeln und LISP stammt auch aus den 1950er Jahren ;-)
  103. Testen kann man gegen das Result-Objekt auch sehr schön. Mit ein paar eigenen Hamcrest-Matchern lesen sich die JUnit-Tests sehr schön.
  104. So sieht der Testcode aus, der gegen Result-Objekte läuft.
  105. Monaden sind nicht nur etwas für Theoretiker. Die gezeigten Beispiele demonstrieren die Nützlichkeit für die tägliche Arbeit in der Praxis.
  106. Auch wenn einige Monaden in Java ggfs. nicht 100% konform zu den Regeln sind, kann man sie in der Praxis gut einsetzen.
  107. Dann kannst auch du bald sagen…
  108. Danke für die Aufmerksamkeit!
  109. Hier noch einmal meine Kontaktdaten.