Hola Guillermo.
Voy a tratar de ser lo más breve posible.
Tené en cuenta que en todo momento estoy hablando de Smalltalk porque:
1. No manejo el resto de los lenguajes de programación mencionados en
este thread.
2. Esta es una lista de Smalltalk.
2008/9/18 Guillermo Schwarz <[EMAIL PROTECTED]>:
> Proxy: Clase que permite agregar comportamiento a otras clases sin usar
> herencia, sino usando composiciòn, de modo que la clase X preexistente
> adquiere el comportamiento del Proxy P cuando esta clase se encuentra
> envuelta en el proxy P.
No se de dónde sacaste esa definición; pero, como dijo Hernan
Wilkinson, parece la definición de (el pattern) decorator.
Un proxy (instancia) es un objeto ("A") que se pone en lugar de otro
("B") y que su única función es hacerle llegar los mensajes que recibe
(o sea, se los reenvía a "B" de alguna forma).
No agrega comportamiento, no compone.
> Trait: Clase que permite agregar comportamiento a otras clases sin usar
> herencia, sino usando composiciòn, de modo que las clase X es creada como un
> trait T del cual se extiende y se redefninen algunos de sus mètodos.
>
> Estoy diciendo que un trait es una clase, y esto lo hago solamente porque
> asumo que estoy usando proxies para implementar Traits. No es necesariamente
> asì porque los traits se pueden implementar con ayuda del compilador y
> convertirse en objetos de primera clase al igual que las clases. Da lo
> mismo, reemplaza clase por objeto y la definiciòn sigue funcionando. No big
> deal.
(En esta parte hablo sobre lo que entendí hasta ahora, no soy ningún
experto en Traits).
Un trait no es una clase porque no tiene sentido hablar de instancias.
Un objeto es atributos + comportamiento, es lo primero que se dice. Un
trait no tiene atributos.
Por ejemplo, si en un sistema que persiste objetos en una base
relacional, se puede hacer un trait con las funciones para persistir a
los objetos, de forma que todos entiendan los mensajes para
persistirse. No tiene sentido hacer "Trait new guardateEnLaBase",
primero porque no es una clase, pero suponiendo que en tu hipotética
implementación lo fuera, #guardateEnLaBase no tendría sentido porque
el trait en sí mismo no tendría nada util para persistir: no hay
atributos.
Ahora que me acuerdo, una vez leí de reojo en el colectivo un apunte
que me parece que es el mismo concepto, y dado que al menos el apunte
hablaba de Java, a vos quizá te sirva para entender de que hablamos:
Aspect-oriented programming
<http://en.wikipedia.org/wiki/Aspect-oriented_programming> [1].
[...]
> ¿un trait puede hacer "self doSomething" y ejecuutarlo adecuandamente
> sin generar "sorpresas" para el programador?
Un trait no puede hacer "self doSomething" porque un trait no tiene
self. Una instancia de una clase con cierto trait puede hacer "self
doSomething".
Volviendo a mi ejemplo de la persistencia, el trait va a estar
conformado por métodos relativos a la persistencia.
A mi entender, si se está trabajando bien, por ejemplo Perro no va a
tener un método #isStillInDB ni ningún método que envíe este mensaje;
y el trait de persistencia no va a tener un método #ladrar ni ninguno
de sus métodos va a enviarlo. Son cosas que no se cruzan y por lo
tanto no hay sorpresas.
Por supuesto, siempre se va a poder programar mal y va a ser igual que
cuando ClaseA implementa #metodo y ClaseB que hereda de A lo redefine
y ClaseC que hereda de B necesita la implementación original. El que
hace las cosas mal no le puede echar la culpa a la herencia ni a los
traits.
Bueno, me extendí mucho más de lo que pensaba.
Espero haberte aclarado un poco el panorama, y sobre todo espero no
haberme mandado cualquiera.
[1] Cuando estaba leyendo la página de Wikipedia vi que en la sección
que compara con otros paradigmas
<http://en.wikipedia.org/wiki/Aspect-oriented_programming#Comparison_to_other_programming_paradigms>
dice que AOP está muy relacionado con Mixins, y vos habías dicho que
es muy fácil implementar mixins con proxies. Claramente la definición
que vos tenés de proxy no es la que di yo. En conclusión, toda esta
discusión se armó porque estaban hablando dos idiomas diferentes. Put
on The Lord all.
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
http://www.clubSmalltalk.org
-~----------~----~----~----~------~----~------~--~---