Re: [Zope-dev] Questions about implementing object models with ZPatterns

2000-11-07 Thread Phillip J. Eby

At 05:19 PM 11/1/00 +1100, Itai Tavor wrote:
>
>Ok... I think I get the "Specialist per role, not per class" part. 
>But I still can't make the jump from a class diagram to a 
>ZClass/Specialist setup.

A class diagram contains all the roles - they're the lines between the
classes.  :)

Look at it this way...  if an object has a particular association role that
it needs filled, and there is more than one kind of object that can fill
that role, then presumably those objects must all implement a certain
interface, right?  You need to create a Specialist for that interface.

In other words, there is usually one Specialist per collaboration interface
-- which is NOT a one-to-one mapping with classes, since some classes may
implement multiple interfaces, and some classes may all implement the same
interface.


>I can solve some of it by subclassing ZClasses. So, if I need 
>Customers and Resellers, I'll make a Specialist for each, and a 
>Customer and Reseller ZClasses, both subclassed from Person which 
>stores common properties for a person. This part is ok. 

What *role* do Customer and Reseller objects play in your system?  It
sounds to me like perhaps they play the role of "thing that places orders"
or "thing that orders are shipped to".  Depending on your application's
functions, you could need as many as FOUR specialists:

Customers
Resellers
BillableEntities
ShippingDestinations

Where the latter two specialists would contain a pair of Racks that mapped
back to the Customers and Resellers specialists, respectively.


>But it gets 
>more complex than that. Take this example: Every OrderLineItem object 
>can have one or more Payment objects associated with it. There are 3 
>possible payment types - Check, Charge and BankDeposit, so I make a 
>ZClass for each one, all subclassed from a general Payment ZClass. I 
>create one Payments Specialist with 3 Racks. Where do I store methods 
>that are specific to one payment type? In the Rack? I can't store 
>them in the Specialist - it would be a mess, and I can't store them 
>in the ZClass, because the ZClass doesn't know about the rest of the 
>application. 

Huh?  What do you mean by "methods that are specific to one payment type"
in this context?  What do payments do that requires knowledge of the rest
of the application?  If it's a problem-domain method, it belongs in the
ZClass.


>Actually, writing this down makes me realize that it 
>could work... would Payments.getItem(some_payment_id).someMethod() 
>call someMethod in the Rack if one exists, and the one in the 
>Specialist if not?

No.  DataSkins acquire only from the Specialist, not the Rack.  However,
you can use ClassExtenders in the Rack to provide methods to an object.
But you *can't* override methods that already exist on the ZClass.  This
should not ordinarily be an issue since you should only be doing problem
domain methods on your ZClasses anyway, and there should be no need to
override them.


>Another problem I'm having is how to store id's for different objects 
>in the the same field. In the Payments example above this is not a 
>problem, because all payments are supplied by the Payments 
>specialist. But what about another example - Customers and Resellers 
>are two totally different roles, so they each get a Specialist. the 
>Payment object has from_id and to_id fields, and each of those can 
>hold the id of a customer or reseller, or some special code to 
>indicate the store. I could add from_type and to_type fields, or I 
>could prefix the id with a code letter, but neither seem like a good 
>solution. Is there a recommended approach for solving this problem?

See above, where I mention BillableEntities and ShippingDestinations.
Having only one specialist per role means that you never have to worry
about ambiguous identities.

Please note, however, that at this stage of design you shouldn't be looking
at how the references are going to be stored.  At the abstract design
stage, you would just have "Payor" and "Payee" attributes that are the
actual related objects.  When you write your SkinScript later, you can set
up how the linkages work, using ID fields, or SQL columns, or whatever.


___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




Re: [Zope-dev] Questions about implementing object models with ZPatterns

2000-10-31 Thread Phillip J. Eby

At 12:35 PM 11/1/00 +1100, Itai Tavor wrote:
>Hi,
>
>How do I implement gen-spec classes using ZPatterns and ZClasses? 
>For example, I want to implement Person and Customer. Writing it in 
>Python, it would be easy to subclass Person to get Customer, and 
>Customer would inherit Person's properties and methods. If I instead 
>create a specialist and ZClass for each class, do I use a SkinScript 
>to remap Person's properties into Customer? And what about the 
>methods - Customer can't inherit Person's methods, so I have to write 
>methods in Customer which call the same methods in Person. This seems 
>terribly complicated... am I missing something?

If you want subclasses, just subclass ZClasses.  As for the remapping,
etc., it depends on what you want to do.  Keep in mind that Specialists are
created per *role* or *interface*, not per class.  You can have a "People"
specialist that has a personRack and a customerRack in it, for example.
Specialists are application- and usage-driven; you don't always end up
creating specialists for every class in your object model.

(By the way, note that if you have a personRack and customerRack in the
same specialist, they can share data plug-ins (such as SkinScript methods)
placed directly in the specialist.  The ranking order of the parent
plug-ins in the child racks is determined by where you place a "Link to
Parent Data Plug-Ins" in the racks' data plug-in lists.)


>Another question: In Coad's examples, if a class has an 'n' order 
>relationship to another class - say Order and OrderItems, Order would 
>contain a list of OrderItems. Each OrderItem would contain the id of 
>the Order it belongs to. It seems to me that it would be easier for 
>Order to call OrderItems.getItemsForOrder(self.id), then I don't have 
>to maintain a list in Orders, and if I add an OrderItem the Order 
>will immediately know about it without me having to call it and tell 
>it the OrderItem was added. Is there anything wrong with this 
>approach?

Nothing at all.  It's the recommended approach, actually.  This is how you
make frameworks work...  by delegating to specialists responsible for a
role in the application.  That is, instead of the Orders system having to
know anything about how order items are actually implemented, it can
delegate that function to an OrderItems specialist that could have such
things as DiscountItems, ReturnItems, and all sorts of other objects that
implement an OrderItem interface.  Similarly, rather than an Order
providing its own interface for entering an order item, the UI code can be
(should be) placed in the OrderItems specialist, and called by the Order
object's add/edit forms.

Encapsulation at its very best.  :)  That's the ZPatterns way; the tools
were specifically created to make it easy to do things the "right" way from
a seperation-of-powers standpoint.


___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




[Zope-dev] Questions about implementing object models with ZPatterns

2000-10-31 Thread Itai Tavor

Hi,

How do I implement gen-spec classes using ZPatterns and ZClasses? 
For example, I want to implement Person and Customer. Writing it in 
Python, it would be easy to subclass Person to get Customer, and 
Customer would inherit Person's properties and methods. If I instead 
create a specialist and ZClass for each class, do I use a SkinScript 
to remap Person's properties into Customer? And what about the 
methods - Customer can't inherit Person's methods, so I have to write 
methods in Customer which call the same methods in Person. This seems 
terribly complicated... am I missing something?

Another question: In Coad's examples, if a class has an 'n' order 
relationship to another class - say Order and OrderItems, Order would 
contain a list of OrderItems. Each OrderItem would contain the id of 
the Order it belongs to. It seems to me that it would be easier for 
Order to call OrderItems.getItemsForOrder(self.id), then I don't have 
to maintain a list in Orders, and if I add an OrderItem the Order 
will immediately know about it without me having to call it and tell 
it the OrderItem was added. Is there anything wrong with this 
approach?

TIA,

Itai
-- 
Itai Tavor"Je sautille, donc je suis."
C3Works[EMAIL PROTECTED]  - Kermit the Frog

"If you haven't got your health, you haven't got anything"


___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )