[Cuis-dev] [DEFECT] #copyFrom:count: for OrderedCollections
Andres Valloud
ten at smallinteger.com
Tue Feb 6 10:57:30 PST 2024
Be careful with that "false polymorphism" argument. Going down that
route means you can ignore the receiver's class when you see a selector
because a selector can only have one meaning. In a sense, it promotes
selectors to operators.
It should be pretty clear that collections like Array and Set should
behave differently. Why is that being ignored?
Consider this alternate interpretation. The root cause of this problem
seems to be that some code has the expectation that
species new: n
can have exactly one meaning. The sender is ignoring the receiver
class. Only the receiver class has that context. So the receiver class
should be given the task of creating the new instance instead --- this
is why arithmetic has double dispatching, for example.
Andres.
On 2/6/24 8:21 AM, Juan Vuletich via Cuis-dev wrote:
> Let me also elaborate a bit on the rationale.
>
> In Smalltalk-80 (and every other Smalltalk system since then), the docs
> will say that #new: will answer a collection of the requested size. But
> it is not like that for Set, Dictionary, OrderedCollection and a few
> others, that give a completely different semantics to this message. It
> is no _that_ bad when the message is sent to an explicit class, although
> you need to be aware of this.
>
> The real problem is when someone does `someCollection species new:
> aNumber`. It gets really tricky to find out what is going to happen.
>
> This is a prime example of what I call "False Polymorphism". It looks
> like a polymorphic message, but it is not. It is (at least) two sets of
> senders/implementors, completely separated. This means obscure,
> misleading code. It makes me sick. I fix every instance of this I see.
> It rarely happens in the base Smalltalk-80 classes, but it is still wrong.
>
> Thanks,
>
More information about the Cuis-dev
mailing list