W3C home > Mailing lists > Public > www-dom@w3.org > January to March 2001

Re: Type-safe iteration over the DOM in DOM 2 & 3?

From: Joseph Kesselman <keshlam@us.ibm.com>
Date: Tue, 20 Mar 2001 10:25:15 -0500
To: www-dom@w3c.org
Message-ID: <OFA1038841.3D30E623-ON85256A15.00508584@pok.ibm.com>

>I am sure it has been considered by the W3C
>to add the ability to use a visitor pattern

Yes, we did consider the Visitor pattern. It didn't seem to fit the use
cases we were considering at the time.

The Gang Of Four book says one of the indications of when to use visitor is
that you have many different interfaces intermixed and want to perform
operations that depend on the conrete classes. In our case, we have a
shared interface, Node, from which the others are subclassed, and the
nodetypes are clearly self-identifying, so this advantage is largely

Outside of coding style, there really isn't a lot of difference between
"traverse, switch, and call appropriate subroutine method" versus "visit,
accept(), and call back to appropriate subroutine method". Performance is
likely to actually be better with the switch, especially if the particular
DOM implementation is using a single class for multiple nodetypes and
switching internally to decide which behavior to apply.

Note that you could easily implement an ObjectStructure mechanism on top of
the current Traversal objects which accepted Visitor objects and dispatched
to them, with results essentially indistinguishable (for a basic DOM) from
those of implementing ConcreteElement and accept() on the nodes.

The only real difference would arise if you wanted to change the
dispatching. In the Visitor mechanism you would override that by
subclassing the nodes and changing where accept() calls back to -- which
actually is a significant DISADVANTAGE in that it risks breaking other
visitors to the same data structure. In the Traverse-and-call-back
alternative, the dispatching is encapsulated in that interface object --
and hence you can subclass that and create an extended version without
adverse affect on those operations which want to use the basic behavior.

If you've got a specific use case that the Traverse/callback approach would
not address, or if you can show that my concerns about fragility of Visitor
as behaviors are extended are unfounded,  I'm certainly willing to
reconsider this. I can see the aesthetic attraction of the Visitor pattern.
But I really think it's the wrong level of abstraction given the DOM's
design and the realities of how the DOM is being used

[DOM WG: Do we need a FAQ on this topic?]

Joe Kesselman  / IBM Research
Received on Tuesday, 20 March 2001 10:25:23 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 20 October 2015 10:46:08 UTC