Недавно я видел несколько вопросов по Scala (например, здесь, здесь и здесь), в котором требовалось использовать прокси, и это неоднократно возникало в моей собственной работе. В библиотеке Scala есть несколько прокси-черт (14, если я правильно посчитал).
Прокси-классы / трейты обычно содержат множество шаблонов:
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
}
Моей первой мыслью было определить черту Proxy[T]
, которую можно было бы использовать следующим образом:
class FooProxy(val self: Foo) extends Proxy[Foo] {
// added behavior
def mymethod = ...
}
где trait Proxy[T] extends T
. Конечно, на самом деле невозможно определить черту Proxy
без магии компилятора.
Следующей моей мыслью было поискать плагин компилятора (такой возможности явно нет в существующем компиляторе, иначе исходники для этих 14 свойств прокси были бы намного меньше). Конечно же, я нашел плагин AutoProxy Кевина Райта. Плагин предназначен для аккуратного решения проблемы прокси, наряду с другими вариантами использования (включая динамические миксины):
class FooProxy(@proxy val self: Foo) { ... }
К сожалению, похоже, что работа над ним застопорилась в ноябре (2009 г.). Итак, мои вопросы
- Продолжается ли работа над плагином AutoProxy?
- Попадёт ли это в компилятор?
- Рассматриваются ли какие-либо другие подходы?
- Наконец, указывает ли это на существенную слабость Scala? В конце концов, разве нельзя было бы определить
Proxy
трейт с помощью макросов в стиле lisp?
FooProxy
вList[Foo]
, его крутые украшения внезапно исчезнут. - person Aaron Novstrup   schedule 14.08.2010