如何理解 "面向對象構建,函數式運行才是軟體開發的王道"?

---- 非釣魚貼!引用@杜帥回答裡面的話而已,請各位大大不要跑題,請教問題而已!!

寫前端代碼有2年了(半路出家),覺得自己已經過了只是實現業務的階段了,希望有更一層的突破,到現在一直在找正確的開發姿勢,如何寫前端代碼才是好代碼,看到這句話覺得有點懂了,但是不是很清晰... 望不吝賜教


看了下原文。

原則上不能同意,函數式編程的可讀性也可以很好的。OO看起來可讀性好是因為即使是動態類型,也會有類和方法來描述類型。函數式寫法的Racket和JavaScript都是匿名鏈表或者對象,所以看起來可讀性不好。換成Haskell或者Typed Racket就會好一些了。

說到這裡大家可以發現其實實踐上這句話還是有些意義的。換成上述兩個靜態版的對大多數人來說也不好讀,因為陌生。所以Scala這麼狂拽酷的語言還有這麼多工業界應用。

至於原文沒解釋的函數式運行其實還是有點意思的。簡單的例子比如VDOM就是函數式的,把VDOM放在底層可以避免重大性能損失。複雜的比如MapReduce或者Applicative這些分散式的,並發的函數式數據結構和演算法。

最後,作者其實Get到某些點但沒準確表達出來,其實函數式和OO是正交的。命令式和函數式才是相對的。大部分網上拿二者相比的文章,都在對比命令式的OO和非OO的函數式風格。實際上你可以寫出來函數式的OO,並且效果非常好—比如Erlang里Actor加普通函數,或者Scala的共存寫法(對於後者強烈推薦一本Manning的書Functional and Reactive Domain Modeling)。



沒聽說過這句話。

剛剛搜了一下,難道出處在此? 杜帥:TypeScript 的命運會不會和 CoffeeScript 一樣 ?

看了一下這回答和評論區(但真誠建議大家不要像我一樣浪費時間去讀),感覺本題是來釣魚的?


連函數式自己都沒有明確的界限, 什麼是函數式? Scheme會說滿足函數第一等公民,Ocaml會說 最起碼得有類型吧,Haskell會說最起碼講究純吧。 看題主是做前端的,Javascript語言,由於js沒有類型檢查,用OOP又要寫一大堆類,繼承,封裝,多態,寫著又不舒服,所以不是很適合OOP。 可以像Scheme那樣盡量用少的數據類型,js中可以只用 Array,Object 這兩種類型來完成app的構建。然後你就可以說

採用100個函數在一種數據結構上操作,遠遠優於用10個函數在10個數據結構上操作。

這句話在js中是適用的。


象學文科的人寫的扯淡話

專註於把別人攪暈


好吧,我再戰戰兢兢地回答一下,希望知乎月薪800k的程序員大牛不要拍我。

我現在其實有在寫一個面向小白的編程路線,主要是面向小白,面向老鳥的我也寫不來。

杜帥:孤島引路人——非程序員入門編程指導路線(開始吧)zhuanlan.zhihu.com圖標

主要是不管我在這個問題里和人怎麼扯,λ演算和圖靈機都只是認識模式,就好比世界上有些民族只有四個方位:東南西北,有些民族有十幾個方位,彼此談方位時的感受絕不相同。

所以,函數式講究的是抽象化,定義實際上非常簡單:函數的參數是函數,返回值也是函數,這樣的系統只是從一個狀態到另一個狀態而已。

這樣的系統,也就是公認的,有著易於調試,高並發,無狀態的特點。

但是編程過程卻並不愉悅。

比如牛頓法求平方根的lisp代碼:

#lang racket
(define (square x) (* x x))
(define (average x y) (/ (+ x y) 2))

(define (squareRoot x)
(define (enough? guess)
(&< (abs (- (square guess) x)) 0.001)) (define (improve guess) (average guess (/ x guess))) (define (sqrtIterator guess) (if(enough? guess) guess (sqrtIterator (improve guess)))) (sqrtIterator 1.0)) (squareRoot 2)

的確開發調試很高效,不會對其他的代碼造成任何異常,但是可讀性您覺著如何?

面向對象在對基本表達分形為複雜表達式非常有幫助,解決了第二次軟體危機,通過對人類認識世界的模擬(從哲學中抽離出模式和對象,比如白馬非馬的問題)。

尤其是代碼編輯器的智能化,使得面向對象越來越高效。

總而言之,計算機軟體永恆的話題——被動的數據和主動的過程。

函數式適合對主動的過程的模擬

面向對象適合對被動的數據的模擬

所以我才說面向對象構建,函數式運行。


就是個釣魚貼,js算不算函數式編程,es6還不是為了能做大型應用,而引入class


簡單的理解就是函數編程和面向對象缺一不可。所以他才是王道


王道個屁,C語言一路狂奔才築起了從編譯器到操作系統的偉業。

lisp躲在後面幹啥呢,控制副作用?

人的疏忽缺點你讓語言選型承擔?有病吧!

那麼推崇遞歸,一個尾遞歸優化瞧把它能的。

沒有C語言的底子,連個高性能的解釋器都寫不出來,C語言要像它那麼不要臉天天吹,哪有它什麼事!

一幫子學院派無能的蠢貨,一心想造一個 像人那麼跑的機器人,卻忘了機器人根本不需要像人那麼走路,它可以飛!

老古董就要老古董的覺悟,躺著讓人參觀就好了,別時不時的詐屍。


推薦閱讀:

ES next中async/await proposal實現原理是什麼?
angular directive 等controller執行完後再執行?
一個優秀的前端工程師簡歷應該是怎樣的?
如何劃分前端技術階段?
HTML 靜態頁面的頭部和底部都是相同的,如何讓每個頁面統一調用一個公共的頭部和底部呢?

TAG:JavaScript | TypeScript |