[Zope3-dev] what is ZCML?

Martijn Faassen faassen at infrae.com
Wed Mar 15 08:42:09 EST 2006


Jim Fulton wrote:
> Martijn Faassen wrote:
[snip]
>> I appreciated you making it explicit, Shane, even though I already 
>> knew and fully agree. :)
>>
>> I sometimes express this principle as "magic is bad unless it's 
>> perfect magic". Do post it on your blog.
> 
> 
> Yes, it is a good thing to know, except that it is incomplete and
> obscures an important point.  Magic always has the downside that it
> hides things.  Often, as in the case of garbage collection, the benefit
> outweighs the cost.  Too often though, people introduce magic
> (aka abstraction, indirection, automation) when the benefit doesn't
> justify the hiding.  One should always approach magic with skepticism.

Agreed. That's why magic in software has a bad reputation. But it's not 
bad if it works almost invisibly.

> This is an important design principle.  The "explicit is better than
> implicit" is a guide, not a rule never to be broken.  It's something we
> should start with.  Does that mean we never provide automation? Of
> course not.

I suspect we're in a state of violent agreement here. :)

What you say about this in part depends on who you're talking to. 
Repetition of code is generally bad. Many programmers don't abstract 
*enough* and copy & paste code all over the place. We don't want to make 
them more wary of automation.

To go to a related but slightly different topic:

One form of abstraction I'm still grasping for in Zope 3 is support for 
coarse-grained components. When I have a whole bunch of (local) 
utilities, content objects, views, permissions and the like that work 
together, tied together with quite a bit of ZCML, I'd like to be able to 
reuse that more easily in an application. Right now the only way to 
reuse code like that I can find is to copy it and modify it, but that's 
wrong - it'd like to be able to use all that code from my application 
without having to copy or modify it.

For instance, for an application I needed a user and group management 
system with a ZODB user interface. This uses the catalog, defines a 
number of content objects and adds a bunch of views. Extracting this 
functionality from the application turned out harder than I'd like it to 
be. And then I haven't figured out yet how to reuse it without having to 
copy and modify code...

Are there patterns to do this in current Zope 3? Part of the problem is 
a dependency on local utilities - I believe the new local utility 
registration API you're working on should help there. For the rest, I 
guess I could just copy and rewire the ZCML, but that is quite a bit of 
work and failure-prone. I could also invent a ZCML statement with a much 
higher level of abstraction that takes the place of dozens of lower 
level statements, but people argue against this rather a lot. What other 
strategies could I employ?

Regards,

Martijn


More information about the Zope3-dev mailing list