Vorwort

Dies ist ein Online-Tutorial über die Programmiersprache Scala. Es richtet sich an Entwickler mit Erfahrungen aus imperativen Sprachen (z.B. Java, C#, PHP), denen die funktionale Seite der Softwareentwicklung bisher noch nicht über den Weg gelaufen ist.

Zu Beginn möchte ich ein paar Worte verlieren, damit ihr erfahrt was euch hier erwartet.

Scala hat es schwer außerhalb der eigenen Reihen anerkannt zu werden. “Scala ist zu komplex”, “eine akademische Spielerei”, “für den professionellen Einsatz nicht zu gebrauchen”. Diese und andere Äußerungen hört man immer wieder wenn es darum geht den Leuten Scala näher zu bringen. Und mittlerweile kann ich es echt nicht mehr hören. Ich hab mir deshalb gedacht, dass es vielleicht etwas bringt ein etwas anderes Scala-Tutorial zu erschaffen:
Eines, das sich mehr auf dem Umstieg von der imperativen zur funktionalen Programmierung richtet. Ich möchte hier kein Code zeigen in dem es darum geht wie überlegen die Sprache allen anderen gegenüber doch ist. Das geht meist nach hinten los und führt zu den schon oben genannten Aussagen. Davon hat niemand was. Weder die Scala-Community, die neue Benutzer gewinnen möchte, noch Entwickler, denen man die Sprache näher bringen möchte.

Ich glaube, dass man deutlich mehr Menschen von Scala überzeugen kann wenn man ihnen erst zeigt, dass sie mit Scala all das machen können was sie auch in imperativen Sprachen machen können. Dabei kann man die Vorzüge von Scala kennen und lieben lernen und wenn man dann endlich meint, dass es nicht mehr besser geht, werden einem die Türen zur funktionalen Programmierwelt gezeigt. Ich kann niemanden abnehmen durch diese Türen auch durchzugehen – ich kann aber den Weg erleichtern der dorthin und tief hinein führt.

Ich möchte vorweg noch darauf hinweisen, dass ich mich nicht zu lange an Kleinigkeiten aufhalten möchte – ich spreche ganz klar fortgeschrittene Entwickler an, denen man nicht mehr erklären muss was Abfragen, Schleifen und Klassen sind. Dennoch möchte ich die komplette Scala-Welt durchlaufen und anhand von vielen Beispielen zügig zeigen wie Scala und dessen Bibliotheken funktionieren.

Ich werde versuchen den imperativen “Way of Life” so gut es geht nach Scala zu übertragen und wenn die Zeit reif ist nach und nach zu zeigen wie unterschiedliche Probleme mit funktionalen Codes gelöst werden können. Vor allem möchte ich aber versuchen klar zu machen, dass imperative Lösungen in Scala zwar durchaus funktionieren, dass man durch die funktionale Programmierung aber noch mal eine zusätzliche Abstraktionsschicht erhält, die es erlaubt viele Probleme sehr elegant und mit wenig Code zu lösen.

Nachdem dies geklärt ist ein kleines Vorwort zum funktionalen Programmieren:

In der funktionalen Programmierung geht es mehr um das “Was” als um das “Wie”. Angenommen man hat eine Liste mit Werten, aus der die Summe der Werte ermittelt werden soll, die ein bestimmtes Kriterium erfüllen. Eine Vorgehensweise dieses Problem zu lösen könnte bspw. so aussehen:

  1. Durchlaufe die Liste
  2. Prüfe jedes Element ob es ein Kriterium erfüllt
  3. Addiere den Wert des Elements zu einem Zähler falls das gewünschte Kriterium erfüllt wird

In Java könnte man das ganze etwa so lösen:

int geSumOfOdds(List<Integer> list) {
  int sum = 0;
  for (Integer i : list) {
    if (i%2 != 0) {
      sum += i;
    }
  }
  return sum;
}

Durchaus verständlicher Code aber zuweilen ein wenig umständlich – es wird eben beschrieben wie genau vorgegangen werden soll. Wenn man sich aber auf das “Was” konzentriert, also was soll der Code machen, dann kann man Code schreiben, der mehr nach der obigen Aufzählung arbeitet:

def sumOfOdds(xs: List[Int]) = xs filter { _%2 != 0 } sum

Auf den ersten Blick sieht dieser Code für jemanden, der des Funktionalen nicht mächtig ist, sehr kompliziert aus. Viele unterschiedliche Klammertypen und jede Menge Gebrauch von Sonderzeichen und noch dazu irgendwelche Funktionsaufrufe bei denen man erst nicht versteht was sie eigentlich machen. Dabei ist es eigentlich so einfach. Die Liste, die an die Methode übergeben wird wird durch die Methode filter durchlaufen und wie der Name suggeriert werden alle Elemente heraus gefiltert, auf die das Kriterium nicht zutrifft. Das Kriterium befindet sich in dem Fall in den geschweiften Klammern. Nach dem Filtern werden die übrig gebliebenen Elemente mit der Methode sum zusammengezählt.

Für den Anfang ist der Scala-Code schwer verständlich, das gebe ich zu. Das obige Beispiel sollte aber auch mehr der Veranschaulichung dienen was möglich ist und wo es hingehen soll. Für den Moment braucht euch die genaue Funktionsweise des obigen Codes noch nicht zu interessieren. Für den Anfang werde ich versuchen, zuerst auf imperative Vorgehensweisen einzugehen bevor ich irgendwann damit anfangen werde, euch Leser, mit funktionalem Code zu erschlagen. Das obige Beispiel ließe sich in Scala z.B. auch so schreiben:

def sumOfOdds(xs: List[Int]): Int = {
  var sum = 0
  for (x <- xs)
    if (x%2 != 0)
      sum += x
  sum
}

Sieht doch fast wie der Java-Code aus, oder nicht?

In dem Sinne bleibt mir nur zu sagen: Viel Spaß beim Lesen!

10 comments so far

  1. Heiner on

    Hallo, vielen Dank für dieses Tutorial! Gibts das für Papierleser wie mich auch auf PDF oder als HTML Singlepage zum ausdrucken?

  2. antoras on

    Nein, die Inhalte sind leider nicht “zusammengepackt” verfügbar. WordPress unterstützt von Haus aus keine PDF-Erstellungs Option, weshalb ich das von Hand machen müsste. Das habe ich bisher aber noch nicht getan, da ich dazu alle Inhalte mühselig z.B. nach LaTeX überführen müsste.

    • Heiner on

      Hier gibts eine Anleitung, um alle Blogs chronologisch auf einer Seite anzuzeigen, das könnte doch eine Lösung sein, diese Seite könnte man dann drucken: http://www.texto.de/wordpress-als-cms-printausgabe-statische-seite-518/

      • antoras on

        Danke für den Hinweis, aber die Inhalte sind direkt auf den Servern von WordPress gehostet und dort ist es mir nicht erlaubt kostenfrei Plugins zu installieren oder Änderungen am bestehenden Code vorzunehmen. Deshalb sehe ich momentan keine Möglichkeit die Inhalte auf einer einzigen Seite verfügbar zu machen.

  3. Klaus N. on

    Tut mir leid aber “Tutorial” sieht anders aus.
    Ist “sum” nun eine Methode wie zum ersten Scala-Beispiel geschrieben oder eine einfache Variable vom Typ int? Was macht “sum” für sich alleine stehend im zweiten Beispiel?

    Es bleibt zu viel unklar und wird auch gar nicht erklärt.
    Wenn man Scala kennt sicher kein Problem, dann brauche ich aber auch kein Tutorial.
    :-(

    • antoras on

      Hi Klaus, das Codestück, das du meinst, ist so angelegt, dass man es nicht verstehen _soll_, wenn man noch keine Erfahrung in Scala oder in einer anderen funktionalen Programmiersprache hat. Ziel ist es zu zeigen wie kurz und aussagekräftig der Code ist, wenn man ihn denn erst mal versteht.

      Tut mir Leid wenn das falsch rüber kam und ich hoffe, dass dich das jetzt nicht komplett abgeschreckt hat und dich nun daran hindert weiterzulesen. In den weiteren Teilen kommen, so weit ich mich erinnern kann, solche Beispiele nicht mehr vor – zumindest hatte ich nicht mehr vor welche zu bringen. Dies ändert sich erst bei den Artikeln über funktionale Programmierung, die bis jetzt aber noch nicht ganz fertig gestellt sind.

      Vielen Dank für die Kritik, ich hoffe mir gelingt es dieses Missverständnis auszumerzen. Ich werde mir den Artikel nochmal angucken und überlegen wo eine kleine Überarbeitung notwendig ist.

  4. Klaus N. on

    Ein kurzer Hinweis, dass der angegebene Code tatsächlich nur als Beispiel zur Ansicht gedacht ist, noch gar nicht zum Verstehen/ Nachvollziehen würde tatsächlich helfen und Deine Intention klarer machen.

    • antoras on

      Habe ich nun dahingehend abgeändert.

  5. Klaus N. on

    So wird das ganze wirklich klarer. Vielen Dank für die schnelle Reaktion!

  6. Heiko on

    Ich bin eben das erste mal auf die Seite gekommen. Gefaellt mir sehr.


Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ photo

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.

%d Bloggern gefällt das: