[Python-Dev] Thoughts on validation, events, rules

Jim Fulton jim at zope.com
Sun Aug 8 15:53:46 CEST 2004


I'm a bit unsatisfied with container constraints:

   http://dev.zope.org/Zope3/ContainmentConstraints

While I think this was a step forward conceptually, it has turned out
to be a bit unwieldy in practice:

- Container constraints are difficult to express.  I've written
   convenience API's to make the basic machinery of expressing
   constraints easier, but there is a problem that's not so easy to
   fix.  Often you want to express a symmetric constraint between two
   interfaces.  For example, you want to say that objects implementing
   I1 can only contain objects implementing I2 and that objects
   implementing I2 can only be contained in objects implementing I1.
   If the constraint is expressed in the interfaces themselves, you can
   only express it by either defining the interfaces in a single
   operation or by mutating the interfaces.  I don't like the idea of
   mutating interfaces, but perhaps I just need to get over that.

- Container constraints are cumbersome to check.

- Container constraints force the contained objects to implement
   IContained. This is fine when the contained objects will actually
   access their containers.  Often, however, we want to constrain an
   object's container for external reasons.  For example, we might want
   to only allow indexes to be added to catalogs, even though indexes
   are passive and never invoke operations on their containers. In this
   case, the constraint is not part of the index's contract.

I've been thinking of other ways to solve this problem.

In the context of schema validation, we've been thinking of using
subscription adapters:

   http://dev.zope.org/Zope3/NoMoreSchemaBinding

   http://mail.zope.org/pipermail/zope3-dev/2004-June/011315.html

The advantage of subscription adapters is that they provide the
ability to express constraints in a highly flexible and decentralized
manner.  Another advantage of using subscription adapters is that
doing so takes advantage of a highly optimized mechanism and should be
fairly efficient.

It occurred to me today that subscription adapters provide a form of
rule-based processing.  Any number of rules (subscribers) can fire as
the result of some event, where an event could take the form of a
query, such as "validate adding this object to this container" or
"validate setting this attribute to this value".

It's interesting to note that validating adding an object to a
container and validating assigning an attribute are both special cases
of validating establishing a relationship between two objects.

Jim

-- 
Jim Fulton           mailto:jim at zope.com       Python Powered!
CTO                  (540) 361-1714            http://www.python.org
Zope Corporation     http://www.zope.com       http://www.zope.org



More information about the Python-Dev mailing list