[Zope-dev] Re: ZPatterns, ObjectDomain, UML and all that.....
Itai Tavor
itai@optusnet.com.au
Sun, 24 Dec 2000 16:21:11 +1100
Hi Steve,
Steve Spicklemire wrote:
>Hi Itai,
>
>>>>>> "Itai" == Itai Tavor <itai@optusnet.com.au> writes:
>
> Itai> I'm already using globally unique ids, but still, doesn't
> Itai> using the same id for the Participant and the Actor make
> Itai> these objects too tightly coupled? Seems to me that Actors
> Itai> should provide an interface for finding actors to the rest
> Itai> of the application; other objects should not make
> Itai> assumptions about the internal storage of Actors, and
> Itai> particularly what ids they use. No?
>
>Well... there are two aspects here: 1) Who knows about how
>various Participants and Actors are managed and 2) How are they actually
>managed. Tight coupling is only about "1". It seems to me that "2" is
>up to you as the developer to decide based on the particular
>situation.
>
>I'm sure that ZPatterns Zen is like most things... you learn by
>getting your fingers burnt ;-). However it seems to me that it
>should be OK for an Xs Specialist to implement
>
>getXforY( y_id )
>
>or
>
>getXsforY( y_id )
>
>(if there is more than one x for a single y.
>
>If you have an XOR relationship, with several potential Specialists
>I think you could either:
>
>(A) iterate through the list of possible Specialists and ask each to
>getXforY until you get a hit...
>
>or
>
>(B) have a 'clearing house' Participants specialist, with a Rack for
>each of the
>Participant types and let it iterate through the racks and return
>an object of the right type based on which one is a 'hit'. (Specialists
>of course do this automatically!)
>
>The advantage of (A) is, one less Specialist. The disadvantage is that
>the Actor Specialist needs to 'know' about the list of Participant Specialists
>itself.
>
>The advantage of (B) is that the clearing house Specialist keeps track
>of all the different Participants types... and the iteration is 'automatic'.
>
>However... I think that either of these is 'OK' as far as coupling is
>concerned. In both cases the information about the different types
>of Participant is kept in a single centralized place [(A) in the
>Actors Specialist] and [(B) in the clearing house Specialist]. *If*
>you had some *other* Specialist that also needed to iterate through the
>various types of Participants... *then* B would be a clear advantage,
>and probably worth the added complexity.
I use (B) when some participants need to take on a certain role, like
'ordering entities', 'billable entities', etc. In this case, each
role might be filled by a different group of participants, so a new
Specialist is necessary. I implemented this for my Actors like you
suggested, and it works nicely and doesn't seem overly complicated.
In other XOR cases, I would favor (A). I think (B) in these cases
would be an overkill. One thing about implementing (A) - it can be
done in two ways:
- Store participant_id in Actor. Actor calls
ParticipantSpecialist.getParticipant(self.participant_id)
- Store actor_id in the participants. Actor calls
ParticipantSpecialsit.getParticipantForActor(self.id)
Or, you'd probably want to do both - store Actor.my_participant_id
and Participant.my_actor_id. But in this case, you don't need
getParticipantForActor, you just use
getParticipant(self.my_participant_id).
Does this make sense?
>(P.S. it was refreshing to hear pje mention that he and Ty had to "bite the
>bullet" and add new classes/Specialists on a project and only *after* that
>it got much simpler, clearly implying that the original design was less
>than perfect. It seems to us newbies sometimes that they possess
>the Deific characteristic of near (object oriented) infallibility whereby
>they produce clean, elegant, yet simple object oriented designs with the
>same graceful ease with which they might compose a grocery list, while we
>mortals struggle for hours and days to come up with something that they might
>discard after a moment's thought. Anyway.... in the end we'll all learn the
>most by hard experience, if only she were a more forgiving Mistress!)
Being able to get it right the second time is still close enough to
infallible for me :-)
>(P.P.S. I still really like your idea of codifying some of these
>ZPatterns techniques into a sort of gallery of ZPatterns Implementations.
>I'm working already on incorporating some of these into the ToDo example.)
I'd like to see what you manage to fit into the example. I think that
once you get one implementation from the gallery added, and we can
see that it's simple and works well in this application, we can
consider it our 'recommended implementation of the moment'.
P.S. I've been struggling with a problem that might get cleared up if
you added it to the example:
Say you want to allow a user to add a ToDo from the Deliverable
screen (in addition to the existing menu for selecting existing
ToDos). You could either place a 'create ToDo' form right there,
using a UI snippet from ToDos, or link to ToDos.addToDoForm. The
problem is how to get the id of the new ToDo into the deliverable. If
you didn't store todo_ids in Deliverable, instead calling
ToDos.getToDosForDeliverable(), there would be no problem. Otherwise,
you'd need a addToDoInterface in Deliverable, which will call
ToDos.addToDo, then add the new ToDo id to todo_ids. Or, as a third
option, you could pass a method to ToDos.addToDo, and get it to call
this method and give it the new id.
What do you think? Want to tackle this in the example?
Itai
--
Itai Tavor "Je sautille, donc je suis."
C3Works itai@c3works.com - Kermit the Frog
"If you haven't got your health, you haven't got anything"