# Comparing POP to OOP

**URL:** <https://forums.swift.org/t/comparing-pop-to-oop/1438>\
**Category:** Using Swift\
**Created:** [February 14, 2016, 11:59pm UTC](https://forums.swift.org/t/comparing-pop-to-oop/1438 "2016-02-14T23:59:05Z")\
**Posts on this page:** 1\
**Showing post:** 12

<div class="post-metadata">

**Author:** ![dabrahams](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/dabrahams/32/9815_2.png) [@dabrahams](https://forums.swift.org/u/dabrahams)\
**Post date:** [March 7, 2016, 4:53am UTC](https://forums.swift.org/t/comparing-pop-to-oop/1438/12 "2016-03-07T04:53:42Z")

</div>

> > > > > 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.

&nbsp;&nbsp;enum List\<T\> {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case Empty  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indirect case NonEmpty(T, List)  
&nbsp;&nbsp;}

&nbsp;&nbsp;var x: List = .NonEmpty(3, .NonEmpty(4, .Empty))

There are other ways, but that's the simplest in Swift.

> 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?

> 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](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.

> Where I really think OOP has a very distinct advantage of POP is that  
> it has been around for so long, has been vetted in more projects then  
> either of us can count and it is very well documented.

Yes, that was the one argument I thought could be defensibly made for  
OOP over POP.

> I don’t know if anyone can really say that Apple has documented what  
> POP is and isn’t very well

Absolutely, we have not.

> which is the reason I wrote my book on POP and why I plan on writing  
> additional posts on it as well.

I'm looking forward to seeing more of that, and I like to help you  
capture more of what we mean by POP.

> If you do a search on the Internet for Protocol-Oriented programming  
> you get a number of different views on what it is and what it isn’t.  
> Most of the articles, in my opinion, take a very narrow view of POP  
> and try to fit it into the OOP model but with an Interface first  
> approach which, once again in my opinion, misses the larger view.

Yes!

> **···**
>
> 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@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@swift.org\> wrote:  
> > > > > on Sun Feb 14 2016, zhaoxin肇鑫 \<swift-users-AT-swift.org\> wrote:
> 
> > Once again I will explain this more in my next e-mail where I address  
> > your question about what I mean when I say that POP is about so much  
> > more than the protocol.
> > 
> > Jon
> > 
> > > > The winner is actually the programmer because we are not limited to  
> > > > one programming paradigm. We can choose the paradigm that fits our  
> > > > needs. Personally I have use POP in a number of projects and I  
> > > > definitely prefer it to OOP or FP but I would not criticize anyone  
> > > > that uses the other two because they are very valid paradigms that  
> > > > have proven over time.
> > > 
> > > --  
> > > -Dave
> > > 
> > > \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_  
> > > swift-users mailing list  
> > > swift-users@swift.org  
> > > [https://lists.swift.org/mailman/listinfo/swift-users](https://lists.swift.org/mailman/listinfo/swift-users)
> 
> --  
> -Dave

---

_[View the full topic](https://forums.swift.org/t/comparing-pop-to-oop/1438)._
