[Zope3-dev] zwiki: performance of findChildren()

Max M maxm@mxm.dk
Sat, 26 Apr 2003 20:36:16 +0200


Jeremy Hylton wrote:

>class SoftwareProject(object):
>
>    developers = Relation()
>    
>    def __init__(self, name):
>        self.name = name
>
>    def __repr__(self):
>        return "%s(%r)" % (self.__class__.__name__, self.name)
>
>class Developer(object):
>
>    projects = Relation()
>    
>    def __init__(self, name):
>        self.name = name
>
>    def __repr__(self):
>        return "%s(%r)" % (self.__class__.__name__, self.name)
>    
>many2many(SoftwareProject.developers, Developer.projects)
>
>zope3 = SoftwareProject("Zope3")
>jim = Developer("Jim Fulton")
>stevea = Developer("Steve Alexander")
>
>zope3.developers.add(jim)
>zope3.developers.add(stevea)
>assert stevea in zope3.developers
>assert zope3 in stevea.projects
>

Why put the relation in the object? Isn't it better to have a container 
with different relations?

# a relation object (a graph) exists "self.relations.developers_projects"

class SoftwareProject(object):

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "%s(%r)" % (self.__class__.__name__, self.name)

    def developers(self):
        return self.relations.developers_projects.get(self)

    def add_developer(self, developer):
        return self.relations.developers_projects.relate(self, developer)


class Developer(object):

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "%s(%r)" % (self.__class__.__name__, self.name)

    def projects(self):
        return self.relations.developers_projects.get(self)

    def add_project(self, project):
        return self.relations.developers_projects.relate(self, project)


zope3.add_developer(jim)
zope3.add_developer(stevea)
assert stevea in zope3.developers()
assert zope3 in stevea.projects()