[Zope-dev] Michel's Reply

Michel Pelletier michel@digicool.com
Fri, 20 Oct 2000 14:05:20 -0700


Toby Dickenson wrote:
> 
> On Fri, 20 Oct 2000 12:54:19 +0100, Chris Withers <chrisw@nipltd.com>
> wrote:
> 
> >>Consider the following passage in the documentation:
> 
> Noooooo - Context-based instance-space applications are a major source
> of pain, bugs and security holes. They might be the one thing that
> Zope does different (and therefore they need to be explained) but that
> doesnt make them right.

I'm not sure I grok what rightness has to do about it.  I think this is
right, to me wrong == broken.  This is not broken.
 
> 
> Thats fine until:
> 
> * someone adds an property named feed to an object at an intermediate
> location in the containment heirarchy. This breaks the cron job that
> calls self.Zoo.Diet.LargeAnimals.hippo.feed(), and all the hippos
> starve.

This is the classic anti-acquisition argument, but it's a red herring. 
The same argument applies to inheritance; introducing an attribute
between two classes in a generalized relationship and your app breaks
and all the hippos starve anyway.  Zope cannot be robust against
programmer error.  Nothing can.
 
> * someone uses self.Zoo.Diet.buildings.visitor_reception.feed(), and
> ends up filling the reception with hippo food. (This might even be
> possible for someone who has no permissions on the reception object)

This is once again programmer error.
 
> * someone wants to have a dinner party; feeding more than one animal
> at once. But then he finds he has to switch to a different technique
> because he cant call his dinner_party() method with more than one
> context at the same time.

Can you explain this some more?  I'm a bit lost on how this invalidates
context vs. containment when binding methods.  You're right, you can't
have more than one context at a time, but neiter can you be bound to
more than one container.  If you want to feed more than one animal, use
a loop and iterate over them.

> * someone uses
> self.Zoo.buildings.office.printers.laserjet1.Zoo.Diet.LargeAnimals.hippo.feed(),
> and ends up feeding paper to the hippo. (that could even be someone
> who has no other permisions on that hippo object)

This is the same as your first two arguments: programmer error.
 
> Ive now nearly finished converting all my newbie zope projects back to
> a conventional O-O design. I have been bitten by all the problems
> listed above. The feed method *should* *be* implemented in a ZooAnimal
> base class.

Ok, that's a valid approach.

-Michel