On Mon, 25 Apr 2011 09:42:28 -0400, Steve Schveighoffer <[email protected]> wrote:
----- Original Message -----
From: Robert Jacques <[email protected]>
To: Discuss the phobos library for D <[email protected]>
Cc:
Sent: Saturday, April 23, 2011 1:05 AM
Subject: Re: [phobos] Time to get ready for the next release

On Fri, 22 Apr 2011 07:59:54 -0400, Steve Schveighoffer
<[email protected]> wrote:
 From: Robert Jacques <[email protected]>
 To: Discuss the phobos library for D <[email protected]>
 Sent: Thursday, April 21, 2011 4:05 PM
 Subject: Re: [phobos] Time to get ready for the next release

 On Thu, 21 Apr 2011 15:57:57 -0400, Jonathan M Davis
<[email protected]> wrote:

 How about the amount of existing code it breaks?  How about the
fact that
 it breaks using the same function for both method chaining and
with
 property syntax?

 Something like

 auto b = a.prop1.prop2.prop3;

 should work. I doesn't at present, but it should. There's a
bug report on it.

 What about auto b = a.prop1(5).prop2(6).prop3(7); ?

Looks like a poor design. If a setter property returns anything, it should
return the value set.  Otherwise:
 auto b = a.prop1 = 5; // I would expect b == 5

I both David and I have responded in depth to this in other threads. In short, trying to decide the goodness of an API design using an abstracted, out of context, reduced code snippet designed to highlight the syntactic constructs it
uses is fallacious.

For you to reject my rebuttal of your obviously abstract example by saying my rebuttal is too abstract is also fallacious.

*sigh* The original argument was "Here is an API design, A, that you can't express elegantly with @property alone". Your rebuttal was "Well, your abstracted example is obviously of Poor Design (TM), you should use B instead. Therefore, this 'issue' with @property, isn't really an issue". Your rebuttal introduced a new argument (that A was bad design, so use B instead) and I was pointing out the flaws in you making that argument based on abstracted information. The original argument was never about the 'goodness' of A, it was about the ability to express A in the first place; the biggest flaw in your argument is that the ability to express 'poor' design should warrant the removal of the ability to express it.

David did bring up his library, and it works pretty well with the dual property/function API, but there are some parts that could be used incorrectly, and I pointed those out.

 my solution:

define a setProp1, setProp2, and setProp3 without property semantics. It
also reads better:

 auto b = a.setProp1(5).setProp2(6).setProp3(7);

However, in the real API, setProp is a strictly inferior design. In point of
fact, your proposed solution suffers from several issues:

1) It isn't DRY (Don't Repeat Yourself). Not only do you have simple
code duplication, but you also have to maintain equality of implementation, not
just bug updates.

This isn't quite true, the setX is simply a wrapper for the property setter:

typeof(this) setX(int newval) { x = newval; return this; }

This can be reduced to a mixin.

2) You've increased the radius of comprehension of your library. Users have
to remember that both functions do the same thing and have to assign two
different names to the action in their head and then use them appropriately in
there code, based on the syntax they wish to use.

No they don't. This is a common argument against larger APIs. I know many many APIs where I don't *know* the whole API, I just know what I need to get my work done, and lookup anything else. If you want to use the setX version all the time, there is no need to learn the property functions. In fact, there is no more learning required for the setX version and the dual property/function version -- both have the same number of API calls.

Bottom line, increasing the number of documented calls does not make it harder to learn one of those calls.

I'm not arguing for or against larger APIs. My issue is with inefficient APIs. With dual property/function I can store a single entity in my mind (or in the docs) and then apply language rules to get 2 API calls. In the alternative, I have to store 3 entities, the two names and their relationship to each other, to get 2 API calls.

3) If setProp actually read better in real life, we'd use it. But it
doesn't, so we aren't. By the way, I would hazard that setX/getX are one
of the most famous/infamous pieces of API design out there and that everyone
can/does consider it.

Your opinion.  I have used it, and have had no complaints.

I'm not sure what you're implying/responding to here. My response was was that I (and almost everyone else) has used setX/getX at some point and always considers whether its the best choice for job (or not) and that implying that we didn't consider it during API design seems a bit condescending, nor is it really helpful to the discussion.

[snip]
 Without strict properties, the author of the code cannot enforce usage
semantics, and therefore, will lead to ambiguities. The only exception I can see is calling a function with no arguments which returns void without the parentheses. It cannot be mistaken for a property getter, because it can't
be used as a getter.

Could you please present an example of an ambiguity in the general case? (i.e.
excluding assignment to const/immutable/(static pure) functions and the
delegate() foo(){})

I mean semantic ambiguity, not compiler ambiguity. I mean, the choice of how the symbol can be used makes the symbol name ambiguous where it wouldn't be if the usage was locked to one way or the other.

Sorry, I was implying examples of semantic ambiguity with my request.
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to