[swift-evolution] [swift-evolution-announce] [Review] SE-0023 API Design Guidelines
Dave Abrahams
dabrahams at apple.com
Sun Jan 24 17:04:57 CST 2016
on Sun Jan 24 2016, David Owens II <swift-evolution at swift.org> wrote:
>> On Jan 23, 2016, at 11:53 AM, Dave Abrahams via swift-evolution
>> <swift-evolution at swift.org> wrote:
>>
>>
>> on Fri Jan 22 2016, David Owens II <swift-evolution at swift.org> wrote:
>
>>
>>>> Be Grammatical
>>>>
>>>> When a mutating method is described by a verb, name its non-mutating
>>>> counterpart according to the “ed/ing” rule, e.g. the non-mutating
>>>> versions of x.sort() and x.append(y) are x.sorted() and
>>>> x.appending(y).
>>>
>>> Is this guideline suggesting that we should design our APIs to
>>> generally have both mutating and non-mutaging counterparts?
>>
>> Definitely not.
>>
>>> As other have pointed out, this is also very hard to do all the
>>> time. I think the alternatives are worse.
>>
>> The alternatives to always creating mutating/nonmutating pairs? What
>> alternatives have you considered, and what do you see the consequences
>> to be?
>>
>>> It would be nice if there were a way to annotate all member functions
>>> as mutating/non-mutating to really by-pass this ambiguity.
>>
>> I don't know what you mean by that. Can you explain?
>>
>> FWIW, there are potential language-level approaches to this problem
>> (e.g. https://github.com/apple/swift/blob/master/docs/proposals/Inplace.rst),
>> but in the absence of language features, it's something we need a
>> convention for.
>
> Exactly. It seems like this convention is a work-around for a language
> design deficiency. In the case of value types, there are indeed other
> solutions that could even allow the same name for functions to be used
> for both mutating and non-mutating. The key thing of importance is
> bringing that clarity to the call site.
>
> I think there are some interesting proposals in the link provided. Another potential:
>
> var items = [...]
> mut items.sort() // sorts the items in-place
> let copy = items.sort() // sorts a copy of the items and returns that copy
>
> let items = [...]
> mut items.sort() // error: unable to mutate a constant value
>
> The other potential thing to look it is what it means for class-types
> to allow mutation. I simply cannot trust a class-type that has a
> function named with the correct guidelines or an "InPlace" suffix to
> actually return a real copy of the class type.
I'd love to discuss langauge features for handling this, but let's take
all of that into a separate thread, please.
> I guess my point is this: codifying a convention seems pre-mature as
> that convention doesn't bring the safety goals of the language into a
> place that's verifiable. All of the other guidelines are simply about
> clarity of use, this convention has a far reaching impact.
Sorry, could you clarify what you mean by "bring the safety goals of the
language into a place that's verifiable" and clarify why having a "far
reaching impact" would somehow conflict with being "about clarity of use?"
It seems to me that this convention is about how to express whether a
method is going to mutate so it's clear at the use-site. What am I
missing?
--
-Dave
More information about the swift-evolution
mailing list