[swift-users] Comparing POP to OOP
Dave Abrahams
dabrahams at apple.com
Mon Mar 7 17:15:35 CST 2016
on Mon Mar 07 2016, Jon Hoffman <hoffman.jon-AT-gmail.com> wrote:
>> On Mar 6, 2016, at 11:53 PM, Dave Abrahams <dabrahams at apple.com> wrote:
>>
>>
>> on Sun Mar 06 2016, Jon Hoffman <hoffman.jon-AT-gmail.com> wrote:
>>
>
>>>> On Mar 6, 2016, at 1:12 AM, Dave Abrahams via swift-users <swift-users at swift.org> wrote:
>>>>
>>>>
>>>> on Sat Mar 05 2016, Jon Hoffman <swift-users-AT-swift.org> wrote:
>>>>
>>>
>>>>>> On Feb 25, 2016, at 7:35 PM, Dave Abrahams via swift-users <swift-users at swift.org> wrote:
>>>>>>
>>>>>>
>>>>>> on Sun Feb 14 2016, zhaoxin肇鑫 <swift-users-AT-swift.org> wrote:
>>>>>>
>>>>>
>>>>>>> I have not read your blog. But in my opinion, what Apple called protocol
>>>>>>> programming is actually so called functional programming. It is not object
>>>>>>> programming at all. It uses protocols and structs to avoid object
>>>>>>> programming.
>>>>>>
>>>>>> I don't think most functional programmers would recognize
>>>>>> protocol-oriented programming as what they do. It is true that one of
>>>>>> the main benefits we see in protocol-oriented programming is that it
>>>>>> allows one to use *mutable* value types, instead of classes, in
>>>>>> polymorphic contexts. Functional programming is largely concerned with
>>>>>> immutable data, where the distinction between value and reference
>>>>>> semantics disappears, and it doesn't matter if you're using classes or
>>>>>> not. But the main thing in FP is the use of higher-order functions,
>>>>>> which Swift enthusiastically supports, but have nothing whatever to do
>>>>>> with protocol-oriented programming.
>>>>>
>>>>> Your e-mail touches on one of the things that excites me the most
>>>>> about Swift. As you say “But the main thing in FP is the use of
>>>>> higher-order functions, which Swift enthusiastically supports, but
>>>>> have nothing whatever to do with protocol-oriented programming”.
>>>>> Swift isn’t just a Protocol-Oriented programming language or an
>>>>> Object-Oriented language or a functional programming language it is
>>>>> actually all of them and more. While other languages attempt to
>>>>> support different paradigms, in my opinion, Swift is one of the few
>>>>> language that actually does a good job at supporting multiple
>>>>> paradigms.
>>>>>
>>>>> In the conclusion section of my post, I mention that while I pointed
>>>>> out a lot of ways that I believe POP is superior to OOP I would not
>>>>> say that POP is a clear winner over OOP.
>>>>
>>>> It would be interesting to see where you think OOP has a distinct
>>>> advantage due to fundamental properties of the paradigms (rather
>>>> than artifacts of an immature implementation of protocol language
>>>> features)
>>>
>>> I would not say that OOP has a distinct advantage over POP based on
>>> the fundamental properties of the paradigms. However, if I were
>>> pressed I would say that OOP does have an advantage over POP in the
>>> area of data structures because of POP emphasis on value types over
>>> reference types.
>>
>> “Protocol-oriented” doesn't mean “no reference types.” It means you're
>> not forced into reference semantics just because you want polymorphism.
>>
>>> For example we cannot create a linked list with a value type.
>>
>> Not true, in fact.
>>
>> enum List<T> {
>> case Empty
>> indirect case NonEmpty(T, List)
>> }
>>
>> var x: List = .NonEmpty(3, .NonEmpty(4, .Empty))
>>
>> There are other ways, but that's the simplest in Swift.
>
> I stand corrected; I neglected to think about using the enumeration.
Note again: there are other ways, e.g. you can make it immutable or
build it with COW.
> Yet another blog post coming from our conversation.
>
>>
>>> If we tried we would get a compile time error that says: “Recursive
>>> value type ‘Type’ is not allowed.
>>>
>>> There are two arguments that I could make off the top of my head
>>> against my last statement. The first argument would be: Is preferring
>>> value types to reference types actually part of OOP.
>>
>> I presume you meant POP. Being forced to use reference types is part of
>> OOP.
>>
>>> I will address this in my next e-mail where you ask me what I mean by
>>> my statement that POP is about so much more than the protocol. The
>>> second argument would be that we are not limited to value types with
>>> POP and we are able to still use reference types.
>>
>> Exactly.
>>
>>> While it is true that we are still able to use value types
>>> with POP
>>
>> reference types?
>
> Yes sometimes the fingers don’t always type what the brain tells them too. :)
>
>>
>>> however if we take Apple’s recommendation and use value types
>>> for our custom types we really should try our best to avoid reference
>>> types. It could get confusing if some of our types are reference
>>> types and some are value types especially for larger enterprise type
>>> projects.
>>
>> No, some things are fundamentally references, as I noted in the talk:
>> https://github.com/ASCIIwwdc/wwdc-session-transcripts/blob/master/2015/408.vtt#L3082
>>
>>> Luckily in XCode with have the quick documentation where we can hold
>>> down the option key and click on the type in question to tell us if it
>>> is a value or reference type however we do not have that option
>>> outside of the Apple’s ecosystem like when we are developing Linux
>>> applications with Swift. Therefore we need to be careful on how and
>>> when to use reference and value types.
>>
>> You always do need to be careful about that, regardless, because they
>> have different semantics.
>
> You are correct however my point with this is with other languages
> like Java and C# our custom types are reference types.
I don't think so:
C#: http://www.albahari.com/valuevsreftypes.aspx
Coming in Java 9: http://www.theserverside.com/news/2240234686/Devoxx-officially-kicks-off-with-Spring-Java-EE-8-and-the-women-of-IT
--
-Dave
More information about the swift-users
mailing list