[swift-evolution] [Review] SE-0023 API Design Guidelines (when to use properties)
Rod Brown
rodney.brown6 at icloud.com
Sun Jan 31 07:46:17 CST 2016
I can't believe I let it get this far before I began to post regarding these language proposals.
> What is your evaluation of the proposal?
I like the proposal, and the direction it shows for Swift. I'm particularly fond of the concise nature of the language.
I wonder specifically whether cases of ivars should be lower or upper case. I tend to think lower case makes more sense in the context of Swift, but I am personally fond of the upper camel case. Perhaps my eyes have just grown accustomed?
I am particularly in favour of the sort() vs sorted() verb vs noun. I definitely see the points raised and acknowledge that the subtleties of language mean there will always be exceptions to rules where it doesn't make sense, and I think the "inPlace" wording makes sense to fill this gap.
I'm personally not a fan of the strong guidance to eliminate initial argument labels. I find this somewhat of a holdover from the awkward translation of Obj-C APIs, and I think there are cases where the initial parameter makes sense to be named. The login example, while it has its flaws, makes some sense here.
loginWithUsername("Rod", password: "Password")
vs
login(username:"Rod", password: "Password")
Placing the WithUsername prior to the bracket implies that the username has more importance, at least to my eye. As has been discussed, it probably does have more importance, but I think it makes a fair point that there are cases where both arguments are simply peers that should be labeled without emphasis on the leading item. I think that naming each parameter for clarity makes sense in those cases, and this should be noted in documentation.
For all other elements, I am definitely in favour.
> Is the problem being addressed significant enough to warrant a change to Swift?
I definitely think the language benefits from guidance like this. I wonder whether we may need to come back and review this in a few years as we see where Swift goes, but my hope is it keeps the same basic feel.
> Does this proposal fit well with the feel and direction of Swift?
These language directions seem very consistent with Swift's direction.
> If you have used other languages or libraries with a similar feature, how do you feel that this proposal compares to those?
I find languages with clear guidelines tend to be somewhat more ordered. I'm definitely in favour of the a reference document that outlines standard practice, as it is beneficial both when teaching, and when reading people's code. Consistency breeds clarity, and these
> On 31 Jan 2016, at 3:09 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>
>
>
>> on Sat Jan 30 2016, Howard Lovatt <swift-evolution at swift.org> wrote:
>>
>> I disagree that a property should imply O(1), this is an implementation
>> detail that might change.
>
> Not that I really want to argue this, as I am resigned to the fact that
> we will not tie performance to property-ness, but...
>
> Efficiency characteristics are no mere implementation detail, at least
> not in the standard library.
>
>> For example an array based collection will almost always have a count
>> property that is O(1),
>
> You can strike "almost" :-)
>
>> but a liked-list based collection will almost always be O(N).
>
> It really depends on whether you allow O(1) splicing. Without
> supporting O(1) splicing, it's really easy for a linked list
> to have an O(1) count. And with cacheing, you can even arguably have an
> amortized O(1) count.
>
> But even if a linked list has O(N) count, I don't see that what you're
> describing indicates anything, by itself, about whether something being
> a property should have performance implications. There has to be an
> underlying assumption that an Array's count must be a property, or
> something else of that sort, in the background.
>
>>>> On Friday, 29 January 2016, Michael Wells <michael at michaelwells.com> wrote:
>>>
>>>
>>>>>> ,----[ Side Note, since you mentioned efficiency ]
>>>>>>> | I originally wanted to uphold the principle that, “if it isn't
>>>> O(1),
>>>>>> you
>>>>>>> | don't make it a property.” The implication is that on collections,
>>>>>>> | “count” would be a method. That would include Array, for which
>>>>>> counting
>>>>>>> | the elements *is* O(1). Some people argued that:
>>>>>>> |
>>>>>>> | 1. The idea of writing “a.count()” instead of “a.count” to count
>>>> the
>>>>>>> | elements of an Array was absurd.
>>>>>>> | 2. Programmers don't draw conclusions about efficiency based on
>>>> whether
>>>>>>> | something is a property.
>>>>>>> | 3. The fact that Array would have an O(1) non-property that *could*
>>>>>> have
>>>>>>> | been a property (if it weren't for CollectionType conformance)
>>>>>>> | undermines any communicative power that you might get from using
>>>>>> this
>>>>>>> | distinction to choose properties.
>>>>>>> |
>>>>>>> | I did not win that argument :-)
>>>
>>> I strongly agree that properties imply O(1) and most programmers I’ve ever
>>> worked with make the same assumptions. Even if the documentation says
>>> otherwise, code like
>>>
>>> fibonacciNumbers.count
>>>
>>> looks as if you’re accessing a c-style field ‘count’ and that implies (at
>>> least to me) that it is a near-costless operation. Some of the biggest
>>> design mistakes I’ve ever seen use properties that trigger time-consuming
>>> operations like database or network access.
>>>
>>> And I don’t think having to use a.count() is absurd. :-)
>
> --
> -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/20160201/f31becc7/attachment.html>
More information about the swift-evolution
mailing list