I love this debate, but given the energy it attracted, I now apologize to
have fueled it.

By reading the thread, I believe that everyone involved in the discussion
is on the same page on 99.9% of the cases, the only real difference being
the case of the Announcer (and even there, the difference is more
philosophical in nature).

Would it be Ok to call it a day and move on? :)

Cheers,
Doru




On Mon, Jul 22, 2013 at 1:05 PM, Igor Stasenko <siguc...@gmail.com> wrote:

> On 21 July 2013 20:21, Denis Kudriashov <dionisi...@gmail.com> wrote:
> > 2013/7/21 Stéphane Ducasse <stephane.duca...@inria.fr>
> >>
> >> Interesting how many people in this list think that "Announcer subclass:
> >> #TxEditor" provides special implementation of announcer named TxEditor?
> >>
> >>
> >> Many
> >> this is composition using inheritance and inheritance should not be used
> >> like that.
> >>
> >> Announcer subclass: #GreedyAnnouncer
> >>
> >> Announcer subclass: #RemoteAnnouncer
> >
> >
> > And if we prefer composition we should not implement such kind of
> hierarchy.
> > We should implement GreadySubscriptionsRegistry,
> RemoteSubscriptionsRegistry
> > or AsynchSubscriptionsRegistry and reuse existed Announcer. All
> subscribing
> > and delivering logic implemented by subscription registry. Announcer is
> just
> > simple delegator with convenient api to create Subscription instances:
> >
> > Announcer>>subscribe: anAnnouncementClass do: aValuable
> > "Declare that when anAnnouncementClass is raised, aValuable is executed."
> > ^ registry add: (
> > AnnouncementSubscription new
> > announcer: self;
> > announcementClass: anAnnouncementClass;
> > valuable: aValuable)
> >
> >
> > Announcer>>announce: anAnnouncement
> >
> > | announcement |
> > announcement := anAnnouncement asAnnouncement.
> > registry ifNotNil: [
> > registry deliver: announcement
> > ].
> > ^ announcement
> >
> > All magic happens inside #add: and #deliver: methods of
> > SubscriptionsRegistry.
> >
> > Also announcements framework provides very nice feature: you can have
> > announcer as last argument of event handler selector (that's why
> > AnnouncementSubscription contains reference to announcer instance):
> >
> > announcer on: MyEvent send: #handleAnnouncement:raisedBy: to: aSubscriber
> >
> > Without subclassing YourEventsSource from Announcer you will not have
> such
> > feature. Or you will need implement complex subscription method inside
> > YourEventSource which will delegates special event handler to its
> announcer
> >
>
> 1. you don't need separate class to represent event source.
> it can be any object which does:
>
> announcer announce: Foo.
>
> in any place..
> I do not see any practical gains from forming a separate class for this
> role.
> It is barely formalizeable because the way how users creating and
> triggering events is arbitrary.
>
> 2. SubscriptionRegistry is an implementation detail. It is private. It
> is a way how Announcer
> doing things inside. It should be no concern of anything outside to
> consider what it does.
> You won't find this class in VisualWorks implementation, for instance.
>
> 3. again, event source - is any object which says 'announcer announce: ...'
> It is NOT announcer, because announcer is an event dispatcher.
> dispatcher ~= source
> Is it so hard to see a difference?
>
> When you subclass from Announcer, is that you want to say:
>
> 'self announce:' , so the very same object acts both as event source
> and event dispatcher.
>
> But then , as Stef said, by subclassing you inheriting API.
> So, what prevents me from writing following code, in my own class,
> which uses your domain object
> in a following way:
>
> coolDomainObject := YourDomainObjectWhichInheritsFromAnnouncer new.
>
> coolDomainObject on: Foo do: #bar.
> coolDomainObject announce: Foo.
>
> That i guess is not something you expected, huh? But why not?
> As long as your object understand this protocol, and as long as you
> don't overriding original behavior of Announcer,
> i can abuse your object in a way you did not expected.
> And this is a consequence of violating principle of least authority.
>
> Because once you declare that we're free to use subclassing for any
> purpose,
> then, i can declare: i am free to use any subclass of Announcer as
> announcer for myself.
>
> Lets write random code, do not follow any rules and everyone will be happy.
>
> ---
> Best regards,
> Igor Stasenko.
>
>


-- 
www.tudorgirba.com

"Every thing has its own flow"

Reply via email to