On 30 Mar 2019, at 20:56, Denis Kudriashov wrote:

> Hi Max.
>
> сб, 30 мар. 2019 г. в 19:08, Max Leske <[email protected]>:
>
>> Hi Denis,
>>
>> I'm not too happy with any of those. For my own applications I use the
>> following:
>>
>> isAbstract
>> ^ self subclasses notEmpty and: [
>> (self class localSelectors includes: #isReallyAbstract) not or: [
>> self isReallyAbstract ] ]
>>
>> isReallyAbstract
>> "Override this method in any class that has children but should
>> *not* be considered abstract (while the children may be)."
>> ^ true
>>
>> The reason, as stated in the method comment, is that in nearly all of my
>> cases a class with subclasses should be considered abstract. Now, I don't
>> want to go and implement #isAbstract on each of those classes but at the
>> same time I need an escape hatch *which is not inherited*.
>> That's why I work around method lookup by checking for the existence of
>> the method first.
>>
>> I don't like how I have to hack around the method lookup but this works
>> far better from me than the class equality / identity check.
>>
>> On 30 Mar 2019, at 19:35, Denis Kudriashov wrote:
>>
>> Hello.
>>
>> We did recently several cleanups by marking abstract classes as abstract
>> using #isAbstract method (https://github.com/pharo-project/pharo/pull/3087
>> ,
>> https://github.com/pharo-ide/Calypso/pull/462) .
>>
>> I would like to discuss here and decide what the right way to implement
>> this method.
>>
>> The logic behind is to only return true when receiver is defining class of
>> this method. And it should be false for any subclasses (if they do not
>> implement own #isAbstract method).
>>
>> There is old pattern for implementation to compare name of class:
>>
>> MyAbstractClass class>>isAbstract
>> ^self name == #MyAbstractClass
>>
>>
>> It is used in many places (mostly tests). And it was used in recent Pharo
>> PR (3087).
>>
>> We have another pattern in other places which simply compare self with
>> class:
>>
>> MyAbstractClass class>>isAbstract
>> ^self == MyAbstractClass
>>
>> Otherwise, this would be my preferred method:
>> 1. minimum number of byte codes
>>
> Why it is important?
> If it is about speed then I don't believe you :) because your approach is
> very far from being optimized and I guess you are ok with that.

I know, and you're right of course. It's just the way I feel about the code :)

>
>> 2. Simple for refactoring tools to update the binding
>> 3. no use of #name
>>
>> Cheers,
>> Max
>>
>> And in Calypso I used "more simplified" version using equality:
>>
>> MyAbstractClass class>>isAbstract
>> ^self = MyAbstractClass
>>
>> I think we would all agree that simplest version is last one. It does not
>> raise any question about why we compare name or why we use identity
>> comparison. So this is my choice in this discussion.
>>
>> Please write arguments about your preferred implementation. And let's
>> choose single way at the end. There is an idea to add a command into
>> browser to make classes abstract. And this decision will be used as a
>> template.
>>
>>
>> Best regards,
>> Denis
>>
>>



Reply via email to