Pretty please: Named arguments
Jim
bitcirkel at yahoo.com
Mon Feb 28 16:25:41 PST 2011
Jonathan M Davis Wrote:
> On Monday, February 28, 2011 14:25:05 Bekenn wrote:
> > On 2/28/11 1:38 PM, Don wrote:
> > > spir wrote:
> > >> On 02/28/2011 07:51 PM, Jonathan M Davis wrote:
> > >>> I'm not entirely against named arguments being in D, however I do
> > >>> think that any
> > >>> functions that actually need them should be refactored anyway.
> > >
> > > I agree.
> > > CreateFont() in the Windows API, I'm looking at you. (For Linux people,
> > > that function has about 12 parameters).
> >
> > That's a great example of where named parameters can come in very handy.
> > As a consumer of the API, you do not have the option of refactoring
> > CreateFont(); you have to play the cards you're dealt. Named arguments
> > allow you to annotate in a compiler-verified fashion.
> >
> > >> Just don't use them!
> > >
> > > You don't have that option. At least, if you're a library developer, you
> > > don't. (I'm a bit sick of people saying "you don't have to use it if you
> > > don't want to" in language design. If it is in the language, you don't
> > > have a choice. You will encounter it).
> >
> > You may encounter it, but nothing says you ever have to write it. There
> > is no way to write a function such that callers would have to use named
> > arguments in the function call. (If there were, then I'd agree with you
> > -- that would be bad.)
> >
> > > There are a couple of things that I really, really don't like about the
> > > names argument idea:
> > > 1. It makes parameter names part of the API.
> > > Providing no way for the function writer to control whether it is part
> > > of the API or not, and especially, doing it retrospectively, strikes me
> > > as extremely rude.
> >
> > A valid point. I think I would already consider parameter names to be
> > part of the API, though; generated documentation relies upon them, as do
> > contracts. Admittedly, this would be the first place where they leak
> > directly into caller code.
>
> And that's a _big_ problem. For instance, how many parameter names in Phobos
> were chosen with the idea that a caller would use them? _None_. And now, if
> named arguments are added, all of a sudden, you can't rename parameters without
> breaking code. I, for one, do not want to _increase_ the number of things that I
> can't change in code without breaking other people's code. And at least with
> functions, I could rename them and leave a deprecated alias. With parameters, I
> don't have that option. A poorly named parameter would be set in stone unless
> the whole function were renamed or we were willing to break other people's code.
> Named arguments _decrease_ flexibility as far as the API goes.
>
> On top of that, we would then have to worry about having high consistency in
> parameter names instead of just in function names. From the perspective of the
> library writer, this causes _more_ problems at _no_ benefit. From the perspective
> of the library user, it does provide some benefit, but I honestly do not think
> that
>
> func(x : 4, y : 5);
>
> is easier to read than
>
> func(4, 5);
>
> Sure, you have to know what func's parameters are, but you have to know that
> anyway. Only now, with named arguments, you have to care about what their
> _names_ are in addition to what they're for. I do _not_ want to have to read
> code which uses named arguments. It's just more clutter and more intellectual
> overhead.
>
> The sole type of case that I have seen where named arguments are of real benefit
> is where you're dealing with horribly written functions that have a ton of
> parameters, and I would _hope_ that that kind of nonsense would be restricted to
> old C APIs and the like. And if you have to deal with such C APIs from D, you
> can write a wrapper which uses a proper struct or whatnot to encapsulate that
> mess. Such horrendous functions shouldn't be the norm at all.
>
> As a library user, I see little benefit to named arguments and a definite problem
> with them in terms the added code clutter and intellectual overhead. As a
> library writer, it gives me _no_ benefit and definitely makes my life harder.
> Parameter names have never been part of a function's signature, and I _don't_
> want them to start being a part of it now.
>
> The more I think about this, the more I'm against the idea of named arguments.
>
> - Jonathan M Davis
I think it could be a real boon for generic code:
class House(Roof = Clay, Door = Wood, Window = Glass)
{
Roof _roof;
Door[] _doors;
Window[] _windows;
}
auto home = new House(Roof: Gingerbread, Window: Sugar)();
You would probably parameterize as much as possible, like the container types for _doors and _windows -- i.e. anything that isn't limited by the algorithm of your choice. Everything being optional of course, and all the work is all done at compile time.
This would give you _rich_ generic types with plain interfaces. You only specify what's important to you. How's that for a template library where every part can be shifted and replaced?
More information about the Digitalmars-d
mailing list