Недавно я просмотрел несколько вопросов 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 прокси-характеристик будут намного меньше). Конечно, я нашел плагин Kevin Wright AutoProxy. Плагин предназначен для решения проблемы с прокси-сервером, а также с другими вариантами использования (включая динамические микшины):
class FooProxy(@proxy val self: Foo) { ... }
К сожалению, похоже, что работа над ним застопорилась в ноябре (2009). Итак, мои вопросы:
- Продолжается ли работа над плагином AutoProxy?
- Может ли это найти его в компиляторе?
- Рассматриваются ли какие-либо другие подходы?
- Наконец, указывает ли это на значительную слабость в Scala? В конце концов, не удалось бы определить черту
Proxy
с заданными макросами lisp?