[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