Stufe 1Einstieg · Lektion 5 von 34
Konventionen: Namen, Einrückung und Stil
Scala lässt Ihnen viele Freiheiten – mit oder ohne Klammern, mit oder ohne Typangaben, Operatoren als Methodennamen. Gerade deshalb lohnt es sich, früh ein paar Konventionen zu kennen, auf die sich die Scala-Welt geeinigt hat.
Namen
- Klassen, Traits, Objekte, Typen und enums schreiben Sie in
UpperCamelCase:Bestellung,HttpClient,Farbe. - Methoden, Werte und Variablen in
lowerCamelCase:gesamtPreis,istLeer,ladeKunde. - Pakete komplett klein, oft nach umgekehrtem Domainnamen:
de.beispiel.shop. - Konstanten – also unveränderliche Werte in einem
object, die sich nie ändern – schreiben Sie ebenfalls groß:val MaxVersuche = 3. Die in Java üblichenGROSSBUCHSTABEN_MIT_UNTERSTRICHsind in Scala unüblich.
Methoden ohne Parameter und ohne Nebenwirkung werden ohne Klammern definiert und aufgerufen (liste.size), Methoden mit Nebenwirkung mit leeren Klammern (verbindung.close()). So erkennt man schon am Aufruf, ob etwas „passiert“.
Einrückung oder Klammern?
Scala 3 erlaubt beide Stile. Die Einrückungsschreibweise ist inzwischen verbreitet und wird in der offiziellen Dokumentation verwendet:
def einordnen(punkte: Int): String =
if punkte >= 90 then "sehr gut"
else if punkte >= 70 then "gut"
else "bestanden"Dasselbe mit Klammern, so wie in Scala 2:
def einordnen(punkte: Int): String = {
if (punkte >= 90) "sehr gut"
else if (punkte >= 70) "gut"
else "bestanden"
}Wichtig ist nur, innerhalb eines Projekts bei einem Stil zu bleiben. Eingerückt wird mit zwei Leerzeichen, nicht mit Tabulatoren. Bei langen Blöcken können Sie das Ende mit einer End-Markierung deutlich machen: end einordnen.
Typangaben
Die Typinferenz nimmt Ihnen viel Schreibarbeit ab. Trotzdem gilt als Faustregel:
- Öffentliche Methoden bekommen einen Rückgabetyp. Er dokumentiert die Schnittstelle und verhindert, dass eine Änderung im Rumpf unbemerkt den Typ ändert.
- Lokale Werte brauchen meist keinen Typ:
val summe = preise.sumist klar genug. - Bei
given-Instanzen und impliziten Konvertierungen ist ein Typ Pflicht bzw. dringend angeraten.
Unveränderlich als Standard
Schreiben Sie val statt var und unveränderliche Collections statt veränderlicher, solange nichts dagegen spricht. Eine var ist kein Fehler, aber ein Signal an Leser: Hier ändert sich etwas, pass auf. Die Lektion über Variablen geht darauf genauer ein.
Dateien und Pakete
- Eine Datei kann mehrere Klassen enthalten. Üblich ist, dass sie nach der wichtigsten Klasse darin heißt:
Bestellung.scala. - Die Ordnerstruktur spiegelt meist die Pakete:
src/main/scala/de/beispiel/shop/Bestellung.scala. - Importe stehen oben in der Datei. In Scala 3 importieren Sie alles aus einem Paket mit
import scala.util.*(in Scala 2 hieß das_).
package de.beispiel.shop
import scala.util.{Try, Success, Failure}
import java.time.LocalDate
final case class Bestellung(nummer: Long, datum: LocalDate)Operatoren sparsam einsetzen
Weil Methodennamen aus Sonderzeichen bestehen dürfen, können Sie eigene Operatoren definieren. Das ist praktisch bei mathematischen Typen (vektor + vektor), wird aber schnell unlesbar, wenn |+| oder ~> in Geschäftslogik auftauchen. Faustregel: Ein Operator nur dort, wo seine Bedeutung jedem Leser sofort klar ist. Wie Operatoren als Methoden funktionieren, zeigt die Lektion über Funktionen und Methoden.
Automatisch formatieren mit scalafmt
Statt Stilfragen im Team zu diskutieren, überlassen viele Projekte das Formatieren dem Werkzeug scalafmt. Eine Datei .scalafmt.conf im Projektordner legt die Regeln fest:
version = "3.8.3"
runner.dialect = scala3
maxColumn = 100Anschließend formatiert scala fmt alle Dateien, in sbt erledigt das scalafmtAll (mit dem sbt-scalafmt-Plugin). Metals und IntelliJ können beim Speichern automatisch formatieren. Die version sollte zu der Version passen, die Ihre Werkzeuge verwenden.