Modularisierung
Ein Modul erstellen
Ein Modul ist eine Zusammenstellungen von Definitionen, die eine Einheit bildet und als Baustein für die Programmierung zur Verfügung gestellt wird.
Um aus der Sammlung von (kommentierten) Funktionsdefinitionen ein Modul zu erstellen, muss diese Sammlung nur noch als Modul
(hier: module Teilzeichenketten exposing (..)
) ausgezeichnet werden und als Datei mit dem eingeführten Modulnamen (hier: Teilzeichenketten.elm
)
im Verzeichnis src
-Verzeichnis für Elm-Projekte abgelegt werden.
Verzeichnisstruktur:
- elm-stuff - src - Teilzeichenketten.elm - ... elm.json
Quelltext von Teilzeichenketten.elm:
module Teilzeichenketten exposing (..)
-- ZeichenAnPos
{--
Beispiele:
zeichenAnPos 2 "F CK 1900" -> " "
zeichenAnPos 4 "F CK 1900" -> "K"
zeichenAnPos 0 "F CK 1900" -> ""
zeichenAnPos 20 "F CK 1900" -> ""
--}
zeichenAnPos: Int -> String -> String
zeichenAnPos n text =
String.slice (n-1) n text
-- ...
Ein Modul verwenden
Wenn man die REPL jetzt im Verzeichnis für die Elm-Projekte startet, dann kann man mit import
die Definitionen aus dem Modul
laden und anschließend verwenden.
> import Teilzeichenketten
> Teilzeichenketten.zeichenAnPos
<function> : Int -> String -> String
> Teilzeichenketten.zeichenAnPos 2 "Hallo"
"a" : String
Aufgabe 1
Teste das selbst.
Die verwendbaren Funktionen festlegen
Mit dem Zusatz exposing ...
legt man fest, welche Definitionen aus dem Modul an anderer Stelle importiert werden können.
Mit exposing (..)
werden alle Definitionen zur Verfügung gestellt. In den Klammern kann man aber auch genau die Namen auflisten, deren Definitionen
zur Verfügung gestellt werden sollen.
module Teilzeichenketten exposing (zeichenAnPos, zeichenVorPos)
-- ZeichenAnPos
{--
Beispiele:
zeichenAnPos 2 "F CK 1900" -> " "
zeichenAnPos 4 "F CK 1900" -> "K"
zeichenAnPos 0 "F CK 1900" -> ""
zeichenAnPos 20 "F CK 1900" -> ""
--}
zeichenAnPos: Int -> String -> String
zeichenAnPos n text =
String.slice (n-1) n text
-- ...
Aufgabe 2
Teste den Fall, dann man eine Funktion verwenden möchte, die nicht mit exposing ...
zur Verfügung gestellt wurde.
Ein Kürzel für den Modulnamen verwenden
Gerade bei längeren Modulnamen ist es günstig, wenn man ein Kürzel für diesen Modulnamen einführt und verwendet.
module Teilzeichenketten exposing (..)
-- ZeichenAnPos
{--
Beispiele:
zeichenAnPos 2 "F CK 1900" -> " "
zeichenAnPos 4 "F CK 1900" -> "K"
zeichenAnPos 0 "F CK 1900" -> ""
zeichenAnPos 20 "F CK 1900" -> ""
--}
zeichenAnPos: Int -> String -> String
zeichenAnPos n text =
String.slice (n-1) n text
-- ...
> import Teilzeichenketten as TZK
> TZK.zeichenAnPos
<function> : Int -> String -> String
> TZK.zeichenAnPos 2 "Hallo"
"a" : String
Aufgabe 3
Führe selbst ein kürzel ein und teste die Verwendung in Funktionsaufrufen.
Auf den Modulnamen verzichten
Es ist auch möglich, den Modulnamen bei Funktionsaufrufen ganz wegzulassen, wenn man den import
um eine exposing
-Angabe
erweitert.
module Teilzeichenketten exposing (..)
-- ZeichenAnPos
{--
Beispiele:
zeichenAnPos 2 "F CK 1900" -> " "
zeichenAnPos 4 "F CK 1900" -> "K"
zeichenAnPos 0 "F CK 1900" -> ""
zeichenAnPos 20 "F CK 1900" -> ""
--}
zeichenAnPos: Int -> String -> String
zeichenAnPos n text =
String.slice (n-1) n text
-- ...
> import Teilzeichenketten exposing (..)
> zeichenAnPos
<function> : Int -> String -> String
> zeichenAnPos 2 "Hallo"
"a" : String
Aufgabe 4
Teste das selbst.
Ein Vorgehen vereinbaren
Die letzte Variante mit import ... exposing (..)
wird bei größeren Projekten nicht empfohlen. Mit dieser Variante
kann es zu Konflikten kommen, wenn in verschiedenen Modulen derselbe Name für Funktionen benutzt wird.
Wir verwenden daher in größeren Projekten die anderen Varianten.
Wir benutzen die Variante mit import ... exposing (..)
hier dagegen häufig zum schnellen Testen von Funktionsdefinitionen in der REPL.