Ich habe vor kurzem mehr Scala Fragen gesehen (z here, here und here), die für die Verwendung von Proxies genannt, und es kam mehr als einmal in meiner eigenen Arbeit. Die Scala-Bibliothek hat eine Reihe von Proxy-Merkmalen (14, wenn ich richtig gezählt habe).Proxies/Delegierten in Scala
Proxy-Klassen/Merkmale in der Regel eine Menge Text enthalten:
class FooProxy(val self: Foo) extends Foo {
// added behavior
def mymethod = ...
// forwarding methods
def method1 = self.method1
def method2(arg: String) = self.method2(arg)
...
}
trait Foo {
def method1: Unit
def method2(arg: String): Unit
}
Mein erster Gedanke ein Proxy[T]
Merkmal zu definieren war, die verwendet werden könnten, wie folgt:
class FooProxy(val self: Foo) extends Proxy[Foo] {
// added behavior
def mymethod = ...
}
wo trait Proxy[T] extends T
. Natürlich ist es nicht möglich, das Merkmal Proxy
ohne Compiler-Magie zu definieren.
Mein nächster Gedanke war, nach einem Compiler-Plugin zu suchen (eine solche Fähigkeit ist eindeutig nicht im vorhandenen Compiler, oder die Quellen für diese 14 Proxy-Merkmale wären viel kleiner). Sicher genug, ich fand Kevin Wright's AutoProxy plugin. Das Plugin soll ordentlich das Proxy-Problem lösen, zusammen mit anderen Anwendungsfällen (einschließlich dynamischem Mixins):
class FooProxy(@proxy val self: Foo) { ... }
Leider sieht es aus wie Arbeit auf mich im November (2009) ins Stocken geraten. Also, meine Fragen sind
- Gibt es kontinuierliche Arbeit am AutoProxy-Plugin?
- Wird dies in den Compiler finden?
- Werden andere Ansätze in Betracht gezogen?
- Schließlich weist dies auf eine signifikante Schwäche in Scala hin? Wäre es nicht möglich, bei lisp-artigen Makros ein
Proxy
Merkmal zu definieren?
Eigenschaften können keine Parameter haben. Schlägst du vor, dass sie hinzugefügt werden? Außerdem haben Sie nichts gezeigt, das nicht durch Hinzufügen einer impliziten Konvertierung behoben werden kann. Ist der Vorschlag, dass eine implizite Konvertierung erstellt wird, überflüssig? –
"Traits können keine Parameter haben": dummer Fehler, behoben. –
Implizite Konvertierungen lösen ähnliche Probleme, sind aber nicht immer geeignet (warum würden die EPFL-Leute so viele Proxies in die Scala-Bibliothek aufnehmen?). Zum einen verursachen sie mehr Aufwand als die Delegierung. Zweitens kann eine umfangreiche Verwendung der impliziten Konvertierung die Wartbarkeit/Lesbarkeit beeinträchtigen. –