>________________________________
>From: Robert Jacques <[email protected]>
>To: Steve Schveighoffer <[email protected]>; Discuss the phobos library for 
>D <[email protected]>
>Sent: Friday, April 22, 2011 12:09 PM
>Subject: Re: [phobos] Time to get ready for the next release
>
>On Fri, 22 Apr 2011 10:39:02 -0400, Steve Schveighoffer <[email protected]> 
>wrote:
>
>> Bug reports.  People having stupid arguments just like this one on why you 
>> should change how the code works to fit their style ;)
>> 
>> Essentially, ambiguously named functions in the context of "I can call this 
>> as a property or a function" lead to people getting surprising behavior and 
>> then complaining about the surprise, when I can do nothing about it.
>> 
>> I've actually had this happen.  I had to change function names in Tango in 
>> order to avoid people complaining.  The example was, I had a bunch of 
>> generator functions in TimeSpan, like
>> 
>> // create a time spand that represents the given number of seconds
>> 
>> static TimeSpan seconds(int s)
>> 
>> 
>> which would be used like this:
>> 
>> auto s = TimeSpan.seconds(5);
>> 
>> But it could also be used as a property.  So this compiled and constructed a 
>> temporary time span and throw it away:
>> 
>> TimeSpan s;
>> 
>> s.seconds = 5;
>> 
>> So we had to change seconds to fromSeconds.  It still allows code like this:
>> 
>> s.fromSeconds = 5;
>> 
>> but instead of being disallowed, it just looks horrible, hopefully cluing 
>> the reader to go examine the documentation for TimeSpan.  That's the best we 
>> can do.  I have no power to enforce the usage.
>
>You know, the first thought I had when seeing this code was, "Why didn't you 
>capitalize the name of your inner struct/class in the first place?".

Obviously because it's not an inner struct :)  seconds is a factory method to 
create a time span from seconds.  It's akin to core.time's Duration:

dur!"seconds"(5)

> My second thought was, hmm..., I wonder if there would be a way to prevent 
> accessing static members from instances? (There's a pretty serious loss of 
> functionality bug regarding struct opCall being overloaded by ctors that's 
> basically the same thing.)

This was also my wish to fix the problem originally, I kind of still don't like 
that static functions are not required to be called via the class/struct name 
(from outside the scope of course).


> Third, came criticisms of naming a factory method 'seconds' in the first 
> place (noun/verb distinctions, etc), and the associative criticisms of fixing 
> a bad design via a proverbial sledgehammer.

The goal was to have something short.  At the time, I was fighting for changing 
the time code in Tango, and one of the criticisms was that the factory method 
names were too long (don't remember what I originally had).  Code like 
Socket.select(5.0) was going to be replaced with 
Socket.select(TimeSpan.seconds(5)).  This was sort of a compromise.  
Ironically, we had to change it to something more verbose because of this 
problem.


> Forth, came the realization that in D2 'seconds' would probably be pure, 
> which would cause s.seconds = 5 to be compiler error.

No, it wouldn't be an error.  s.seconds(5) is exactly the same as 
TimeSpan.seconds(5), both would be callable as pure functions.  In other words, 
s isn't actually passed to the function, it's just used as a namespace.


> Currently I'm pondering whether capitalized factory methods, in order to 
> mimic ctor syntax, would be an acceptable design. I doubt anyone would every 
> have tried s.Seconds = 5, and thanks to auto, I also doubt anyone would call 
> TimeSpan.Seconds s. And unlike (an impure) s.seconds = 5, TimeSpan.Seconds s; 
> simply doesn't compile. Plus, it self-documents the factory concept in the 
> name.

If you used C# regularly, where everything is capitalized, you might expect 
capitalized method names and properties.  But in any case, why is 
capitalization more of a distinguisher than parentheses or lack thereof?  Both 
are part of the name of the function.  It's a matter of taste, but the 
distinction between capitalization and D's current loose properties is that in 
the latter, the name is under the control of the *user*, not the author.


>Still, this feels like a valid point weakened by a poor (or at least 
>debatable) example. You wouldn't have additional examples handy, would you? 
>(links to bug reports, would be more than acceptable)


here is the bug report from Tango: 
http://www.dsource.org/projects/tango/ticket/1184 .  It's the only one that 
stands out in my memory as something I had to change because of a user 
complaint of usage.

So I don't have any personal experience with other examples.  Perhaps this is 
because I learned to be more explicit with method names?  I don't know.  Others 
may have better examples.


-Steve

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to