[swift-evolution] [Review] SE-0023 API Design Guidelines

Dave Abrahams dabrahams at apple.com
Sun Jan 24 19:43:51 CST 2016

on Sat Jan 23 2016, Joe Groff <swift-evolution at swift.org> wrote:

> This all looks good to me (aside from the linguistic problems with
> verb conjugation I've raised in another subthread). However, I think
> these naming guidelines lead us to reconsider our default argument
> labeling rules for 'func' declarations again, as David Owens and
> others have suggested. The stated goal of the current language rule is
> to guide people into good API design following our conventions, but I
> don't think it succeeds in serving that purpose. If you follow the
> guidelines, the argument labels for your secondary arguments generally
> end up becoming prepositional phrases, which make for poor variable
> names, 

Hi Joe, 

Like Doug, I disagree that we guide you into using prepositional phrases
for secondary arguments.  But I really want to address the "poor
variable names" part of what you said.  It's true, as far as it goes,
but one thing nobody knows is that there are a few more guidelines
planned that didn't make it out in time for the review.  One goes
something like this:

   Choose parameter names to serve your documentation comment. These
   names are not API, but they still matter.  Well-chosen names allow
   the summary to read smoothly and to fully-describe the API in just a
   few words.

The main audience for the argument label is the reader of the use-site,
while the main audience for the parameter name is the reader of the
documentation and declaration.  Therefore, they should often be
distinct, and whether an argument label makes a good parameter name is
mostly immaterial.

> and you're naturally guided to giving the argument an explicit
> descriptive binding name:
> func perform(stuff: Stuff, with: Thing) {
>   with.apply(stuff) // 'with' is a weird variable name
> }
> func perform(stuff: Stuff, with thing: Thing) {
>   thing.apply(stuff) // 'thing' is better
> }
> The shorthand thus doesn't save the good API citizen from much
> work. 


> On the other hand, a developer who's unaware or uninterested in the
> guidelines and is just trying to C or Java in Swift gets argument
> labels by default that neither follow the guidelines nor meet their
> expectation:
> func atan2(y: Double, x: Double) -> Double { ... }
> atan2(10, 10) // Why doesn't this work?
> atan2(10, x: 10) // Nobody wants this
> And when staring down potentially dozens or hundreds of compile errors
> at various mismatched use sites, 

That apocalyptic-sounding scenario went by too fast for me to imagine
how it actually arises.  Care to spell that out?

> they're unlikely to reconsider their API naming choice, and will
> instead do the minimal amount of work to get their code to compile by
> suppressing the argument label. The language hasn't led this developer
> to better conventional API design either.
> I can think of a couple possible modifications to the language rule
> that could help reduce the surprise factor, and still lead people to
> good API design:

I'm all for having a discussion of different language rules, but let's
keep them in a separate thread, please!


More information about the swift-evolution mailing list