[swift-evolution] When to use argument labels, part DEUX

Dave Abrahams dabrahams at apple.com
Thu Feb 11 12:43:00 CST 2016


on Thu Feb 11 2016, Radosław Pietruszewski <swift-evolution at swift.org> wrote:

>> To do a complete evaluation also need to think about
>> what applying the guidelines will do to your own code.
>
> You’re right! I extracted the list of method definitions from my app and looked through it.
>
> The overwhelming majority of my methods either take no arguments, or
> start with a verb and make a phrase where the first parameter doesn’t
> require a label (rule B1).
>
> Some methods I noticed (I don’t know if this is useful for you, but if
> it is then here you go):
>
> 	private func setHandoffState(hash hash: String, fallbackURL: String, title: String? = nil, searchable: Bool) {
>
> This seems OK to me, but I’m not entirely sure if the guidelines
> suggest I _should_ put a preposition there, i.e.
>
> 	setHandoffStateFor(hash: a, fallbackURL: b, …)
>
> I don’t think I should — I don’t see how “for” adds to clarity here,

Me neither, but it's hard to tell what this method is supposed to mean.
Maybe you could explain (or show a beautifully crafted doc comment
(BCDC) per
<https://swift.org/documentation/api-design-guidelines/#write-doc-comment>
;-)

> but I want to make sure if I interpret the proposed guidelines right.
>
> 	func actionForCommand(command: UIKeyCommand) -> String? {
>
> This should become “actionFor(command: c)” — which isn’t an obvious

That looks like a call, in which case the API above doesn't allow an
argument label.  (I think this kind of confusion is probably the
strongest reason for changing the default---I see it come up over and
over).

> win, but I certainly don’t mind it.

according to where we're currently headed (prepositions inside the
parens), it would be:

    func action(for command: UIKeyCommand) -> String? {

> 	private func createAttribute(tag: SecItemAttr, _ data: NSString?) -> SecKeychainAttribute? {
>
> Forgive my barbaric removal of external labels. 

Nit: “argument labels,” please. 

> It should be `createAttribute(tag: t, data: d)`. 

Again that looks like a call, so for the above declaration it would be

      createAttribute(t, d)

> Alternatively, it could be `attributeFor(tag: t, data: d)` — I could
> go either way.

Why “for?” Can you explain the semantics of this method (or show a BCDC)?

> (adding to my thoughts on the later proposal of moving preposition
> inside parens, the symmetry in param labels would likely be broken
> here, because it doesn’t seem necessary to add “for”/“with” when I go
> with “createAttribute”, but for the noun-only version it would have to
> be “attribute(forTag: t, data: d)”.)
>
> 	func attachmentForImage(image: UIImage) throws -> Attachment {
> 	func attachmentForData(data: NSData) -> Attachment {
> 	func attachmentForFileURL(url: NSURL) throws -> Attachment {
>
> This should be `attachmentFor(image:)`, `attachmentFor(data:)`, and
> `attachmentFor(fileURL:)`. 

again, the latest draft puts prepositions inside the parens.  But
without the BCDC it's pretty hard to tell whether these are good names.

> This seems like a win, since related methods for different data types
> are grouped more tightly together. (I could also — like you suggested
> about not optimizing for method families — make an enum, but it would
> be overkill since it’s not API for public consumption. I should mark
> those as private.)

I'm not trying to say “method families are bad.”  I'm just saying I
don't want to build the guidelines around them if possible.

> 	private func messageCell(label label: String) -> MessageCell {
> 	private func cellForTask(task: Task, enabled: Bool = true) -> TaskCell {
>
> Hm, those are inconsistent. I could go with `cellFor(message:)` and

don't you mean cellFor(label:) ?

> 
> `cellFor(task:)`, which would be consistent with the guidelines. OTOH,
> since they return different types, I liked that they had different
> names… `taskCellFor(task:)` is redundant. Perhaps `taskCellFor(_:)`
> and `messageCellFor(_:)`.
>
> 	func generate(fill: Double, text: String) -> CLKComplicationTemplate {
>
> `templateFor(fill:, text:)`
>
> 	func update(from old: TaskCommentRowModel?, to new: TaskCommentRowModel) {
>
> That’s the, IMO rare, circumstance where the preposition *does* make sense to go inside the parens.
>
> * * *
>
> I mentioned this in some other post before, but I also found a bunch
> of methods where the first parameter should be labeled, but isn’t,
> because without an easy shortcut like the old #param, I was just too
> lazy to do The Right Thing.
>
> PS. If someone wanted to do the same thing and review methods in their
> project, here’s the quick&dirty Ruby script for this:
> https://gist.github.com/radex/b425c73afde84d88e4ca
> <https://gist.github.com/radex/b425c73afde84d88e4ca>
>
> HTH,
> — Radek
>
>> On 08 Feb 2016, at 21:55, Dave Abrahams via swift-evolution
>> <swift-evolution at swift.org> wrote:
>> 
>> 
>> on Mon Feb 08 2016, Radosław Pietruszewski <swift-evolution at swift.org> wrote:
>> 
>>> Dave,
>>> 
>>> First of all, thank you for enduring our nitpicks and complaints and
>>> continuing to explore the subject :) I think we’re all better off for
>>> it, and getting closer to the solution with each iteration.
>>> 
>>> You asked:
>>> 
>>>> 1. I'm not expecting these guidelines to make everybody optimally happy,
>>>>  all the time, but they shouldn't be harmful.  Are there any cases for
>>>>  which they produce results you couldn't live with?
>>> 
>>> And I think, by this standard, the guidelines you proposed seem to be
>>> a success. Looking through Doug’s diffs, I see a lot of method names
>>> that I don’t *love*, but I couldn’t find something I would hate.
>> 
>> That's great news!  Keep in mind, though, that Doug's results are just
>> the result of trying to approximate application of the guidelines by
>> using heuristics.  To do a complete evaluation also need to think about
>> what applying the guidelines will do to your own code.
>> 
>> Thanks,
>> 
>> -- 
>> -Dave
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> 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

-- 
-Dave



More information about the swift-evolution mailing list