Nach dem Anschauen von Martins Keynote zu Reflection und Compilers I scheint mir diese verrückte Frage nicht aus dem Kopf zu kriegen. Martin spricht unter anderem über das "(Wedding) Cake Pattern", bei dem Eigenschaften die zentrale Rolle spielen. Ich frage mich, warum in der Welt brauchen wir Pakete, wenn wir bereits Eigenschaften haben? Gibt es etwas, das package
kann, was ein trait
(zumindest theoretisch) nicht kann?
Ich spreche nicht über die aktuelle Implementierung, ich versuche mir nur vorzustellen, wie Programmierung aussehen würde, wenn wir Pakete durch Eigenschaften ersetzen würden. In meinem Kopf wäre es so:
package
ist nicht erforderlich) package object
s Um alle meine Fragen zusammenzufassen:
Aktualisieren
Daniel Spiewak spricht in dieser Keynote über die Dependency-Injektion, die nur die Spitze des Eisbergs von all dem Zeug darstellt Sie können mit dem Kuchenmuster tun.
Martin Odersky hat gesagt, dass Scala nur mit Eigenschaften, Objekten, Methoden und Wegen auskommt (ich hoffe, ich habe etwas nicht vergessen).
Beide Klassen und Pakete sind nur da, weil Scala eine gehostete Sprache sein soll, dh eine Sprache, die läuft (das ist eigentlich nicht das interessante Bit) und arbeitet mit zusammen (das ist wichtig Punkt) eine Host-Plattform. Einige der Host-Plattformen, mit denen Scala zusammenarbeiten soll, sind die Java-Plattform und die CLI, die beide ein Konzept von Klassen und Paketen (Namespaces im Fall der CLI) haben, das deutlich genug ist, dass es nicht so einfach ausgedrückt werden kann Eigenschaften oder Objekte. Dies ist im Gegensatz zu Schnittstellen, die trivial zu und von rein abstrakten Merkmalen abgebildet werden können.
Die obige Aussage wurde in einer Diskussion über das potentielle Entfernen von Generika aus Scala gemacht, weil alles, was Generika machen können, auch durch abstrakte Typen erreicht werden kann.
In scala dienen Objekt und Paket fast demselben Zweck und Objekte werden auch Module genannt. Objekte müssen als Module betrachtet werden, da sie beliebige Definitionen enthalten können, einschließlich anderer Objekte natürlich und, im wesentlichen, Typen.
Ein Merkmal kann man sich als abstraktes Modul vorstellen. Es kann eine beliebige Definition enthalten und jedes Mitglied kann abstrakt sein, einschließlich wiederum signifikant type members. Ich rezitiere all das nur, um die Symmetrie hervorzuheben. Vielleicht scheinen OT, aber für mich, Eigenschaften eine so große Neuerung in der Scala zu sein wie die Verschmelzung von Objekt und funktionalen Ideen.
Um endlich eine Antwort zu geben:
Noch ein Kommentar: Martin spricht in seinem Video von Eigenschaften (abstrakten Modulen) mehr als von konkreten Modulen, weil letztere erst im letzten Moment erscheinen, um eine Kombination von abstrakten Modulen zu sammeln und zu vereinheitlichen.
Es ist gut, abstrakte Module zu verwenden, auch wenn Sie nicht "einen Kuchen mischen". z.B. Beim Skizzieren von Code können Sie ein Modul definieren, das Definitionen enthält. Aber sobald Sie zu einem Typ oder Wert kommen, den Sie nicht ausfüllen möchten, geben Sie keinen Dummy wie Null an. Wechseln Sie stattdessen das Objekt zu einem Merkmal und lassen Sie das Element abstrakt.
Tags und Links scala package namespaces traits