純粹的面向對象語言比不是純粹的面向對象語言比起來,有什麼優點?

pure object oriented language (like Scala)和不是純粹的object oriented language(Like Java, C++)比起來有什麼優點?或者說為什麼在設計語言的時候,會選擇設計為pure object oriented?


scala 在知乎被黑的最慘的一次....


大概是自豪感比較強吧。


scala一點都不pure嗎,明明除了object oriented以外還有那麼多其他東西。pure的明明應該是Java。你看Java用起設計模式就一點多餘的想法都沒有,不像別的面向對象語言,還有那麼多更好的東西可以用,就會造成學習設計模式的時候,思想不堅定(逃


首先,面向對象是思想,具體的語言只不過是「語法是否更偏向」以及「風格和規範上是否更傾向」OOP,你用C寫代碼,一樣可以通過自己折騰虛表的方式弄出OOP風格,而就算用java,也可以純static方法編程,關係都不是很大

至於說優劣,個人覺得如果一個對象的數據(或設計,比如介面實際不含數據)就能決定它能做什麼,則用OOP,擴展性什麼的好一些,這個不廢話

但是如果對一個數據本身可能有各種處理,但你又不可能將其全部實現抽象為方法介面,那麼可能面向過程會更好一些,比如,我們計算平方根:

result = sqrt(x)

用OOP的寫法,就是

result = x.sqrt()

但如果哪天我們需要一個計算立方根的呢,或者其他數學運算,則後者的話,我們可能需要給x的類型添加上相關的方法,因為並不是所有方法都可以在定義x的類型時候完全確定,而且對需求方來說,x的類型很可能是封裝好無法修改的,更進一步的,假設這裡x的類型並非是一個具體的類,而是一個Number介面,引用的對象可能是Integer,Float浮點,Decimal十進位浮點,定點小數,以及可能是複數等,如果給Number加一個介面,則下面所有類都可能編譯不過

這時候使用面向過程,只需要新增一個函數,用x做參數即可,只要x提供一些get類的方法能暴露具體細節,讓外部來計算

有的語言比如go,可以在不修改原類定義的情況下給類(go的是struct)添加方法,算是能進一步,不過也就是語法糖了

用一些設計模式或許也能解決這類問題,不過我不是很熟,而且估計也比面向過程編程裡面加個函數麻煩很多


我只知道「純」面向對象有什麼缺點

本來

x = a.v;

就能解決的事大概要寫成

x = A::create(a.getValue());


Code Mesh 2016上Alan Kay已經欽定了Erlang才是純面向對象語言

有圖為證。不過圖從網上是偷來的


純面向對象性能有問題,Elixir這種管道方式效能更好。


smalltalk

Everything is Object


學習一個去意識形態化吧,少年


居然說Scala是純粹OO,官網標題上面好大的字


沒有任何優點,又臭又長又冗餘


1.純。

2.蠢。


那個純是廣告詞,如果非要在面向對象前面加個純字,我覺得是smalltalk


推薦閱讀:

c++里如何理解vector是動態數組,而這個單詞本義是向量?為什麼這麼叫?
誰能介紹一下清北的信科體驗營的基本情況?
為什麼埃式篩法的時間複雜度是O(nloglogn)?
數學基礎課在計算機領域的應用有哪些?
車萬翔是誰?在他的背後又有哪些傳奇經歷?

TAG:Java | Scala | 計算機科學 | C |