At Sun, 1 Nov 2009 19:35:57 +0200,
Igor Stasenko wrote:
> 
> 2009/11/1 Lukas Renggli <reng...@gmail.com>:
> >> Oh, wait.. you mean that if i want, say 35 out of 50 announcement
> >> kinds to be logged, then
> >> i need to do something like:
> >>
> >> logblock := [:announcement | ... ].
> >> announcer on: AnnouncementKind1 do: logblock.
> >> announcer on: AnnouncementKind2 do: logblock.
> >> ....
> >> announcer on: AnnouncementKind35 do: logblock.
> >>
> >> ?
> >> Do you agree that this is far from being short and elegant? Moreover
> >> it imposes dependency from various kinds of events, instead of just
> >> one (LoggedAnnouncement),
> >> and, if i going to change them somehow, i would need to revisit this
> >> code again.. and again.
> >
> >    announcer
> >        on: AnnouncementKind1 , AnnouncementKind2 , ... AnnouncementKind35
> >        do: logblock
> >
> good catch.
> Still dependency on 35 classes .. while my intent is to subscribe to
> all announcements which can be logged.
> If i load new package, it could provide more announcements which can be 
> logged.
> But i will not be able to see them if i'm going to enumerate them in
> such way :(

  If "can be logged" means to have #canBeLogged method that returns
true, you could also say (given that you provide a default
implementation of #canBeLogged at a/the root):

logblock := [:announcement | announcement canBeLogged ifTrue: [... ]].
announcer on: Announcement do: logblock.

Loading a package with new subclasses of Announcement is not a
problem.  And, a recipient ignoring an announcement that it doesn't
handle is somewhat common, when I used my own implementation for my
projects.

  If you implement an observer pattern to accommodate the new package
loading requirement, what would be the strategy to implement it?

-- Yoshiki

_______________________________________________
Pharo-project mailing list
Pharo-project@lists.gforge.inria.fr
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to