byKey and byValue: properties or methods?

Steven Schveighoffer schveiguy at yahoo.com
Wed Jan 18 06:34:11 PST 2012


On Wed, 18 Jan 2012 09:13:37 -0500, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> On 1/18/12 7:44 AM, Steven Schveighoffer wrote:
>> The solution is easy, just don't start the discussion. Make a decision
>> (property or no), and that's the end of it. My intuition says that you
>> will purposely make the *wrong* choice just to try and get others to
>> complain so you can "be right".
>
> Well in this case I am right :o). We did a poor job at designing  
> properties. Anyhow, I honestly asked simply because I found no clear cut  
> decision. My intuition was that byXxx should be a property but I asked  
> Walter whose intuition said it should be a method. So we agreed to ask  
> the newsgroup.

Then I withdraw the "being spiteful" suggestion, it was probably unfair.

But the "I told you" didn't set the tone very well for this discussion :)

>
>> The point of required property semantics is that the name of the
>> function includes whether you need parentheses or not. a.empty does not
>> have the same tone as a.empty(). The former looks like a field, the
>> latter looks like an action. It's a subtle bikeshed issue, but so is
>> naming functions anyways!
>
> Yes, but the problem is this adds additional bikeshedding for no benefit.
>
>> If you think the names of things aren't
>> important, name them whatever you want, but at least you as the author
>> get to choose instead of the user.
>
> I understand this point. It doesn't reduce the frustration that we have  
> a feature that does not palpably improve the language.

Disagree on both points :)  @property with enforcement is the right  
answer, it improves the language significantly, bringing it in line with  
most other property-enabled C-like languages.

>> And if I may add my opinion, byValue and byKey are properties.
>
> I agree. The current code has them as properties. My thoughts are, a  
> property should reasonably replace a member variable (of which syntax it  
> mimics). So x.length should be property, x.dup shouldn't. Now byXxx can  
> be considered member variables but only as long as it's not considered  
> an lvalue: r.byKey.popFront() does nothing interesting, but would do if  
> r.byKey were actually a member variable. I think that distinction still  
> does not impair byXxx's right to be a property.

I think the difference between what should be a property and what  
shouldn't is not black and white.  There is no easy way to define it.

The best I can come up with is, if it gets something that is logically a  
piece of the object, then it should be a property (even if it makes a copy  
of that something).  If it creates something separate from the object, or  
modifies the object, it should be a method.

-Steve


More information about the Digitalmars-d mailing list