Florian Gilcher
5/17/2008 12:12:00 AM
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On May 17, 2008, at 12:55 AM, Keith Bennett wrote:
> Florian, your example is not a fair one; it illustrates an intentional
> violation of the semantics, whereas Roger is referring to an
> accidental one. In fact, it illustrates the lengths to which one must
> go to trigger the problem in Java.
Actually, you don't have to go that far :). I know, the example is a
artificial.
Actually, i did only add the interface for illustration. A more common
case
would be the assumption that methods of subclasses share
common semantics with methods of superclasses. I had such
a case some time ago, when a fellow student assumed that a method
name was not taken and implemented it on a subclass, causing havoc
in the code calling it :). Granted, this is an indicator that the naming
was too generic, but the language didn't help a bit.
But the question was:
>How can anyone assume that just because a method exists that the
>semantics is the same?
This problem is present in both Java and Ruby and none of the
languages helps me much in this. It is much more a question of
programmers discipline, good naming and knowledge of the
ecosystem the software lives in :). Thats perhaps why you don't
experience it as a big problem. Considering that i assume that
ruby is not the first OOP-Language for many people, they've
already got a headstart when it comes to this.
But actually, i can produce a real-world sample for an interesting
semantic
changing behaviour that is much harder to reproduce in Java/C# and
would really be abuse in such languages.
If you know you way around ActiveRecord, calling #find on associated set
of models (e.g. @some_person.friends.find) will not call Array#find but
Friend.find. _But_ if you try inspecting the Object, it will happily
tell you that
it is an Array. (and not some subclass ...)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)
iEYEARECAAYFAkguItkACgkQJA/zY0IIRZbmsACgujIPlOK7pEM5AeqEEWLf1aYI
mAsAnAjlb3EKVHGFGF/Jn5pBDBVul0AS
=aT3y
-----END PGP SIGNATURE-----