[swift-evolution] [Review] SE-0023 API Design Guidelines (when to use properties)

Dave Abrahams dabrahams at apple.com
Sat Jan 30 22:09:56 CST 2016



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



More information about the swift-evolution mailing list