J'ai vu plusieurs questions Scala récemment (par exemple here, here, et here) qui appelaient à l'utilisation de proxies, et cela est apparu plus d'une fois dans mon propre travail. La bibliothèque Scala a un certain nombre de traits de substitution (14, si j'ai compté correctement).Proxies/délégués dans Scala
classes Proxy/traits contiennent généralement beaucoup de passe-partout:
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
}
Ma première pensée a été de définir un trait Proxy[T]
qui pourrait être utilisé comme suit:
class FooProxy(val self: Foo) extends Proxy[Foo] {
// added behavior
def mymethod = ...
}
où trait Proxy[T] extends T
. Bien sûr, il n'est pas vraiment possible de définir le trait Proxy
sans la magie du compilateur.
Ma pensée suivante était de chercher un plugin compilateur (une telle capacité est clairement pas dans le compilateur existant ou les sources de ces 14 traits de proxy serait beaucoup plus faible). Effectivement, j'ai trouvé Kevin Wright's AutoProxy plugin. Le plugin est destiné à résoudre le problème de proxy soigneusement, ainsi que d'autres cas d'utilisation (y compris mixins dynamiques):
class FooProxy(@proxy val self: Foo) { ... }
Malheureusement, il semble que le travail sur elle en Novembre au point mort (2009). Donc, mes questions sont
- Y a-t-il un travail continu sur le plugin AutoProxy?
- Est-ce que cela trouvera son chemin dans le compilateur?
- D'autres approches sont-elles envisagées?
- Enfin, cela montre-t-il une faiblesse significative dans Scala? Après tout, ne serait-il pas possible de définir un trait
Proxy
donné des macros de style lisp?
Les caractères ne peuvent pas avoir de paramètres. Proposez-vous qu'ils soient ajoutés? De plus, vous n'avez rien montré qui ne puisse être corrigé avec l'ajout d'une conversion implicite. La proposition de créer une conversion implicite est-elle inutile? –
"Les caractères ne peuvent pas avoir de paramètres": erreur stupide, corrigé. –
Les conversions implicites résolvent des problèmes similaires, mais elles ne sont pas toujours appropriées (sinon pourquoi les gars de l'EPFL incluraient-ils autant de proxies dans la bibliothèque Scala?). Pour un, ils encourent plus de frais généraux que la délégation. Deuxièmement, l'utilisation extensive de la conversion implicite peut nuire à la maintenabilité/lisibilité. –