The impoliteness of overriding methods

foobar foo at bar.com
Thu Dec 20 12:49:40 PST 2012


On Thursday, 20 December 2012 at 19:46:25 UTC, H. S. Teoh wrote:
> On Thu, Dec 20, 2012 at 08:30:36PM +0100, foobar wrote:
>> On Thursday, 20 December 2012 at 14:51:31 UTC, Dan wrote:
> [...]
>> >I think it is more than syntactic sugar and in this case it is
>> >trivial because you as a designer of Base anticipate only one
>> >level of Derived. But, assume there are to be 2, 3, 4, or more
>> >levels of derivation. In fact, maybe you don't know how many
>> >levels there will be. For a chain of B->D1->D2->D3 I don't 
>> >see how
>> >you can up front get the same effect this way. At the level 
>> >of D2,
>> >base will skip the implementation of precious() in D1. At the
>> >level of D3, base will skip the implementation of precious() 
>> >in D1
>> >and D2, etc. Chaining is lost beyond the first level. It is 
>> >as if
>> >something is done in one direction, you want it done the 
>> >other and
>> >you provide an example that does the reversion as long as 
>> >there
>> >are only two entries. It is not truly a general solution.
>> >
>> 
>> You misunderstand. It is precisely what the quote bellow says 
>> - it
>> saves you from coming up with new names. The same pattern can 
>> be
>> applied multiple times for the multi-derivation case you bring 
>> up,
>> it's just needs more method names.
>> 
>> To extend my previous example:
>> 
>> class Derived {
>>   override precious() {
>>     beforeDerived();
>>     furtherPrecious();
>>     afterDerived();
>>   }
>> }
>> 
>> class FurtherDerived : Derived {
>>   void furtherPrecious() {...}
>> }
>> 
>> Now, we get this call chain:
>> base.myPrecious() -> Derived.precious() ->
>> FurtherDerived.furtherPrecious()
>> This can be extended ad infinitum.
> [...]
>
> But the fact that you keep having to invent new names is itself 
> the
> problem. It inevitably leads to horrible APIs that consist of 
> names
> suffixed by numbers: precious(), precious1(), precious2(), 
> precious3(),
> ad nauseaum. Method names that are suffixed by numbers are, as 
> a rule,
> an indication of bad API design. They also make your derived 
> classes
> immovable around the hierarchy, because to override their 
> parent's
> method, they have to use the exact name that's introduced by 
> the parent
> class, otherwise they risk accidentally short-circuiting part 
> of the
> chain.
>
> Whereas BETA's unification of the entire chain of calls under a 
> single
> name means that it's trivial to shuffle derived classes around 
> the
> hierarchy -- you're guaranteed they only overload their 
> immediate
> parent's method, and it stems the inevitable tide towards the 
> horrible
> number-suffixed method names.
>
> I'm not saying that the BETA approach cannot be represented by 
> the
> traditional approach -- they are functionally equivalent, as 
> you point
> out. It's just that for some use cases, the BETA approach is 
> superior.
> (All high-level languages compile to ASM, but that doesn't mean 
> they add
> no value to programming directly in ASM.)
>
>
> T

Yeah, I agree with all of the above points and in a completely 
new language designed from scratch I may very well prefer the 
more principled Beta approach over the "regular" D approach.

But, In our current circumstances and given that D indeed already 
implements a functionally equivalent feature which we are not 
going to remove or replace, I just don't see adding this, in 
essence a duplicate feature, worth the complexity cost. As Anderi 
phrases that - it just doesn't pull its weight.

It's all a matter of trade-offs and we cannot and should not 
strive to put all possible feature combinations and 
implementation variants into D.


More information about the Digitalmars-d mailing list