Thanks, Hannes. I am not completely misunderstood, then :) Doru
On Sat, Jul 20, 2013 at 2:02 PM, H. Hirzel <hannes.hir...@gmail.com> wrote: > On 7/19/13, Igor Stasenko <siguc...@gmail.com> wrote: > > On 19 July 2013 16:17, Tudor Girba <tu...@tudorgirba.com> wrote: > >> Hi Igor, > >> > >> I love these discussions. I agree that abusing inheritance is > >> counter-productive. Definitely, "Shampoo subclass: #Shower" does not > >> match > >> any mental model I can think of. But, I am not seeing "Announcer > >> subclass: > >> #MyDomainConcept" equally as an abuse. > >> > >> Here is why. > >> > >> When I say "Object subclass: #MyDomainConcept", my actual intention is > >> not > >> to reuse types necessarily, but rather the infrastructure needed for the > >> Smalltalk runtime. From this point of view, it is an implementation > >> inheritance. I could as well, inherit from ProtoObject, but I do not do > >> it > >> because Object gives me a bit more technical infrastructure. > >> > >> For me, Announcer is nothing but an Object that has an extra technical > >> capability. Inheriting from Announcer rather than Object seems the same > >> as > >> inheriting from Object rather than ProtoObject. > >> > >> Now, you can shoot. > >> > > > > As i understood, you see nothing wrong in using inheritance as reuse, > > while i do. > > not generally I assume Tudor thinks, only for this particular case of > sub classing Announcer. > Announcing behaviour may be considered part of a package objects > should have and this has been the case in Smalltalk since the > beginning, though implemented with the symbol based changed/update > mechanism. > > To restate > Yes, I agree that subclasses should specialize the behaviour of the > superclass. But there need to be classes first you may subclass to > specialize and these inherit general properties of object behaviour. > > --Hannes > > > The argument with Object does not stands, to my thinking, because > > it is most generic class, and protocols it implements used by various > > parts of a system, > > including reflection etc, > > and those parts actually expecting that all objects they dealing with > > is at least implementing Object protocol(s). > > So, strictly speaking by inheriting from Object you may call it reuse, > > but to my thinking it is more > > about having a guarantee that your class will play well with the rest > > of smalltalk ecosystem (even if it's not your direct concern). > > > > While in case of inheriting from Announcer it is something different: > > you already have specific behavior > > which is non-universal for all objects in system (otherwise why not > > implementing Announcer protocol in Object?). > > > > Also, i am sure you aware, that by doing this, you introducing a > > certain degree of rigidness in your model (every time you refer > > directly to names instead of protocols, little kittie dies ;) > > > > because if today, Announcer serves well for your needs, and all is > happy.. > > but maybe tomorrow, one guy will make a better one AnnouncerOnSteroids.. > > and to reuse it , you will need to change the parent in all numerous > > classes where you used Announcer > > originally. > > And to make it absolutely ridiculous, imagine how you will give user a > > choice whether use one Announcer or AnnouncerOnSteroids? You will > > recompile your classes each time? And what if parts of your model > > insist on using just Announcer while others having no problem with > > trying to play with AnnouncerOnSteroids? > > > > Another aspect of such abuse is when you inherit, you are tempted to > > use direct access to internal state and private methods, and that > > leads to really strange and complex problems later.. > > > > Just giving you an example: > > > > Suppose we have a class Butter, which implements #numberOfCalories and > > #fatPercentage protocols.. > > > > Now we do it like that: > > > > Butter subclass: #Fridge > > > > and then, of course > > > > fridge := Fridge new. > > > > fridge fatPercentage > > > > or: > > > > fridge fatPercentage: 10. > > > > ^^^ just look at the above line, how much sense you think this piece > > of code makes > > for reader, who will try to reason what is happens in your code? > > > > And why you think it is not the same story with Announcer? > > > > Because by subclassing from it, you expose its protocol(s) in places > > where it is not needed and > > will cause problems and confusion. > > Because when you inherit to reuse, not to specialize, then users of > > such class in most cases won't use > > full protocol of the superclass, nor require it.. and therefore by > > providing more than necessary, > > you are basically violating the principle of least authority. > > To fix that, you will need to override certain methods in your > > subclass to prevent exposing unwanted/low-level behavior to users. But > > that's again wrong, because then your model now starting to know too > > much about Announcer's internals, which should be an implementation > > detail, and adds even more rigidness to your design. > > > > > > -- > > Best regards, > > Igor Stasenko. > > > > > > -- www.tudorgirba.com "Every thing has its own flow"