Was ist ein guter Anwendungsfall für Scala? [geschlossen]

8

In einem aktuellen Projekt haben wir den Build so eingerichtet, dass wir Java und Scala mischen können. Ich möchte mehr Scala in unserer Codebasis verwenden, um den Code lesbarer und prägnanter zu machen. Lernen Sie dabei auch die Sprache, indem Sie reale Funktionen übergeben.

Daher plane ich, Scala für einige Klassen zu verwenden, um seine Vorteile zu demonstrieren und andere Entwickler davon zu überzeugen, sich auch mit Scala zu befassen.

Für einen rastbasierten Webserver oder ein Programm im Allgemeinen, welche Art von Codestrukturen eignen sich für den funktionalen Programmierstil von Scala.

Usman Ismail
quelle
7
-1: Ich bin alle dafür, neue Sprachen zu lernen ( insbesondere Sprachen, die heutzutage funktionaler sind) ... aber nach einem Grund suchen, eine andere Sprache und ein anderes Paradigma in den Produktionscode zu mischen ? Das ist ein Nein Nein. Entscheiden Sie sich für ein persönliches Projekt oder eine separate App / ein Dienstprogramm / ein Tool, die bzw. das das Management abmeldet ... höchstens.
Steven Evers
1
Das Projekt befindet sich in der Pre-Alpha-Phase und wir haben ein Mandat zum Experimentieren.
Usman Ismail
2
@SnOrfus: "Das ist ein Nein Nein.": Ich sehe es als eine gute Möglichkeit, mit Legacy-Code zu arbeiten (anstatt auf die nächste abwärtskompatible Überarbeitung der Sprache zu warten, in der der Legacy-Code geschrieben ist).
Giorgio
2
Das Anfordern einer Liste von Dingen (wie Klassen und Anwendungsfällen) passt im Allgemeinen nicht zu dieser Site. Ich denke, Sie haben dort eine gute Frage. Vielleicht möchten Sie versuchen, es neu zu formulieren.
Karl Bielefeldt
1
Wenn Ihre Anwendung häufig Parallelität und Kommunikation verwendet, sollten Sie sich akka.io ansehen . Versuchen Sie andernfalls, ein Beispiel zu schreiben, in dem Sie Sammlungen mit komplexen Transformationen wie Filtern, Falten und Zuordnen stark nutzen. Dafür kann Scala viel prägnanter sein als Java.
Giorgio

Antworten:

4

Ein typisches Beispiel, wenn Sie die Prägnanz des Funktionscodes veranschaulichen möchten, könnte Sammlungen und deren Operationen verwenden. Betrachten Sie beispielsweise eine Klasse Customerund eine Methode, die aus einer Kundenliste eine sortierte Liste von Kundennamen erstellt.

Hier ist die Java-Implementierung:

class Customer
{
    String name;

    ... // Other attributes.
}

List<String> sortedCustomerNames(List<Customer> customers)
{
    List<String> names = new ArrayList<String>();

    for (Customer customer : customers)
        names.add(customer.name);

    Collections.sort(names);

    return names;
}

Scala-Version:

class Customer(val name: String, /* ... other attributes */)

def sortedCustomerNames(customers: List[Customer]): List[String] =
  customers.map(c => c.name).sorted

HINWEIS

Die Prägnanz in Bezug auf Tastenanschläge ist nicht immer ein gutes Maß für die Codequalität und Wartbarkeit.

Außerdem würde ich im Allgemeinen nicht raten, von Java zu Scala zu wechseln, nur weil Scala neuer ist. Wenn die meisten Teammitglieder mit Java besser vertraut sind, ist das Team mit Java viel produktiver als mit Scala (oder einer anderen Programmiersprache, die sie nicht gut kennen).

Ich lerne Scala seit ungefähr zwei Jahren in meiner Freizeit und habe erst kürzlich (nach dem Besuch eines Online-Kurses) das Gefühl, dass ich in Scala produktiver sein kann als in Java. Bevor ich diesen Punkt erreicht habe, hätte ich nicht in Betracht gezogen, Scala für die Produktion zu verwenden.

Giorgio
quelle
1
Conciseness in terms of keystrokes is not always a good measure of code quality and maintainabilityBesonders beim Codieren in Perl.
Yannis
Dies ist ein gutes Beispiel für das, wonach ich gesucht habe. Ich möchte nicht alles auf einmal auf Scala umstellen, aber kleine Utility-Klassen, die offensichtliche Dinge tun, wären ein guter Anfang. thx
Usman Ismail
1
@ Usman Ismail: Eine andere Sache, die Sie sich ansehen könnten, sind Scala-Sammlungen. Ich war kürzlich sehr beeindruckt von dem, was man damit machen kann Stream: Sie können komplexe Breitensuchen zuerst in einem Lösungsraum durchführen, bis Sie auf eine Lösung stoßen (z. B. einen Pfad von einem bestimmten Objekt zu einem anderen mit bestimmten Einschränkungen finden). Ich weiß nicht, ob dies für Sie relevant ist.
Giorgio
3

Für alle, wo immer es möglich ist oder für nichts, verwenden Sie einfach Java. Auf diese Weise funktioniert dies vernünftig. Ich habe solche Experimente vor langer Zeit gemacht, aber in späteren Zeiten schreibst du alles nur aus Gründen der Klarheit in eine oder zwei Sprachen um (um einige Dinge zu behalten, wenn dies nicht in einer anderen Sprache möglich wäre).

Wenn Sie die Klasse in 2 Codezeilen als kürzer deklarieren können, ist dies kein Vorteil. Sie dürfen für diese "Funktion" keine Sprache verwenden. Zum Beispiel können Sie auch schönen Funktionscode in xxx Zeilen schreiben und yyy Zeit verbringen, und vielleicht können Sie ihn gleichzeitig im OOP-Stil in xxx + 150 Zeilen in yyy-2 Stunden Zeit mit Leistungsvorteil schreiben (wer weiß). Was ich sagen möchte ist, dass es nicht möglich ist zu sagen "dieser Teil wird auf Scala besser sein" und "dieser Teil auf Java". In der Entwicklung dürfen Sie keine Features entdecken. Meiner Meinung nach müssen Sie nur ohne Mischen entwickeln und über allgemeine Logik nachdenken, anstatt sie in Sprache X oder Y zu implementieren. Aus diesem Grund müssen Sie meiner Meinung nach aus Gründen der Klarheit und Produktivität die Sprache für das Projekt auswählen für Funktion .

cnd
quelle
Ich würde dort ein wenig anderer Meinung sein, weil es jetzt 150 weniger Codezeilen gibt, die getestet werden müssen und in denen potenzielle Fehler auftreten können.
Usman Ismail
2
Codezeilen machen überhaupt keinen Sinn. Wenn Perl-Code 5x kleiner als Python sein könnte, bedeutet dies nicht, dass es einfacher zu testen ist und weniger potenzielle Fehler enthält. Ja, es gibt einige Projekte mit gemischtem Perl und Python, aber ich sehe es nicht wirklich als cooles Feature.
CND
Ihr Standpunkt ist gültig. Schauen Sie sich jedoch Project Lombok an, um zu zeigen, wie Sie die Ausführlichkeit von Java elegant reduzieren können. Ich habe mich gefragt, ob die Funktionsmerkmale von Scala einen ähnlichen Vorteil haben. Scala ist so konzipiert, dass es im Gegensatz zu anderen funktionalen Sprachen wie erlang mit Java gemischt werden kann. Dies wäre wahrscheinlich eine bessere Option, wenn wir voll funktionsfähig wären.
Usman Ismail
1
Ich verstehe das Mischen immer noch nicht. Wenn Scala so gut für Sie ist, verwenden Sie es einfach überall in Ihrem Projekt. Das wird vernünftig sein und ich verstehe es, aber es ist meiner Meinung nach falsch, es für einige Funktionen in einigen Fällen zu verwenden. Gibt es einen Grund, das Projekt nicht einfach auf Scala umzustellen?
CND
@Ash: Vielleicht müssen sie eine Schnittstelle zu Legacy-Code herstellen? In diesem Fall befindet sich der Hauptcode in Scala und der Legacy-Code (und möglicherweise einige Schnittstellen oder Wrapper) in Java.
Giorgio
2

Ich vermute, das hängt davon ab, wie gut die Programmierer im Team sind und wie sehr sie bereit sind, neue Dinge zu lernen.

Scala ist viel prägnanter und ausdrucksvoller, aber ebenso komplexer. Jeder Programmierer, der die angebotenen Abstraktionen auf hoher Ebene gut nutzen kann, wird es mögen und darin produktiver sein und niemals wieder auf die vereinfachte Java-Ebene zurückkehren wollen. Aber ein Programmierer, der nicht gut in Abstraktionen auf hohem Niveau ist oder einfach nicht lernen will, wird es nie bekommen.

Ich denke auch nicht, dass Sie Fälle verwenden sollten, die speziell auf Scala zugeschnitten sind. Schreiben Sie einfach den Prototyp hinein und Sie werden sehen, ob er produktiver ist oder nicht. Es sollte produktiver sein, wenn alles einen Wechsel wert ist.

Und ich würde die Sprachen definitiv nicht mischen, außer Bibliotheken zu verwenden, die in den anderen geschrieben sind. Starten Sie das Prototyping in Scala, sehen Sie, wie gut es läuft, und wählen Sie das eine oder andere aus.

Jan Hudec
quelle
-2

Nach meiner (zugegebenermaßen begrenzten) Erfahrung besteht der Anwendungsfall, den ich am häufigsten gesehen habe, darin, ein Gefühl der Überlegenheit und Selbstgefälligkeit gegenüber Ihren Kollegen zu entwickeln, die tatsächlich Dinge versenden, und / oder Ihre Einschränkungen zu verbergen, indem Sie den "Antiquierten und Uneleganten" die Schuld geben. Sprache, die du "gezwungen" hast, anstelle der neuen Schärfe zu verwenden;)

ggambett
quelle
1
-1: Die funktionale Programmierung ist viel älter als Java.
Giorgio
2
Hey, das ist mehr oder weniger das gleiche Argument, das ich verwendet habe, als Java zum ersten Mal auftauchte! Aber ich war damals 17 ...
Yannis
2
Übrigens geht es bei funktionalen Programmiertechniken um den Versand von Dingen (schneller) und nicht um das Prahlen (siehe z . B. paulgraham.com/avg.html ).
Giorgio
-3? Komm schon, du kannst es besser machen. @ Giorgio, ich habe Java überhaupt nicht erwähnt, IMO ist es auch
scheiße
@ggambett: Sie haben indirekt auf Java verwiesen: In der Frage wird nach der Einführung von Scala (und seinem Funktionsstil) in einer Umgebung mit Java gefragt . Ihre Antwort vergleicht eine "antiquierte ... Sprache, die Sie verwenden müssen" (Java?) Mit der "neuen Schärfe" (Scala - funktionale Programmierung?), Dessen häufigster Anwendungsfall darin besteht, "ein Gefühl der Überlegenheit zu erlangen ..." über Ihre Kollegen ". Oder was war die genaue Bedeutung Ihrer Antwort?
Giorgio