[squeak-dev] A criticism of the Nile paper (was Re: My view on
Traits)
Victor Rodriguez
victor.palique at gmail.com
Sat May 17 01:28:24 UTC 2008
Hi,
On Fri, May 16, 2008 at 4:38 PM, Andreas Raab <andreas.raab at gmx.de> wrote:
...
> It is interesting to do a quick check to see how much this might change
> matters: First, combining these three classes into one means that the traits
> version has now twice the number of entities vs. the non-traits version (3
> vs 6). This view is also supported by counting the "backward compatible"
Less entities are not necessarily better than more, as I´m sure you
know. Generally, more classes with a clear responsibility are better
than less, harder to understand, classes.
> part of Figure 12 (which is directly comparable with the Squeak version)
> which results in 11 classes and traits (compared to 5 classes in Squeak).
>
> Next, if we take the total number of methods in these three classes:
>
> ReadStream selectors size +
> WriteStream selectors size +
> ReadWriteStream selectors size
> -----------------
> 68
>
> (the measure was taken in 3.9 to be roughly comparable with the paper and
> I'm not sure why the paper claims 55 methods) and compare this with the
> number of unique selectors (discounting all re-implemented methods):
>
> (Set withAll:
> (ReadStream selectors asArray),
> (WriteStream selectors asArray),
> (ReadWriteStream selectors asArray)) size
> -------------------
> 59
>
> What we get is 15% improvement *minimum* by folding these three classes
> (very likely more if one looks in detail).
>
> Next, let's look at "canceled methods" (those that use #shouldNotImplement).
> The paper lists 2 canceled methods which happen to be WriteStream>>next and
> ReadStream>>nextPut:. And of course those wouldn't exist in a
> single-inheritance implementation either. Etc.
>
> In other words, the measures change *dramatically* as soon as we apply the
> original idea regardless of whether traits are used or not. Which speaks
> clearly for the original idea of folding these three classes into one but
> concluding that traits have anything to do with it would require a very
> different comparison.
>
> If the paper wants to make any claims regarding traits, it really needs to
> distinguish improvements that are due to traits from general improvements
> (i.e., improvements that are just as applicable to single-inheritance
> implementations). Otherwise it is comparing apples to oranges and can't be
> taken seriously in this regard.
But there *are* limits to what you can achieve with single
inheritance. It is not very hard to come up with an example:
The Magnitude class is the perfect candidate for being converted into
a trait, if you ask me. Here is its class comment:
I'm the abstract class Magnitude that provides common protocol for
objects that have
the ability to be compared along a linear dimension, such as dates or times.
Subclasses of Magnitude include Date, ArithmeticValue, and Time,
as well as
Character and LookupKey.
My subclasses should implement
< aMagnitude
= aMagnitude
hash
Subclasses of Magnitude, by implementing #< #= #hash, gain methods #<=
#> #>= #between:and: #hashMappedBy: #max: #min: #min:max:. The
subclasses of Magnitude are Number, Character, DateAndTime, etc.
String does not subclass Magnitude, it subclasses ArrayedCollection,
and yet it does implement #< #= and #hash. It could clearly benefit
from using Magnitude as a trait (indeed, it does implement
#hashMappedBy: exactly as Magnitude).
Having traits like Magnitude leave you more options to define a better
inheritance hierarchy.
Saludos,
Víctor Rodríguez.
> Cheers,
> - Andreas
>
>
>
More information about the Squeak-dev
mailing list
|