[squeak-dev] Re: What is equivalence? (was: The Trunk:
ma.chris.m at gmail.com
Thu Feb 5 00:49:20 UTC 2015
>> >> If #isDictionary refers to particular API and behaviors, one could
>> >> argue that a BTree should answer true to #isDictionary, because it has
>> >> similar API and behaviors. In the context of _equivalence testing_
>> >> though, a BTree is not a Dictionary.
>> >> So as long as we interpret the various #isSomeType methods as truly of
>> >> *that type* (same semantics as isKindOf:), and not "similar to", then
>> >> I can see no side-effects (unless someone added #isDictionary to
>> >> BTree, of course). However, we may want to visit the other #=
>> >> implementations elsewhere in the system too, unless this would appear
>> >> to be an inconsistency producing its own odor of sorts.
>> > "similar to" is vague. I *don't* interpret isFoo methods as isKindOf:
>> > (and
>> > think that most experienced Smalltalk programmers don't either).
>> > In
>> > Smalltalk type = protocol. So these methods imply that an object
>> > implements
>> > a given set of messages, not that they are of any given class.
>> Then I am very interested to know your thoughts about my BTree
>> question, above, which shares the same protocol as Dictionary. Should
>> (BTree new at: 3 put: 'three'; yourself) = (Dictionary new at: 3
>> put: 'three'; yourself)
>> return true? Why or why not?
> Duck typing applies here, if it quacks like a duck. So if your BTree
> behaves like a Dictionary to the extent that e.g. MethodDictionary does
> (MethodDictionary supports associationAt: but isn't answering an association
> within it cuz it does't contain associations) then sure, it's a Dictionary.
I do not wish to be argumentative, but does a WeakArray quack like an
Array? Not only does WeakArray share exactly the same API, but even
inherits from Array and "is-a" Array. So why shouldn't this be true?
(Array with: 1 with: 2 with: 3) = (WeakArray with: 1 with: 2 with:
I think the answer is because #= (not any other method, just #=) needs
to care about which _implementation_ of the argument which is passed
when considering true equivalence to another object.
I agree we human developers can consider unequal but same-quacking
objects interchangeable in our fuzzy minds when we design our
applications, and that is powerful, however, *within the system*, I
just it needs #= to make implementation-specific distinctions,
especially for as base-classes as Array and Dictionary.
This seems to be reflected by most of the #= implementations in the
system, which check either #class, #species, or #isKindOf:.
More information about the Squeak-dev