[squeak-dev] Re: isKindOf: in Morphic code...

marcel.taeumel Marcel.Taeumel at hpi.de
Tue Jul 5 07:42:04 UTC 2016


Eliot Miranda-2 wrote
> On Mon, Jul 4, 2016 at 1:58 PM, marcel.taeumel <

> Marcel.Taeumel@

> >
> wrote:
> 
>> Eliot Miranda-2 wrote
>> > On Mon, Jul 4, 2016 at 1:59 PM, Tobias Pape <
>>
>> > Das.Linux@
>>
>> > > wrote:
>> >
>> >>
>> >> On 04.07.2016, at 22:44, Eliot Miranda <
>>
>> > eliot.miranda@
>>
>> > > wrote:
>> >>
>> >> > Hi All, Hi Marcel,
>> >> >
>> >> >     when I see code like this, and there's a lot of it in Morphic,
>> >> >
>> >> > !Flaps class methodsFor: 'testing' stamp: 'mt 5/17/2016 14:17'!
>> >> > anyFlapsVisibleIn: aWorld
>> >> >
>> >> >         aWorld submorphsDo: [:m |
>> >> >                 (m isKindOf: FlapTab) ifTrue: [^ true]].
>> >> >
>> >> >         ^ false! !
>> >> >
>> >> > I think this is performance thrown on the floor (isKindOf: is
>> awfully
>> >> slow, especially in huge hierarchies like Morphic, and bad design,
>> >> restricting one to a concrete class).  And I think that Morph provides
>> a
>> >> perfect place to put an extension that doesn't pollute Object.  So I
>> >> would
>> >> like to see
>> >> >
>> >> > anyFlapsVisibleIn: aWorld
>> >> >
>> >> >         aWorld submorphsDo:
>> >> >                [:m| m isFlapTab ifTrue: [^true]].
>> >> >         ^ false! !
>> >> >
>> >> > with the emphasis on isFlapTab ;-)
>> >>
>> >> Well, class testing seems to be a Morphic pattern, given #findA:
>> (alias
>> >> #submorphOfClass:)
>> >>
>> >
>> > I don't care.  It's *WRONG*.  isKindOf: is a _bug_.
>> >
>> >
>> >>
>> >> Best regards
>> >>         -Tobias
>> >> PS: Not advocating anything just reporting what I found
>> >>
>> >
>> >
>> >
>> > --
>> > _,,,^..^,,,_
>> > best, Eliot
>>
>> Hey Eliot,
>>
>> no, it's not a bug. ;-)
> 
> 
> Yes, isKindOf: *is* a bug, at least in the usage of determining supported
> messages.  Smalltalk has ad-hoc polymorphism that allows any class to
> implement and set of messages, without having to inherit from a
> superclasss
> that defines that set of messages.  isKindOf: breaks this property; it
> restricts the designer to using a concrete class, in violation of the
> language's flexibility.  isKindOf: is therefore most definitely a bug.
> 
> One might think there are valid uses when editing a class hierarchy
> programmatically.  But for this there are messages understood by classes,
> not instances, such as includesBehavior:, inheritsFrom: etc.  These are
> legitimate.  But isKindOf: is not.  It is a horrible hack.
> 
> Although, there is room for improvement. #isFlapTab
>> sounds good. Note that this is not even a critical piece of code because
>> is
>> only called if you open a system window, for example.
>>
>> Try [Flaps anyFlapsVisibleIn: ActiveWorld] bench. It's fast enough. A
>> microsecond here, having around 30 windows open. So, you will not notice
>> a
>> delay. Still, you're right. We should reduce the usage of #isKindOf:.
>>
>> Not polluting Object means still polluting Morph.
>>
>> (Yeah, maybe we should use slower computers to program.)
>>
>> Checks we should consider to add or use more often if it is already
>> there:
>> #isCornerGripMorph
>> #isProportionalSplitterMorph
>> #isCompiledMethod
>> #isColor
>> #isInfiniteForm
>>
>> ... still, a quick look through the usage of #isKindOf: in Morphic code
>> revealed no serious performance issues. We should refactor MenuMorph to
>> not
>> need #isKindOf: that often. This might also be true for other places.
>>
>> The pattern "isClass" is not always a good solution for many cases in the
>> system.
>>
>> Best,
>> Marcel
>>
>>
>>
>> --
>> View this message in context:
>> http://forum.world.st/isKindOf-in-Morphic-code-tp4904890p4904895.html
>> Sent from the Squeak - Dev mailing list archive at Nabble.com.
>>
>>
> 
> 
> -- 
> _,,,^..^,,,_
> best, Eliot

@Phil: #isKindOf: is no better or worse than the #isClass-check. Maybe
performance-wise, but arguably not in terms of architecture and code design.
While #isClass might be a little closer to idiomatic Smalltalk code, it
should never be used as an excuse for bad design.

@all: I do see beauty in the pattern of asClass/isClass. For example,
asSet/isSet, asOrderedCollection/isOrderedCollection. 

However, anytime a programmer tends to use a type-check and there is no
"isClass" available, I would rather suggest him to use #isKindOf: for the
moment instead of adding another two methods to encode the "isClass" in both
base class and subclass. Always think twice before blowing up a class'
interface. It impedes code readability. Especially if we are talking about a
base class that is already that big, like Morph. Then, if there is really no
other choice -- design-wise -- one has to consider performance. #isKindOf:
is expensive. Okay. Then you can easily add the isClass-check. Fine.

Sorry, but this is absolutely no black-white decision as Eliot and Phil
proposed. There are many factors to consider. Semantics, code/interface
readability, performance, idioms.

In many cases -- if not all -- I suspect a design issue behind the use of
#isKindOf: or #isClass. Still, I do like #respondsTo: because it is specific
to a scenario/domain and leverages the dynamic capabilities of Smalltalk.
For example, "model respondsTo: #foobar" as an extension point in graphical
widgets.

We should *not* batch-convert all uses of #isKindOf: to an #isClass check
but use our Senders-Tools to hunt down all the design issues left in the
system.

Best,
Marcel



--
View this message in context: http://forum.world.st/isKindOf-in-Morphic-code-tp4904890p4904935.html
Sent from the Squeak - Dev mailing list archive at Nabble.com.


More information about the Squeak-dev mailing list