Wie ich Scala unterrichtet habe

Vor einem Monat bekam ich meinen ersten Job und wurde ein Trainee-Entwickler. Unser Team verwendet die Scala-Sprache. Es scheint mir, dass alle unerfahrenen Entwickler am ersten Tag verloren sind. Gleichzeitig gibt es eine Menge neuer Namen, Technologien, einige Regeln, und Sie wissen nie, was, absolut alles ist neu für Sie, dies ist die erste Arbeit. In meinem Fall kannte ich die Sprache, in der ich programmieren würde, immer noch nicht, bis zu dem Interview, von dem ich noch nie gehört hatte. Fazit: Am ersten Tag war ich voll drauf. Fragen Sie, wie ich dann diesen Job bekommen habe? Ich kannte Java, beim Interview wurde mir gesagt, dass der Javista ganz leicht zum Felsen gehen kann und man sich keine Sorgen machen kann. Aber anscheinend hat sich ein bisschen Vorsprung immer noch gelohnt, denn beim ersten Mal vor mir sah ich nur mit Text gefüllte Bildschirme, auf denen fast die Hälfte sofort klar war.

Aber selbst die Tatsache, dass ich etwas nicht verstanden habe, brachte mehr Unbehagen mit sich, aber die Tatsache, dass es viel anderes gab und sogar der Typ der Variablen nach dem Namen kommt und manchmal überhaupt nicht existiert.

final String str = "abc"; //Java 

 val str = "abc" // Scala 

So wird die Funktion beschrieben:

 int sum(int a, int b) {return a+b;} // Java 

 def sum(a: Int, b: Int) = {a + b} // Scala 

Und Scala hat auch eine Konsole REPL (Read-eval-print-loop), wie zum Beispiel in Python. Wie Sie bereits bemerkt haben, fehlen die Semikolons. Sie können einseitige Programme ohne Hauptprogramm ausführen. Die Namen von Methoden und Variablen können Zeichen enthalten und mit diesen beginnen, ohne Regeln. Es gibt kein statisches, aber es gibt ein Objekt, es gibt auch primitive Objekte, == es gibt tatsächlich Gleiches. Wenn die Methode keine Parameter hat, muss der Methodenaufruf nicht beendet werden. Die Klammern sind auch optional, wenn keine Parameter vorhanden sind. Wenn nur 1 Parameter erforderlich ist, können Sie wie folgt schreiben:

 str.charAt(5); // Java 

 str charAt 5 // Scala 

Und noch ein interessantes Beispiel:

 val res = 1 + 1 

Nein, es ist nicht nur 1 plus 1, hier wird das Objekt 1, die + -Methode aufgerufen und Objekt 1 als einziger Parameter an dieses übergeben. Für mich war dies eine Vorlagenunterbrechung.

Zu meinem Schock kam ein wundervolles Buch von David Pollack - Beginning Scala. Das Buch beginnt mit einem Satz, nach dem mir klar wurde, dass ich es bis zum Ende lesen muss:
Autsch! Das tut meinem Gehirn weh! Hör auf, mich anders denken zu lassen. Oh, warte ... es tut jetzt weniger weh. Ich verstehe. Diese andere Art der Problemlösung hat einige Vorteile. Nach meinem ersten Jahr an der juristischen Fakultät fühlte ich mich so. Ich fühlte mich eine Weile so, als ich anfing, Scala zu programmieren.
David hat enorme Erfahrung in der Programmierung. Er hat dieses Geschäft 20 Jahre vor meiner Geburt gegründet und es geschafft, mit mehr als 10 Programmiersprachen zu arbeiten, bis er zu Scala kam. Und jetzt sagt er:
Scala ist eine Programmiersprache, die Entwicklern das Beste aus allen Welten bietet.
Trotzdem warnt der Autor ehrlich, dass es nicht so einfach ist, es zu meistern. Er hat 2 Jahre dafür gebraucht, aber er hofft, dass wir es schneller können und er wird dabei helfen. Dies ist kein sehr einfaches Buch und erfordert einige Erfahrung in der Programmierung mit dem Leser. Besonders diejenigen, die zuvor in Java programmiert haben, werden es mögen, weil Es gibt viele Verweise auf diese Sprache und können verglichen werden.

Neben Beginning Scala habe ich auch die Scala School-Lektionen von Twitter gelesen. Für alle Lektionen gibt es eine Übersetzung ins Russische, aber David Pollacks Buch wurde nur in der englischen Version gefunden.

Das Projekt Scala Exercises hat dazu beigetragen, die Theorie zu konsolidieren. Zusätzlich zu unabhängigen Reisen um die Quelle von Fels und Arbeit gibt es sehr einfache Aufgaben, aber sie eignen sich gut, um zunächst einige Aspekte zu korrigieren und zu überprüfen, ob Sie alles sorgfältig gelesen und verstanden haben.

Und ich werde Ihnen ein wenig über die häufigsten und einfachsten Dinge erzählen, die ich überhaupt verstehen musste.

Option Kurz gesagt - dies ist ein Container, in dem entweder leere (Keine, es sieht aus wie Null, hat aber Map-, Filter-, ...) Methoden oder es gibt genau einen Wert. Einige (Wert) und seine Verwendung können den Code sicherer und sicherer machen Keine NullPointerException auslösen, weil Sie möchten, Sie möchten nicht, aber Sie müssen trotzdem die sauberen Daten aus Option extrahieren. Zu diesem Zeitpunkt ist es bereits schwierig, das Ausstellen eines Schecks zu vergessen.
Natürlich hat Option eine get-Methode, aber es wird nicht empfohlen, sie zu verwenden, da in diesem Fall der gesamte Punkt von Option verloren geht, weil None.get löst eine Ausnahme aus.
Einige der offensichtlichsten Annehmlichkeiten:

Es ist einfach, den Standardwert zurückzugeben, wenn Option leer ist

 optValue.getOrElse(defaultValue) 

Im Falle einer Aktion:

 optValue match { case Some(value) => action case None => defaultAction } 

Beispiel von Scala Beginning. Der Pfad ist eine bestimmte Datenbank, die Personentypen enthält

 def findPerson(key: Int): Option[Person] 

Die Methode gibt Some [Person] zurück, wenn ein solcher Eintrag gefunden wird, andernfalls None.
Jetzt wollen wir das Alter des Benutzers per Schlüssel ermitteln.

 def ageFromKey(key: Int): Option[Int] = findPerson(key).map(_.age) 

Wir mussten nicht auf None testen und die Methode erwies sich als sehr präzise.

Mustervergleich . Am Anfang dachte ich, dass dies der gleiche Java-Switch ist und ich ihn kaum verwenden werde, aber es ist nicht so. In Scala ist dies eines der am häufigsten verwendeten Designs.

Typguss:

 obj match { case str: String => str case number: Int => number } 

Sie können zusätzliche Bedingungen hinzufügen und eine Standardaktion hinzufügen.

 obj match { case strWithA: String if strWithA.contains("a") => strWithA case negative: Int if negative < 0 => negative case zero if zero == 0 => zero case _ => defaultAction } 

Es ist äußerst praktisch, den Mustervergleich mit Fallklassen zu verwenden. Beispiel von Scala Beginning

 Stuff("David", 45) match { case Stuff("David", age) if age < 30 => "young David" case Stuff("David", _) => "old David" case _ => "Other" } 

Funktionen

In Scala sind Funktionen zunächst Instanzen, die eine bestimmte Schnittstelle oder vielmehr das Merkmal FunctionX implementieren, wobei X die Anzahl der Parameter ist und einen Wert von 1 bis 22 annimmt. In diesem Fach ist die einzige Methode aplly, die für die Funktion aufgerufen wird. Da Funktionen gewöhnliche Instanzen sind, können wir sie von Methoden und Funktionen übergeben und zurückgeben.
Beispiel von Scala Beginning. Wir übergeben in einer Antwort eine Funktion von Int an String und sie gibt das Ergebnis dieser Funktion mit Parameter 42 zurück.

 def answer(f: Function1[Int, String]) = f(42) 

oder das gleiche

 def answer(f: Function1[Int, String]) = f.apply(42) 

Eine sehr bequeme Sache sind funktionale Kombinatoren /

Belassen Sie nur positive Elemente im Array:

 arr.filter(value => value > 0) 

Ein etwas komplexeres Beispiel. Berechnen Sie die Summe der Werte der Funktion f aus den positiven Elementen der Liste. 2 Möglichkeiten, dies zu tun:

 list.filter(x => x > 0).foldLeft(0)(_ + f(_)) list.filter(x => x > 0).map(f).sum 

Und am Ende möchte ich sagen, warum ich das alles überhaupt geschrieben habe. Ich wollte niemandem Scala beibringen oder über die Sprache als solche sprechen, es gibt viele solcher Artikel im Habré und im Internet und viele sind sehr gut und nützlich. Mein Ziel war es einfach, meine Geschichte zu erzählen, die für jemanden interessant sein könnte und einigen der gleichen verlorenen Neulinge helfen und unterstützen könnte, denen das Schicksal gerade gegen diesen Felsen begegnet war. Ich wünsche dir viel Glück! Erfahrene Programmierer werden ermutigt, ihre Tipps und Meinungen in den Kommentaren zum Weg eines unerfahrenen Scala-Programmierers mitzuteilen.

Source: https://habr.com/ru/post/de446988/


All Articles