[swift-evolution] [Guidelines, First Argument Labels]: Prepositions inside the parens

Dave Abrahams dabrahams at apple.com
Wed Feb 10 17:17:44 CST 2016


on Wed Feb 10 2016, Matthew Judge <matthew.judge-AT-gmail.com> wrote:

> On Tue, Feb 9, 2016 at 2:18 PM, Dave Abrahams via swift-evolution <
> swift-evolution at swift.org> wrote:
>
>>
>> Hi everybody,
>>
>> Having looked at some examples, the API guidelines working group members
>> that were present this morning agreed we really want prepositions inside
>> the parentheses of method calls.
>>
>> Here are some results for the importer; we're still tuning some of the
>> heuristics but overall we feel very good about the preposition
>> placement:
>>
>>
>> https://github.com/apple/swift-3-api-guidelines-review/commit/da7e512cf75688e6da148dd2a8b27ae9efcb8821?diff=split
>>
>> Note that this is not final wording, but here are the guidelines we're
>> working with for first argument labels:
>>
>> A. Try to form a grammatical phrase including the first argument and
>>    describing the primary semantics at the call site.
>>
>
> I assume that A is intended to cover:
>
> a.addObserver(b) // yes
> a.add(observer: b) // no

I don't know what you mean by "cover." It isn't intended to assign the
"yes/no" decision to those; they both form (the same) grammatical phrase
at the call site.  The choice between those two is governed by B, below.

> I believe I can read this behavior into A by inferring "a grammatical
> phrase including [the base name and] the first argument" but I want to make
> sure this is the intent.
>
>>
>> B. The first argument gets a label when and only when:
>>
>>    1. It does not form part of a grammatical phrase describing the
>>       primary semantics.  For example,
>>       ```
>>       x.dismiss(animated: y)
>>       ```
>>       [more examples needed]
>>       Note that parameters with defaults never describe the primary
>>       semantics. so are always labeled.
>>       ```
>>       func invert(options options: SomeOptionSet = []) // yes
>>       func invert(_ options: SomeOptionSet = [])       // no
>>       ```
>>
>>    2. The method is a factory method; such calls should mirror
>>       initializers, with no preposition.  For example,
>>       ```
>>       let x = UIColor(red: r, green: g, blue: b)
>>       let y = monitor.makeColor(red: r, green: g, blue: b)
>>       ```
>>
>
> If rule B.2 didn't exist
>
> let y = monitor.makeColor(red: r, green: g, blue: b)
>
> would still have the first argument labeled by B.1 wouldn't it? 

Yes, but you could have done this grammatically, as 

     let y = monitor.makeColorHavingRed(r, green: g, blue: b)

That's what B2 is designed to prevent.

> (Though without this rule, the guidelines wouldn't be clear on whether
> or not to include prepositions in the argument labels.)
>
>>
>>    3. It is part of a prepositional phrase
>>
>>      a. The label normally starts with the preposition.
>>         For example,
>>         ```
>>         x.move(from: a, to: b)
>>         x.loadValues(forKeys: ["fox", "box", "lox"])
>>         ```
>>      b. ...unless the preposition would break a very tight association
>>         between parameters:
>>         ```
>>         x.moveTo(x: a, y: b)
>>         ```
>>         [encourage grouping parameters into higher-level concepts,
>>         e.g. Point, in these cases]
>>
>>
> This seems clear and straightforward to apply. The only place where
> this isn't totally clear is when there are multiple prepositions (as
> highlighted in Jacob's response), 

Multiple prepositions before the first argument?

> but I think B.3 provides the right level of guidance... much more
> detail will start being too many guidelines and special cases.

Thanks!
-- 
-Dave


More information about the swift-evolution mailing list