martes, 5 de agosto de 2008

Visitors en la presentación de la ECI

Hay varios que me preguntaron sobre el test de los visitors que mostré en la presentación de la ECI. En otro post de este blog ya había hablado del tema, el link es: http://objectmodels.blogspot.com/2007/10/cmo-asegurar-la-evolucin-de-un-sistema.html

En si, el código del test es el siguiente:

testVisitorsImplementVisitorProtocol

| acceptingVisitorsRoots visitorProtocols visitorImplementors invalidVisitorImplementors |

acceptingVisitorsRoots := MCPAcceptingVisitorRootFinder allAcceptingVisitorRoots.

visitorProtocols := acceptingVisitorsRoots collect: [ :anAcceptingVisitorRoot |
MCPVisitorProtocol for: anAcceptingVisitorRoot ].

visitorImplementors := visitorProtocols
inject: OrderedCollection new
into: [ :implementors :aVisitorProtocol |
implementors addAll: aVisitorProtocol implementors; yourself ].

invalidVisitorImplementors := visitorImplementors reject: [ :aVisitorImplementor |
aVisitorImplementor isValid ].

self assert: invalidVisitorImplementors isEmpty

Instancias de MCPAcceptingVisitorRootFinder se encargan de buscar la raíz de una jerarquía de clases que acepta visitors. Para ello busca las clases que implementan #accept: y dada un jerarquía devuelve la clase que más arriba se encuentre en la misma.
MCPVisitorProtocol modela el protocolo que debe implementar un visitor. Lo deduce a partir de todos los mensajes que se envían en el método #accept: de una jerarquía de clases. Dado un VisitorProtocol se puede obtener todas las clases que lo implementan. Las implementaciones de un protocolo de visitor está modelado con la clase MCPVisitorImplementor que entre otras responsabilidades sabe responder si es una implementación válida de ese visitor.
Bueno, si desean más detalles de la implementación pregunten!

No hay comentarios.: