2017-07-08 5 views
2

Ich habe gelesen, über Richard Feldman's Elm SPA app example, und ich sehe eine Reihe von examples Dinge wie diese zu verwenden, nicht sicher, wenn es Sinn, so etwas zu bedienen ist, eine Vereinigung Single-Wert, gegenüber nur ein Typ alias wie folgt aus:Wenn Typ alias vs. Einzelwert Union-Typ in Elm

type alias Username 
    = String 

wann ist es angebracht nur einen Einzelwert-Union-Typ gegenüber zu verwenden einen Typalias verwenden?

+1

Das Beispiel, das Sie gezeigt haben, wird als undurchsichtiger Typ bezeichnet. Wenn Sie eines verwenden, können Sie die Implementierungsdetails von anderen Teilen Ihres Programms (oder im Fall von Bibliotheken, vom Konsumenten) ausblenden. Sie können mehr über sie in der [Elm-Pakethilfe] (http://package.elm-lang.org/help/design-guidelines#keep-tags-and-record-constructors-secret) lesen (siehe Abschnitt " Halten Sie Tags und Record-Konstruktoren geheim "). – pzp

Antwort

5

Es gibt keine feste Regel, wenn es angemessen ist, aber ich neige dazu, ein paar Faustregeln zu befolgen. Lassen Sie uns ein Beispiel für eine Authentifizierungsfunktion verwenden, die einen Benutzernamen und ein Passwort verwendet. Beides sind String-Werte.

Als absolutes Minimum, ohne zusätzliche Alias ​​oder Typen, könnte die Anmerkung sein:

authenticate : String -> String -> Bool 

Da Anmerkung, ist es nicht klar ist, welche Parameter der Benutzername und das ist das Passwort . Wir können die Lesbarkeit verbessern, indem Typ Aliase:

type alias Username = String 
type alias Password = String 

authenticate : Username -> Password -> Bool 

Das ist besser für die Verbraucher von meinem Paket aber geben Sie Aliase werden Sie nicht verbieten versehentlich die Parameter Swapping im Code aufrufen. Zum Beispiel würde diese problematische Funktion kompilieren:

login : Username -> Password -> Bool 
login username password = 
    if authenticate password username then ... 

Wenn Sie einen Schritt weiter gehen wollen und Kraft, um die explizite Deklaration des Typs jedes Mal, wenn Sie es verwenden, können Sie diese Art von Fehler zu vermeiden, da der Compiler fangen mixups:

type Username = Username String 
type Password = Password String 

Mit dieser Definition müssen Sie nun explizit auspacken und die Saiten entweder in einem Benutzernamen oder Passwort Konstruktor jedes Mal, wenn Sie es verwenden, verpacken. Dies ist besonders nützlich für Dinge wie Maßeinheiten, in denen ein solches Konzept avoided the loss of a Mars mission

Wie Sie in Richards Beispiel sehen können, bedeutet die Route eines vollständigen Typ- und Typkonstruktors, dass Sie separate Boilerplate-Funktionen für die JSON-Decodierung benötigen Kodierung usw., die mühsam werden können. Sie müssen die richtige Balance für Ihr Team und Ihre Projekte finden.