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

Bernd Dorn zope-mailinglist at mopa.at
Wed Mar 7 02:03:51 EST 2007


On 07.03.2007, at 01:32, Christophe Combelles wrote:

> 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

this is not true an object can implement many interfaces so why  
shouldnt it be possible to assign many subclasses of IInterface (or  
did i m iss something?), use alsoProvides, not directlyProvides

>
> 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?

use the name attribute, skins in zope work the same way

>
>
>
>> 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
>
> _______________________________________________
> 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