We're sorry but this page doesn't work properly without JavaScript enabled. Please enable it to continue.
Feedback
00:00

Formal Metadata

Title
Warum Go?
Subtitle
Warum man Go als nächste Sprache nutzen sollte
Title of Series
Number of Parts
94
Author
License
CC Attribution 4.0 International:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal purpose as long as the work is attributed to the author in the manner specified by the author or licensor.
Identifiers
Publisher
Release Date
Language

Content Metadata

Subject Area
Genre
Abstract
Wir werden Go in verschiedensten Kategorien gegen andere Sprachen antreten lassen und anhand von messbaren Ergebnissen zeigen warum Go die nächste Sprache in deinem Projekt sein sollte. Wir werden Go in verschiedensten Kategorien gegen andere Sprachen antreten lassen und anhand von messbaren Ergebnissen zeigen warum Go die nächste Sprache in deinem Projekt sein sollte. Von Speicherverbrauch über Robustheit und Deployments bis hin zu Lernkurven werden wir Go mit anderen Sprachen vergleichen.
15
Thumbnail
1:16:56
20
Thumbnail
59:24
23
Thumbnail
10:02
48
Thumbnail
50:08
56
76
Thumbnail
12:05
SoftwareMORSE <Programm>XMLUMLLecture/ConferenceComputer animation
SoftwareMORSE <Programm>Computer animation
Programming languageGoogleComputer programmingCoroutineAlgorithmDataflowKommunikationC++Well-formed formulaLecture/ConferenceComputer animationXMLMeeting/Interview
GoogleComputer programmingCodeCompilerThread (computing)Block (periodic table)XMLComputer animation
Java Virtual MachineCompilerComputer programCodeOverhead (computing)Java native interfaceXMLSupremumCodeJava Virtual MachineError detection and correctionSpeciesParallel programming modelMathematicsFRAMEWORK <Programm>Run-time systemComputer animationMeeting/Interview
Web browserJavaScriptInterpreter (computing)Scripting languageServer (computing)BerechnungCompilerUiHIMPACT <Programmierumgebung>DatabaseError detection and correctionLaufzeitProduct (category theory)Set (mathematics)XMLComputer animationLecture/Conference
UDP <Protokoll>JavaScriptEncryptionParsingUniform resource locatorSet (mathematics)DatabaseJavaScriptEncryptionWEBServer (computing)XMLComputer animationLecture/Conference
HOLProduct (category theory)ImplementationSet (mathematics)Parameter (computer programming)Hand fanComputer animationSource code
CodeStack (abstract data type)CarriagewayC++SpeciesDatabaseLecture/ConferenceComputer animation
Remote procedure callUDP <Protokoll>DatabaseXMLHTMLEncryptionXMLCodeDatabaseComputer animationLecture/Conference
Apache MavenCodeSoftware developerStack (abstract data type)CarriagewayComputer animationDiagramProgram flowchart
JavaScriptComputer data loggingZugriffObject (grammar)Error messageSAP <Marke>CarriagewayPlane (geometry)Stack (abstract data type)Noten <Programm>Metra potential methodDiagramProgram flowchartXMLComputer animation
JavaScriptCodeSlide ruleGeometrischer KörperInformationIntegral elementLecture/ConferenceComputer animation
CodeDecision tree learningVariable (mathematics)CodeError detection and correctionError messageCompilerException handlingImplementationInterface (computing)Block (periodic table)Computer animationLecture/Conference
CodePlane (geometry)Negative numberCodeComputer animation
INGA <Programm>CodeTranslation (relic)Proxy serverProviderGoogleLecture/ConferenceComputer animationSource code
JUnitGroovy <Programmiersprache>Factory (trading post)Outline of industrial organizationCodeSoftware bugSource codeComputer animationLecture/Conference
JavaScriptCodeTypCodeJavaScriptLecture/ConferenceXML
JavaScriptMotherboardMAX <Programm>Lecture/Conference
Beta functionProxy serverCache (computing)Version <Informatik>UpdateCompilerLoginComputer animationSource code
DemosceneCompilerUpdateCache (computing)Proxy serverVersion <Informatik>FlagFormatiererWEBRAMCodeLecture/Conference
DemosceneJava Virtual MachineBytecodeOverhead (computing)MathematicsDatabaseBerechnungLecture/ConferenceComputer animationXML
Set (mathematics)Module (mathematics)CodeImplementationLecture/ConferenceComputer animation
ProduktdatenbankService (economics)ICONImplementationHTTPMEGACodeComputer animationLecture/Conference
ImplementationString (computer science)CodeObject (grammar)CarriagewaySAP <Marke>ImplementationXML
ImplementationHTTPUniform resource locatorSoftware repositoryCodeSQLGeometrischer KörperZahlRoute of administrationInformationComputer animationLecture/Conference
ImplementationKommunikationKommunikationComputer animation
ImplementationExponential functionKommunikationSoliDImplementationComputer animation
OvoidFunction (mathematics)Computer animation
Error detection and correctionEnergy levelThread (computing)Single-precision floating-point formatLoop (music)Internet forumThread (computing)Computer animationLecture/ConferenceXML
Thread (computing)MultithreadingCountingVariable (mathematics)CodeQuantum stateComputer animation
MultithreadingVariable (mathematics)Thread (computing)FRAMEWORK <Programm>Lecture/ConferenceComputer animation
Loop (music)CodeHTTPLecture/ConferenceComputer animationDiagram
CLOU <Programm>Loop (music)Error messageCodeParallel programming modelCodeProgrammer (hardware)DiagramLecture/ConferenceComputer animationXML
Concurrency patternComputer programmingComputer animation
Computer animationXML
KommunikationComputer animationXML
KommunikationXMLComputer animation
CoroutineFREDMassMORSE <Programm>XMLComputer animation
FormatiererConcurrency patternLecture/ConferenceComputer animation
Overhead (computing)Thread (computing)Lecture/ConferenceXMLComputer animation
SoftwareEnergy levelError detection and correctionComputer animationMeeting/InterviewLecture/Conference
Error detection and correctionDecision tree learningDatabaseSet (mathematics)Computer animation
CodeDecision tree learningLecture/ConferenceXMLComputer animation
CodeError detection and correctionComputer animation
Error detection and correctionDecision tree learningError messageHTTPImplementationCodeException handlingComputer animationMeeting/Interview
Error messageImplementationCodeException handlingError detection and correctionHTTPComputer animationXML
openSUSEComputer animationJSONXMLUML
Transcript: German(auto-generated)
Ich habe jetzt drei Go-Routinen, die parallel laufen. Die lauscht wieder auf diesen Kanal, der zwischen denen rumgereicht wird, als Kommunikationsweg. Nimmt sich das, was vorher rauskam, dem ist aber auch egal, was vorher rauskam, verwandelt es in Morse, in Morse-Code, und gibt das dann raus. Und am Ende habe ich so ein Ding, das lauscht eben auf diesen Morse-Code, auf der Hauptroutine, und gibt den aus.
Und das sieht dann so aus, dass ich am Anfang diesen Emitter habe, der tick tick tick macht. Der hat seinen Kommunikationsweg, den gebe ich diesem Logger rein, der gibt einen Kommunikationsweg raus, den stecke ich in den Morse-Arbeiter rein, der gibt dann einen Kommunikationsweg raus, und auf den kann ich lauschen.
Das heißt, die haben nicht so ein Stück Speicher, auf dem die arbeiten, zum Beispiel eine Liste an Strings, wo die was hinzufügen und dann muss geblockt werden, sondern die geben sich einfach so Kommunikationswege raus. Kanäle, Warteschlangen, wie man es nennen will. Und wenn ich das jetzt einmal ausführe, dann sieht das so aus, dass hier ein Morse ist. Da steht dann eine Stunde, eine Minute, eine Sekunde in Morse, sehen wir hier.
Ach so, ihr seht nicht, wo mein Finger hin zeigt, ne? Ach, ist auch rot, denkbar schlecht. Man sieht hier vielleicht, ändern sich Sachen. Und wenn jetzt das ein länger dauern würde, könnte ich diesen Flaschen jetzt ganz einfach beheben, indem ich diese Score hier in einer Schleife mache, die zweimal ausgeführt wird.
Und auf einmal laufen zwei Arbeiter, die Morse verwandeln, wenn Morse ganz lange dauern würde. Fertig. Ganz einfach. Pros und Cons. Das Ganze, was wir hier gesehen haben, ist super effizient. Das heißt, das braucht zwei Kilobreit pro Go-Routine, und die drei teilen sich die Betriebsteam-Threads.
Das heißt, für ein Java-Thread kann ich 1.000 Go-Routinen starten. Ganz cool. Und habe eigentlich keine großen Nachteile an der Stelle. Meistens brauche ich auch dieses Locking nicht. Das heißt, ich muss nicht gucken, wer benutzt was, und nur einer darf gleichzeitig zugreifen,
weil ich einfach kommuniziere zwischen diesen Routinen. Aber wenn ich das brauche, kann ich das auch. Es gibt auch dieses Locking, gibt es auch in Go. Für manche Algorithmen ist das notwendig. Und für manche extrem hoch effiziente Algorithmen ist das notwendig. Die sind dann schneller als diese Routine. 95 Prozent der Fälle reicht die Kommunikation. Und der Datenfluss ist transparent.
Ich habe gesehen, ich habe die Sachen von oben nach unten zusammengesteppselt. Es war klar, wer kommuniziert mit wem. Es war sehr, sehr klar lesbar, und es ist nicht irgendwie eine Magic im Hintergrund. Das hat einen Nachteil, der ein bisschen absurd ist, weil das so einfach ist, neigen besonders Anfänger dazu, das zu viel zu nutzen. Also ich muss nicht zum Ausdrucken von einem String, wie ich gerade,
eine parallele Routine irgendwo starten oder fünf oder so, sondern ich kann es auch einfach reinschreiben, jetzt druckt das aus. Keep it simple, stupid. Aber wenn man das ein bisschen benutzt hat, lernt man das auch. Also, kurze Zusammenfassung. Was parallelität angeht, ist Go einfach zu lesen, oben nach unten. Ganz klar, was nacheinander passiert, wenn auch parallel.
Es ist einfach zu maintain, weil einfach zu lesen bedeutet, einfach zu maintain. Ich kann drei Monate noch mal hingehen und verstehe das. Sogar Code, den ich nicht geschrieben habe, vor allem weil er gleich formatiert ist. Es ist einfach zu schreiben, weil Go hat sehr, sehr wenig Sprachwörter,
wenig, was ich lernen muss. Das, was ich da lese oder das, was ich da schreibe, kann jeder auch wieder verstehen. Ich muss mir wenig Gedanken machen, ob mein Kurs lesbar ist. Also, natürlich muss ich mir Gedanken machen. Und es ist super effizient, wie gesagt zwei Kilobyte statt zwei Megabyte. Und kompiliert. Ja, war es auch einfach zu lesen. Also was wir da gesehen haben mit dem Synchronized und so, das sind einfach Blocke von oben nach unten und Threads.
Auch relativ einfach zu lesen. Aber leider schwer zu maintain, weil die Implikationen, die da mitschwingen, bei so einem Wolle-Teil und Synchronized, besonders bei großen Code-Basen, leicht übersehen werden. Da muss man aufpassen, dass man da keine Fehler macht. Besonders mit diesem Wolle-Teil habe ich bisher jedes Mal, wenn es genutzt wurde, gab es einen Bug auf Produktion bei mir, wo ich das gesehen habe.
Und entsprechend ist es schwer zu schreiben, weil man will es verständlich schreiben. Man will, dass es einfach zu lesen bleibt. Und umso größer es wird, umso komplizierter wird das. Und bei der Ausführung habe ich da diesen Thread-Overhead. Das heißt, ich kann nicht einfach mal eben 1000 Threads hochziehen. Das sind 3 GB RAM, 2 bis 3. Ich glaube, es ist ein bisschen besser geworden. Aber ich bleibe jetzt mal so plakativ.
NodeJS ist wiederum schwer zu lesen. Also wenn ich das einmal schreibe, fühlt sich das super cool an. Also leicht zu schreiben. Aber wenn ich den Code in drei Wochen angucke oder WM gebe, dann sind da ganz viele kleine Callbacks, die irgendwann passieren. Ich weiß nicht, was wann passiert, das ist typlos. Ich weiß nicht, darf das eigentlich so sein? Super schwer. Und deswegen ist es auch schwer zu maintain.
Auch aus eigener Erfahrung. Und der Vorteil mit den lang dauernden IO-Operationen ist super cool. Dateien lesen so passiert irgendwann, muss ich mir Gedanken darüber machen. Aber wenn ich auf einmal Mathematik mache, super abgefahren, dann wird es schwer. Dann muss ich auf einmal selber Parallelisierung programmieren, sorry.
Vielen Dank und wir springen jetzt asynchron zurück. Und nutzen noch die restlichen Minuten. Ich drücke das jetzt in fünf Minuten durch. Der Code zum Beispiel, den Dino gerade so schnell durchgezeigt hat, der ist auch bei GitHub. Also ihr könnt ihn noch mal in Ruhe nachvollziehen zuhause.
Bei einem kühlen Bier oder Wasser, wie auch immer. Ja, genau. Wenn ihr irgendwelche Termine oder so habt, dann geht ruhig. Ich bin euch nicht böse. Genau, bleibt. Fehlerbehandlung. Also, was mache ich mit Fehlerbehandlung? Fehler passieren. Und es gibt, grob gesagt, zwei Arten von Fehlern.
Die Fehler, die man syntaktisch lösen kann in einer kompilierten Sprache. Oder die man überhaupt schon zur Compile-Zeit lösen kann. Auch logische Fehler. Und welche, die man nur zur Laufzeit lösen kann. Oder die nur zur Laufzeit auftreten. Zum Beispiel, die Datenbank ist weg. Das kann man nicht programmieren, das kann man behandeln,
aber man kann sie nicht vermeiden. Fangen wir mit Fehlerbehandlungen ja an. Ja, geht das jetzt schnell durch. Wir entwickeln unseren Produkt-Service weiter. Wir wollen ja einen Schritt nach vorne machen und nicht nach hinten. Also wollen wir jetzt auch noch einen Shopping-Card zur Verfügung stellen, wo wir Produkte reintun. Wir erwarten eine User-ID, eine Produkt-ID und die Menge.
Dann laden wir den Shopping-Card für den Benutzer. Laden das Produkt. Packen das Produkt so oft in diesen Shopping-Card wie gefordert. Und persistieren diesen Shopping-Card, damit wir nachher noch wissen, was da drin ist. Fällt euch an, was da schiefgehen könnte?
Ich helfe euch. Zum Beispiel der Shopping-Card für den Benutzer. Den gibt es gar nicht. Oder ganz viele andere Sachen. Die Verbindung zur Datenbank schlägt fehl. Es gibt kein Produkt mit der ID. Die Verbindung zur Datenbank ist fehlgeschlagen. Die Menge amount ist negativ, weil es keine unsigned integer gibt in Java.
Die Verbindung zur Datenbank ist fehlgeschlagen. Was machen wir? Um zum Beispiel den Fehler vorzubeugen, dass ein Shopping-Card nicht existiert, können wir in Java sagen, versuch einfach mal diesen Shopping-Card zu laden. Es könnte aber sein, dass eine Ausnahme, eine Exception passiert. Die heißt no-card-exception.
Und wenn das so ist, dann erstelle einfach einen neuen Shopping-Card für diesen Benutzer. Würde man jetzt wahrscheinlich im Produktivcode ein bisschen anders lösen, auslagern, ist aber in dem Fall egal. Genau. Hier können aber noch andere Sachen passieren, wie wir eben gesehen haben. Die Datenbank kann weg sein. Es gibt das Produkt nicht. Das sind alles Sachen,
die können wir in diesem Kontext gar nicht lösen. Wir wissen nicht, was wir da machen sollen. Da muss sich jemand anders drum kümmern. Im Zweifel muss der Server sagen, geht nicht, probier nochmal. Oder geht nicht, kündige den Admin. Deswegen sagen wir hier in dieser Funktion, wirft diese Fehler weiter nach oben. Das ist in dieser Situation sehr schön gelöst. Denn ich als Benutzer dieser Funktion sehe,
ok, ich füge hier Produkte in den Cards hinzu. Es können aber diese Sachen hier auch schief laufen. Das heißt, wenn ich das benutze, werde ich schon gewarnt, diese Randfälle gibt. Auf der anderen Seite, wir machen wieder einen HTTP-Händler. Und hier
erstellen wir einen Card-Request aus dem HTTP-Request. Holen aus diesem Card-Request die User-ID, die Produkt-ID und die Menge. Führen unsere Funktion aus. Um das, was wir eben programmiert haben, auszuführen. Hier, in diesem ganzen Ding, also sowohl hier als auch hier, kann irgendwo darunter
eine Illegal Argument Exception passieren. Zum Beispiel, wenn der Amount negativ ist. Das ist etwas, das wollen wir nicht. Dann sagen wir per HTTP, das ist dein Fehler. Du hast was kaputt gemacht. Wenn irgendeine andere Exception passiert, wie zum Beispiel die Datenbank, dann sagen wir, sorry, unser Fehler. Versuche irgendwann einfach
mit den gleichen Parametern nochmal. Es ist also sehr übersichtlich getrennt. Hier ist unsere Implementierung und hier ist unser Fehlerhandling. Was passiert, wenn wir so eine Exception nicht fangen? Na ja, in Java kriegt man dann so einen Stack Trace. Das Gemeine bei so einem Stack Trace, also hier sieht man, der hat den aufgerufen, der hat den aufgerufen, den, den, den.
Hier in dem Code können wir das nachlesen. Es kann aber passieren, wenn wir Exceptions fangen und wieder werfen, dass der eigentliche Grund für diese Exception nicht der unterste ist, sondern irgendwo in der Mitte. Das heißt, man hat relativ viel zu lesen. Ich arbeite mit zwei Java-Entwicklern im Team. Wir machen zwar nur Go, aber die haben vorher Java gemacht.
Und die können das unfassbar schnell lesen. Und ich sehe nur das und denke, kann mir bitte jemand von den Java-Entwicklern helfen? Ja. Wir haben gerade gesehen, die Funktion definiert genau, was schiefgehen kann. Nachteil dieses Vorgehen ist, jedes Mal, wenn jemand, den ich hier aufrufe,
irgendeine andere Exception wirft, muss ich das hier aktualisieren, sonst kompiliert der Code nicht mehr. Denn ich sage, diese drei Arten werden geworfen. Es gibt noch eine andere Möglichkeit, damit umzugehen. Ich sage nicht, diese drei Arten werden geworfen, sondern Exceptions werden geworfen. Exceptions sind auch polymorph. Und wenn ich sage, Throws Exception, können das auch diese drei sein.
Können aber auch ganz andere sein. Ganz egal. Der Vorteil, das so explizit zu sagen ist, ich sage, was kann schiefgehen. Du benutzt das, dann pass mal auf, könnte eine Datenbank meckern, oder weiß ich nicht was. Entwickler werden genau darauf aufmerksam gemacht und werden darauf aufmerksam gemacht. Sehr gut.
Throws Exception ist viel flexibler. Also wenn irgendjemand in einer Library, die ich benutze, und das können ganz viele Libraries sein, irgendwas ändert, muss ich meinen Code nicht ändern. Der kompiliert immer noch. Auf der anderen Seite weiß ich natürlich nicht genau, was alles schiefgehen kann. Und ich weiß nicht genau, welche Randfälle ich betrachte.
Eben haben wir zwei Randfälle gehabt, wo wir einen 500er und einen 400er geworfen haben. Das muss man sich dann eher denken. Also, Exceptions sind Java. Wir haben alle Randfälle behandelt oder reichen sie explizit nach oben. In unserem Beispiel. Allgemeine Fehler wie Datenbankverbindungsfehler werden an einer Stelle behandelt. Nicht überall im Stackrace. Ich prüfe nicht immer mal, was mache ich denn jetzt?
Datenbank geht nicht. Sondern ich mache es nur ganz oben, da wo ich es auch wirklich behandeln kann. Es ist möglich Fehlerhändling von dem Normalfall zu trennen. Das haben wir gesehen. Wir haben erst den ganzen Ausführungscode und dann haben wir ganz viele Catches. Es ist möglich, Fehlerfehle zu gruppieren, wie zum Beispiel Illegal Argument Exception. Der Amount könnte
negativ sein. Oder sagen wir einfach mal, eine Produkt-ID wurde benutzt, die es so syntaktisch gar nicht geben kann. Beides eine Illegal Argument Exception. Beides resultiert in einem 400er. Wie ist das in Go? So, was ist das? Das ist die gleiche Deimplementierung der
AddProductToCard. Das ist aber ganz schön viel Code. Eben hatten wir nur 5 oder 6 Zeilen. Naja, gut. Es hat sich eben gesagt, ich arbeite mit zwei Java- Entwicklern im Team. Die fanden es die ersten vier Monate auch richtig scheiße, dass das so explizit ist. Mittlerweile
lieben sie es. Also, man muss sich da auch ein bisschen dran gewöhnen. Wenn man jahrelang anders gearbeitet hat, ist das eine große Umgewöhnung. Das will ich nicht verschweigen. Teilen wir das mal visuell ein bisschen ein. Alle Fehlerfälle oder Anormalitäten sind eingerückt. Das, was passiert, sehe ich hier alles auf der Golden
Line. Golden Line of Sight nennen wir das. Wenn man sich daran gewöhnt hat, so wie Java- Entwickler Exception Stack Traces lesen können, was ich nicht kann, lernt man als Go-Entwickler erstmal die nicht eingerückten Sachen zu lesen. Dann weiß man, okay, AddProductToCard lädt einen Shopping Card, lädt das Produkt, packt das da rein, persistiert das, genauso wie es in Java der Fall war.
Was sehen wir noch? Errors sind explizite Objekte. Dann nennen wir es mal Objekte. Das heißt, wir haben einen Rückgabewerterror. In Java hatten wir zwei Flussebenen. Die eine Flussebene waren die Return Values und die andere Flussebene waren Exceptions. Wenn irgendwo eine Exception geworfen
wird, wird die Ausführung unterbrochen. Das ist in Go nicht so. In Go gibt es nur eine Ebene. Wir führen das hier aus. Wir laden den Shopping Card für den Benutzer, kriegen einen Fehlerwert, den wir dann auch immer überprüfen müssen. Hier gucken wir, ist das ein Not Found Error? Wenn das der Fall ist, dann erstellt einfach einen neuen Card.
Ist das eine andere Art von Fehler? Pff, gib's zurück. Ich weiß nicht, was ich damit machen soll. Aber reicher ist, mit Load Shopping Card fällt an. Das heißt, auch hier ist ein Unterschied. Bei Java wirft man einfach die Exception und dadurch wird der Stack Trace automatisch angereichert. In Go macht man das selber. Hat den Nachteil, man muss es selber machen. Hat den Vorteil, am Ende
des Tages habe ich nicht 500 Zeilen Exception Stack Trace, sondern da steht, konnte das Produkt nicht zum Shopping Card hinzufügen, Doppelpunkt, Loading Shopping Card Fail, Doppelpunkt, Database Connection Closed. Also, ich habe das auf die wesentlichen Informationen eingenimmt, aber ich musste
selber dafür sorgen. Hier gehen wir weiter. Wir laden das Produkt, haben wieder einen Fehler, müssen gucken, ob der nicht nil ist und so weiter. Auf der anderen Seite machen wir wieder einen HTTP-Händler. Der holt sich die Request Data. Wenn das nicht funktioniert, sagt 400, du hast mir
Invalides Jason geschickt. Dann füge ich diese Funktion wieder aus. Wenn ich merke, dass es ein Bad Input, write 400. Wenn ich merke, das ist irgendwas anderes, 500. Also, da habe ich jetzt den Body außen vor gelassen, weil die Slides so klein sind. Also, vergleichen wir das alles nochmal in Go.
Wir haben sehr, sehr viel Code. Kann einen ein bisschen erschlagen am Anfang. Es ist sehr explizit. Man muss kein mentales Modell im Kopf haben. Man kann es einfach lesen. Es ist also nichts für Leute, die gerne cleveren Code schreiben, sondern Leute, die gerne verständlichen Code schreiben. Fehler müssen bei mehreren Rückgabewerten explizit ignoriert werden. Wir sehen das hier.
Wenn ich den Cart einer Variable zuweise, muss ich hier einen Unterstrichen malen, wenn ich den ignorieren möchte. Und wenn ich hier Error befülle, muss ich Error auch verwenden, sonst meckert der Compiler. Also, unused Variables gibt es nicht.
Das hat man eben in dem anderen Beispiel gesehen. Da hatte ich ein paar Mal den Unterstrich, damit der Code nicht so aufgebläht ist. Trennung von Ausführungs- und Ausnahmebehandlungen durch Einrückungen, aber auch nur durch Einrückungen. Also, man muss das ein bisschen lernen, es zu lesen, aber es gibt eine Trennung. Verschiedene Fehlerarten müssen durch Interfaces abgebildet werden. Das habe ich euch jetzt ein bisschen verschwiegen, aber
Error ist ein Interface und dadurch, dass Interfaces implizit implementiert werden, kann das natürlich auch noch andere Interfaces erfüllen. Und hier prüfe ich, ob das das IsBadInput-Interface erfüllt. Java. Trennung von Implementierung und Fehlerbehandlung durch Try-Catch- Blöcke. Fehlertracing kann unübersichtlich sein. Welche Zeile hat die Exception geworfen?
Durch Polymorphie der Exceptions kann der Entwickler entscheiden, wie flexibel beschreibend die Schnittstelle sein soll. Also, Negative Amount Exception kann Illegal Argument Exception extenden. Und dann kann ich immer noch entscheiden, auf dieser Ebene interessiert es mich, dass der Illegal Argument Exception wirft oder Negative Amount.
Das war's schon. Vielen Dank.