[swift-evolution] Labels was Re: [swift-evolution-announce] [Review] SE-0023 API Design Guidelines
Erica Sadun
erica at ericasadun.com
Sun Jan 24 18:12:01 CST 2016
Again, I've taken some time and attempted to write this up more coherently:
https://github.com/erica/SwiftStyle/blob/master/ArgumentLabels.md <https://github.com/erica/SwiftStyle/blob/master/ArgumentLabels.md>
I've also updated the topic, so I can follow this more easily.
-- Erica
> On Jan 24, 2016, at 1:43 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>
>
> on Sat Jan 23 2016, Erica Sadun <swift-evolution at swift.org> wrote:
>
>> Dave,
>>
>> I typoed on the second and I was insufficiently clear on my point. Trying again:
>>
>> Prefer external names for the first parameter when the natural
>> semantic relationship between the parameters is stronger than their
>> relation to the operation.
>>
>> For example, the following calls use labels for the first parameter:
>>
>> login(userName: "blah", password: "...")
>> moveTo(x: 50.0, y: 30.0)
>>
>> This example is contrary to Swift's normal naming scheme which integrates the
>> first argument into the function or method name, for example:
>>
>> loginWithUserName("blah", password: "...")
>> moveToX(50.0, y: 30.0)
>>
>> The coupling between x and y, username and password, (and yes it is a judgement call)
>> should be considered as a reason to employ an external label.
>
> Yeah, I understand what you're going for, but it doesn't seem very crisp
> to me. Personally, I think Rob Mayoff's suggestion
>
> loginAs(me, password: mySecret)
>
> is pretty awesome. Fundamentally, the username is driving the call, and
> the password is a piece of dependent information you have to match up to
> it.
>
>> I had included the following as a counter example:
>>
>> addLineToPoint(p1, withWidth: 25.0)
>>
>> In this call, the point and width have no natural or compelling relationship and there's no reason to
>> create an external label for the first argument. This example follows the standard
>> Swift call approach.
>
> Up to now, there has been no "standard Swift call approach," so I don't
> know what this means.
>
>> Differentiate related calls whose implementations are distinguished by their
>> parameters, as you would with initializers, using first parameter labels.
>>
>> Instead of loginWithUserName("blah", password: "...") and loginWithCredential(myCredential),
>> prefer:
>>
>> login(userName: "blah", password: "...")
>> login(credential: myCredential)
>
> So, how does this proposal improve understandability of use-sites?
>
>> And to reply to another point raised in-thread:
>>
>> When working with standard library calls, retain APIs even if they are
>> not sufficiently clear from a Swift design perspective rather than
>> wrapping-the-cat to provide a Swift interface that doesn't really
>> exist. (As the call is just a redirection.)
>>
>> For example, prefer
>>
>> let x = pow(2.0, 5.0)
>>
>> to
>>
>> let x = raise(2.0, toPower: 5.0)
>>
>> In this example, the two arguments for pow are not specified as this call is sourced
>> externally and follows the naming convention for math.h.
>
> This idea is already captured in the guidelines; the reasons to use
> "pow(x, y)" are the same as the reasons to use "sin(x)".
>
> --
> -Dave
>
> _______________________________________________
> 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/20160124/dc9c4508/attachment.html>
More information about the swift-evolution
mailing list