[swift-evolution] [Review] SE-0023 API Design Guidelines

Dave Abrahams dabrahams at apple.com
Sun Jan 24 13:27:16 CST 2016


on Sat Jan 23 2016, Erica Sadun <swift-evolution at swift.org> wrote:

>> On Jan 23, 2016, at 11:51 AM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> 
>> on Fri Jan 22 2016, Erica Sadun <swift-evolution at swift.org> wrote:
>> 
>
>>>> On Jan 22, 2016, at 4:24 PM, Dave Abrahams via swift-evolution
>>>> <swift-evolution at swift.org> wrote:
>>>> 
>>>> 
>>>> on Fri Jan 22 2016, Erica Sadun
>>> 
>>>> <swift-evolution at swift.org
>>>> <mailto:swift-evolution at swift.org>>
>>>> wrote:
>>>> 
>>>>> _______________________________________________ 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>
>>>>> 
>>>>> Current:
>>>>> 
>>>>> * Use imperative verb phrases for mutating methods: x.reverse(), x.sort(), x.tweak()
>>>>> * Use noun phrases for non-mutating methods: x.distanceTo(...), idx.successor()
>>>>> 
>>>>> Proposed:
>>>>> 
>>>>> * Use verb phrases to declare procedural methods, whether or not they mutate an instance or just produce side
>>>>>   effects: x.reverse(), x.sort(), x.tweak(), x.perform(), x.dispatch(), x.send()
>>>>> * Use noun phrases to describe values returned by a functional method: x.distanceTo(y), index.successor() (This
>>>>>   admittedly leaves further issues around other functional methods, for example, seq.separatedBySequence(seq) and
>>>>>    int.strideTo(other: Self, step:Self.Stride), etc. )
>>>>> 
>>>>> I suggest that mutating methods are just a procedural method (side effect, no return value) vs functional.
>>>> 
>>>> Hi Erica,
>>>> 
>>>> When you propose a change, could you please explain why you think your
>>>> change is an improvement?  
>>>> 
>>>> Thanks,
>>>> Dave
>>> 
>>> I believe the current distinction is misguided in focusing on mutating and non-mutating implementations when the
>>> differentiation can be viewed from a more general level. There are two ways to distinguish these:
>>> 
>>> * Does this method or function have side effects (which is what the current API approach intends to address); and
>>> * Is this method or function inherently functional or procedural in
>>> nature, returning a value or not.
>> 
>> Okay, I understand what you're driving at, but these don't seem to be
>> separate distinctions.  Can you show me a method that's inherently
>> functional but has side effects, or inherently procedural but has none?
>
> func loginWithCredential(credential: SomeCredentialType) -> SuccessTokenType? {...}
> func printThisValueNicelyFormatted<T>(something: T) {...}

Which one of these would you say is "inherently functional?"  They both
just look like methods with side-effects that would demand a verb phrase
according to your first criterion about side-effects.  Why introduce the
"functional/procedural" distinction?

>>> For example, contrast sort() and sortInPlace().  Even with the current
>>> approach they lack a natural clarity. You could easily swap
>>> them without anything "breaking" in understanding because your
>>> solution is conventional, not based on any underlying principle.
>> 
>> There's certainly an underlying principle there: that methods that
>> mutate the receiver, and have a nonmutating counterpart that instead
>> returns a modified *copy* of the receiver, are named with "InPlace"
>> suffix.  It's not as general as what you're suggesting, but it's
>> something.
>> 
>> How could one could ever call a nonmutating method that returns a new
>> collection "sortInPlace," without causing confusion?  How would people
>> interpret "InPlace" as conveying meaningful information?
>
> I could imagine two algorithms, one that limits excess memory by
> sorting in place, and another that uses sort-and-copy-back, so the
> sort is not done in place. 

Yeah, but we don't name things according to their implementation
details, we name them according to their semantics.

> My point is not that this is ideal naming but that I was addressing
> the example that was part of the original.

Sorry, I don't understand what you mean here.  If I'm just being too
dense to deal with, please feel free to declare my understanding of this
sentence inessential. :-)

>> With noun/verb naming, the function name reflects the
>> functional/procedural underlying differentiation. 
>>
>>> * A function produces something: f(x) -> y. 
>>> * A procedure does something: g(x) -> Void
>>> 
>>> Under my proposed change, the procedural variation would be sort,
>>> sortInPlace, etc. Optional adverbs and near-adverbs
>>> could distinguish similar versions sortQuickly, sortBalanced, etc.
>>> 
>>> The functional would be sortedVersion or with a slight rule tweak that
>>> infers the subject of the action, sorted. 
>> 
>> Two issues with "sortedVersion":
>> 
>> 1. "Version" is needless for readability.  "Return the list of names,
>>   sorted."
>
> I included this to force it to be a noun because I was trying to keep with the
> examples used in the original. 

Which original and which examples?  I'm sure these questions are
frustrating, but I am trying and I truly don't get it...

Sorry,

-- 
-Dave



More information about the swift-evolution mailing list