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

Charles Kissinger crk at akkyra.com
Thu Feb 11 12:11:23 CST 2016


> On Feb 11, 2016, at 2:33 AM, Radosław Pietruszewski 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.
> 
> I find that… surprising.
> 
> Between these two (sorry to repeat the same example again):
> 
> func trackWith(trackID trackID: CMPersistentTrackID) -> AVAssetTrack?
> func track(withTrackID trackID: CMPersistentTrackID) -> AVAssetTrack?

I think this one particular function is possibly the worst case in the entire API. Neither “track” nor “trackWith” is a particularly good function name. But as I mentioned in a previous post, I think, for many of the Foundation functions, moving the prepositional phrase into the argument label actual aids clarity slightly. I was surprised that I ended up liking it, but I do.

> 
> #1 seems nicer and clearer to me. Having “with” as the first word glued to a parameter label looks bizarre to my eyes:
> 
> As far as I understand it, the whole reason to keep “with” etc in many APIs was to make cases like this one clearer. Because “track” as a name doesn’t tell you much. Someone said that having the method name end with “With” creates a sense of suspense, and to me that was precisely what was a good thing about it. It’s not just “track”, it’s a “track with” — ooh, here come the criteria for the track! Having removed “with” from the name itself, we lose, IMHO, the clarity this word was supposed to bring in initializer/getter/finder-like methods. And we still keep the word later inside the parens, but to my eyes it no longer helps clarity, just exists as a vacuous, needless word.
> 
> Another reason I don’t like this, say we have:
> 
> 	a.tracks(withMediaType: b, composer: c)
> 
> This no longer looks symmetrical across the parameters. First parameter has label “with”, second doesn’t.

I sympathize with this. My attitude about it, though, is that we would normally only say “with” before the first item in a list, and dropping the “and” from before the final item is a fairly minor offense against the English language. I personally don’t think clarity is really harmed. It might help to add specific guidance that using “and” in these cases is discouraged.

—CK

> The previous version:
> 
> 	a.tracksWith(mediaType: b, composer: c)
> 
> Didn’t have that problem.
> 
> I fear that people will take that as a signal that they should make the whole method, including parameter labels, sound like an English sentence and will start applying needless words like “and”:
> 
> 	a.tracks(withMediaType: b, andComposer: c)
> 
> To avoid this weird-looking construct where the first parameter has a starting preposition, and other parameters don’t. Again:
> 
> 	a.tracksWith(mediaType: b, composer: c)
> 
> Doesn’t have this problem, because while the method name part ends with “With”, the parameters are consistently just nouns.
> 
> So -1 from me on this. Moving prepositions inside parens look like a step back from the Part DEUX Proposal.
> 
> Would you mind elaborating on the working group's rationale for moving prepositions inside parens?
> 
> 
> — Radek
> 
>> On 09 Feb 2016, at 20:18, Dave Abrahams via swift-evolution <swift-evolution at swift.org <mailto: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 <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.
>> 
>> 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)
>>      ```
>> 
>>   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]
>> 
>> 
>> 
>> Feedback most welcome, of course.
>> -- 
>> -Dave
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160211/2e1612d1/attachment.html>


More information about the swift-evolution mailing list