[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