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?". 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.) 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. Forth, came the realization that in D2 'seconds' would probably be pure, which would cause s.seconds = 5 to be compiler error. 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.

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)
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to