Visitor pattern and separating iteration

Karsten Wutzke kwutzke at web.de
Thu Jul 22 07:03:05 EDT 2010


Hello,

I'm referring to

http://groups.google.com/group/comp.lang.python/browse_thread/thread/4f9ba9816fe4fd55#

I'm currently implementing what looks like a promising solution. I
have one problem though. My code generator isn't awfully complex, but
still I have problems trying to figure out where to put the iteration
code. Ideally, this should be in the classes the generator operates
on. Take the following Python code from my generator class:

    def handleMethod(self, method):

        # generate indent depending on object depth in tree
        indent = self.generateIndent(method)

        # "public final"
        modifierString = ""

        i = 0

        for modifier in method.getModifiers():
            if i > 0:
                modifierString += " "
            modifierString += modifier

            i += 1

        # "String firstName, String lastName"
        parameterString = ""

        i = 0

        for parameter in method.getParameters():
            if i > 0:
                parameterString += ", "
            parameterString += parameter.getType() + " " +
parameter.getName()

            i += 1

        code = indentString + modifierString + " " +
(method.getReturnType() is None and "" or method.getReturnType() + "
") + method.getName() + "(" + parameterString + ")"

        code += "\n{"

        # here the statements should go

        code += "\n}"

        return code

The place where the statements should go would require an iteration
over the statements. When looking at other code samples, you often see

def accept(self, visitor):
    for child in self.getChildren():
        child.accept(visitor)

    visitor.visitMyClass(self)

Now, I am wondering how separation of iteration and actual code
generation can be done in my situation.

def accept(self, generator):
    for child in self.getChildren():
        child.accept(generator)

    generator.handleMethod(self)

I could of course add a parameter to handleMethod which would be the
generated code for the statements, but is that design of any good use
then? I'm rather tempted to ditch the idea of separating iteration and
code generation, but then the use of the visitor pattern becomes more
and more questionable.

What is it I'm missing?

Karsten



More information about the Python-list mailing list