[Zope3-Users] Design question (object or interface for category implementation?)

Christophe Combelles ccomb at free.fr
Tue Mar 6 19:32:51 EST 2007


Bernd Dorn a écrit :
> 
> On 06.03.2007, at 18:54, Christophe Combelles wrote:
> 
>> Hi,
>>
>> I'm playing again with the notion of categories of objects.
>>
>> I have two main goals:
>> ---------------------
>> 1) I must let the user choose the category of an object added to the 
>> zodb. For this, I must be able to retrieve the list of categories and 
>> present them in a form field managed by a vocabulary (or in a 
>> different manner).
>> 2) I must have different behaviours for categorized objects:
>> objects of different categories would have different views, different 
>> addMenuItems (if they are containers), etc.
>>
>> the first requirement would tell me to define categories as objects, 
>> while the second one would tell me to define them as interfaces.
>>
>> The possible solutions I see:
>> ----------------------------
>>
>> 1) The simplest solution is to store the categories as text strings 
>> into the annotations of the object. So categories actually are just tags.
>>
>> 2) The second solution is to do the same, but replace text strings 
>> with category objects, that implement ICategory. And categories can be 
>> stored separately in a category container, or in a registered utility 
>> that gives the list of available categories. This is a bit better, but 
>> this way I don't know how to easily let my categorized objects behave 
>> differently according to their categories.
>>
>> 3) The third solution is to define categories as interfaces extending 
>> ICategory. I can retrieve the list of categories with 
>> ICategory.dependents
>> But to present them in a form, I must have a pretty name for each 
>> interface. Should I store them in a Tagged Value?
>>
>> 4) The fourth solution I see, is to define an interface type, 
>> ICategoryType, extending IInterface just like IContentType. Then my 
>> categories would be interfaces whose type is ICategoryType. But with 
>> IContentType, is there a way to retrieve the list of all available 
>> content types?
> 
> imho 4) is the best solution, just take a look at zope.app.content to 
> see how to get the vocabulary and the inspection implementation of objects
> 
> you can then set the interface on objects by using 
> zope.interface.alsoProvides

But with 4), I guess I won't be able to assign two categories onto an object,
An object can have only one ContentType

I feel that 3) is easier, but I don't know how to assign an retrieve a display 
name to interfaces.

A real example is the following:
-------------------------------

I want to define objects that represent Companies.
A company can be either a client, or a provider, or both,
or in the future it could be of another type.

When the user creates a company, it must choose "client", "provider", or both.
The choice would assign a different interface to the object:
IClient, or IProvider, and this would lead to different views for these objects.

So "client" and "provider" are categories of companies.

So I would tend to have:

class ICompany(Interface)

class IClient(ICompany)

class IProvider(ICompany)

This is simple, but now how do I assign a name to these interface, so that the 
user will choose between "Client" and "Provider", and not between "IClient" and 
"IProvider"?
Is it feasible with Tagged Value ?  Or with the "name" attribute in the 
zope:interface ZCML declaration?



> 
> regards, Bernd
> 
>> Do you have some advice on the subject?  Am I asking the wrong 
>> questions? Is there an obvious solution I've not seen? Am I going too 
>> far and should I rather keep it simple and stupid?
>>
>>
>> regards,
>> Christophe
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Zope3-users mailing list
>> Zope3-users at zope.org
>> http://mail.zope.org/mailman/listinfo/zope3-users
> 
> 
> 



More information about the Zope3-users mailing list