/ / Wie unterscheidet sich die Kompilierung von elm von den überprüften Ausnahmen von Java? - Java, Ulme, Check-Ausnahmen

Wie unterscheidet sich die Kompilierung von elm von den geprüften Ausnahmen von Java? - Java, Ulme, Check-Ausnahmen

elm"s Behauptung von Null-Laufzeit-Ausnahmen ist eines der wichtigsten Verkaufsargumente (siehe offizielle Website),

Aber wenn Sie aufhören, darüber nachzudenken, hält Sie nichts davon ab, durch Null zu teilen oder den Speicher zu verlieren.

Was zum elm Compiler im Grunde, zwingt Sie, alle möglichen Pfade zu decken, die zu einer Ausnahme führen können.

Beispielsweise:

import String exposing (toInt)
toIntOrZero s = case toInt s of
Err e -> 0
Ok val -> val

Aber wie unterscheidet sich das von der berüchtigt "checked-exceptions" -Funktion in java ?

public static Integer toIntOrZero(String s) {
try { return Integer.valueOf(s); }
catch (NumberFormatException e) { return 0; }
}

Das habe ich nie gehört java ist eine Null-Laufzeit-Ausnahmensprache.

Antworten:

5 für die Antwort № 1

Bitte lassen Sie sich nicht zu sehr von Marketing-Übertreibungen mitreißen. Na sicher Es gibt Fehlerklassen, die Sie mit keinem Compiler vollständig ausschließen können.

Als solche habe ich immer diese genommenZero-Runtime-Exceptions-Behauptungen mit einem Hauch von Salz, aber ich verstehe die Absicht des Befürworters. Elm wurde als eine Alternative zur Entwicklung von Front-End-Anwendungen in Javascript, das eine chaotische Welt ist, wo Ausnahmen reichlich vorhanden sind und nur ein Teil erstellt Elm macht es viel schwieriger, sich in den Fuß zu schießen, und ohne viel Aufwand, wenn Sie grundlegende Tests auf Ihre App, Sie wahrscheinlich durchlaufen Gewohnheit jemals Laufzeitausnahmen haben in Produktion.

Elm reduziert drastisch die Möglichkeit von Ausnahmen auf ein paar Arten.

  1. Außer in der Sprache gibt es keine Ausnahme von der Ausnahme, in der eine Ausnahme möglich ist Debug.crash, die, wie der Name schon sagt, eigentlich nur zum Debuggen und zum Auswerfen unvollständiger Logikpfade verwendet werden sollte.

Da es keine umwerfbaren Ausnahmen gibt, werden Handhabungsprobleme meistens durch Typen wie Result und Maybe.

Dies könnte als lose Analogie angesehen werdenJava hat Ausnahmen überprüft, aber konzeptionell fühlen sie sich sehr unterschiedlich von mir. Ausnahmen wurden missbraucht. Sie erwähnen ein Beispiel in Java, wo Integer.valueOf() sagt, dass es ein Int zurückgeben wird, aber wenn SieÜbergeben Sie es noch etwas, es entrollt den Stapel und sprudelt auf, bis einige Funktion hoffentlich es fängt. Das fühlt sich sehr unordentlich an und sicher können geprüfte Ausnahmen dazu beitragen, das Fenster für die Fehlerausbreitung zu reduzieren, aber die grundlegende Tatsache ist, dass eine Ausnahme das falsche Werkzeug für die Geschäftslogik ist.

Eine Alternative zum Auslösen einer Ausnahme wäre es, Klassen zu haben, die für die Result und Maybe Ulmenarten, aber das wäre fast gewesenunmöglich in den frühen Tagen von Java, sauber zu machen, und sogar mit Generika, Schreiben solcher Typen ist mühsamer und fehleranfälliger als die Einfachheit von Elms Typen. Und wegen Elms geschlossenem System,

  1. Nicht vollständige Musterübereinstimmungen verursachen einen Kompilierungsfehler

In Java und Javascript gibt es keine Möglichkeit zu habenerschöpfende Musterübereinstimmungsüberprüfung, weil das System es nicht erlaubt. Sicher, Typescript hat einige Funktionen eingeführt, aber Sie müssen sich dafür entscheiden. In Elm müssen Sie explizit alle Fälle behandeln. Sicher, Sie könnten argumentieren, dass Elm sich von einem erschöpfenden Mustervergleich verabschiedet hat, indem Sie alle Fallaussagen mit einem Catch-All abschließen _, aber das wäre nur ein alberner Missbrauch derSprache. Diese Überprüfungen sind da, um Ihnen zu helfen, und ich fühle mich viel sicherer mit der Tatsache, dass ich mich nicht zur Fehlerüberprüfung in Elm anmelden kann - es ist dort standardmäßig!

  1. Unveränderlichkeit

Unveränderlichkeit vermeidet viele potenzielle Fehlerarten, zu viel, um hier hineinzukommen

  1. The Elm Architecture bietet eine saubere Trennung zwischen Javascript und Elm

Elm kompiliert zu Javascript, aber der ElmDie Architektur bietet eine nette, saubere Barriere, um all die fiesen Bits von Javascript von dem reinen Code von Elm fernzuhalten. Jede Ausnahme, die in Javascript auftreten kann, sollte von dieser Barriere behandelt werden, so dass E / A-Fehler immer in einen Elm-freundlichen, ausnahmslosen Typ übersetzt werden.

Letztendlich sind Laufzeitausnahmen weiterhin möglich (Beispiel: der nächste Frage mit Elm mit einer bekannten Laufzeitausnahme behaftetdurch eine rekursive Json-Decoder-Definition), und ich zittere ein wenig, wenn ich jemanden höre, der sagt, es sei unmöglich, in Elm eine Ausnahme zu bekommen. Tatsache ist, dass Ausnahmen möglich sind, aber fast jede Ausnahme, die man durchläuft in der täglichen JavaScript-Entwicklung ist im Wesentlichen unmöglich in Elm.


4 für die Antwort № 2

Wie ein Kommentator hervorgehoben hat, hat Java Ausnahmen deaktiviert, also Laufzeitfehler machen auftreten. Elm hat auch unchecked Ausnahmen, für Dinge wie Division durch Null, aber beseitigt die am häufigsten in der Praxis gesehen. Und wie Chad's Antwort erwähnt, Elm's Maybe/Result Typen funktionieren in der Praxis ziemlich anders als die geprüften Ausnahmen von Java. Ein erfahrener Elm-Programmierer würde keine Funktion wie schreiben toIntOrZero (Und wenn sie es taten, würden sie wahrscheinlich nicht verwenden case ... of, bevorzugen stattdessen etwas wie toIntOrZero = String.toInt >> Result.withDefault 0).

Verketten mehrerer Operationen zusammen mit Result.map, Result.andThen, und so weiter, gibt eine sehr ausdrucksvolle Art vonFehlerfälle behandeln, ohne den Programmierer zu zwingen, zu tief in das Unkraut zu geraten. Wenn wir zum Beispiel eine Funktion schreiben wollen, die eine ID validiert, indem sie sie in ein Int konvertiert, sie in einer Datenstruktur nachschlägt (wenn sie möglicherweise nicht da ist) und dann eine mit diesem Benutzer verknüpfte Eigenschaft überprüft, können wir schreiben etwas wie das:

lookupUser : Int -> Result String User
lookupUser intId = ...

userInGoodStanding : User -> Bool
userInGoodStanding user = ...

isValidId : String -> Bool
isValidId id =
String.toInt id
|> Result.andThen lookupUser
|> Result.map userInGoodStanding
|> Result.withDefault False

Dies lautet: "Konvertiere die ID in einen int, dann schauDen zugehörigen Benutzer überprüfen, dann den Benutzer verifizieren, und falls etwas fehlgeschlagen ist, False zurückgeben. "Ihre Laufleistung kann variieren, aber sobald Sie sich daran gewöhnt haben, finde ich (und viele Elm-Programmierer, denke ich!) wirklich nette Art, Code robust gegen Fehler zu schreiben.