[swift-evolution] When to use argument labels, part DEUX
Radosław Pietruszewski
radexpl at gmail.com
Thu Feb 11 15:33:44 CST 2016
>> 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 <https://swift.org/documentation/api-design-guidelines/#write-doc-comment>>
> ;-)
Ahh, but I’m missing BCDCs in many of these places ;)
This is a helper that essentially makes a NSUserActivity from passed parameters and calls `becomeCurrent` on it. (Pretty much changes application-global state.) (Not the most elegant solution, I know.)
>
>> 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’m sorry — I got confused — what do you mean here?
> (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.
Noted.
>
>> 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)?
This is a initializer-like helper method that instantiates a SecKeychainAttribute from passed parameters.
>
>> (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.
Q: For the previous example you suggested the latest draft would be `action(for:)`. Given these methods take one of three different parameter types, and the names mostly just repeat type information, should they all be `attachment(for:)`? Or `attachment(forImage:)` etc? The third method is trickier because it takes an NSURL, but there is an assumption this is a _file_ (i.e. device-local) URL.
> But
> without the BCDC it's pretty hard to tell whether these are good names.
Also an initializer-like helper method that transforms passed parameters into an Attachment.
>
>> 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 <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 <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>
> --
> -Dave
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution <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/11d89357/attachment.html>
More information about the swift-evolution
mailing list