怎么理解函數(shù)式編程思維?
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
理解函數(shù)式編程要注重思維的轉(zhuǎn)變。函數(shù)式編程聚焦于簡潔的高階函數(shù),高階函數(shù)注重封裝底層運作原理來解決復雜的業(yè)務場景,比如 Scala、Groovy、Clojure 語言:
1. 靜態(tài)類型必須先指定變量和函數(shù)的類型,而動態(tài)類型則允許推遲指定類型。強類型的變量“知道”自己的類型,允許反射和對實例作類型測試,且一直保有自身的類型信息。弱類型的語言相對不了解變量所指向的內(nèi)容。 2. 命令式告訴計算機執(zhí)行的步驟,一步一步告訴它怎么做。函數(shù)式更注重“做什么”本身,函數(shù)式編程是面向數(shù)學的抽象,函數(shù)式的代碼里只有函數(shù)和數(shù)據(jù)。 函數(shù)式編程提供以下幾個特性,讓開發(fā)拋開細節(jié),投入到更高的抽象工作中:
函數(shù)式語言的重用表現(xiàn)在函數(shù)的通用性上,它們鼓勵在數(shù)據(jù)結(jié)構(gòu)上使用各種共通的變換,并通過高階函數(shù)來調(diào)整操作以滿足具體事項的要求。比如函數(shù)式編程語言用一組關鍵數(shù)據(jù)結(jié)構(gòu)(如 list、 set、map)來搭配專為這些數(shù)據(jù)結(jié)構(gòu)深度優(yōu)化過的操作,基于這些關鍵數(shù)據(jù)結(jié)構(gòu)和操作組成的一套運轉(zhuǎn)機構(gòu)上面,按需要“插入”另外的數(shù)據(jù)結(jié)構(gòu)和高階函數(shù)來調(diào)整機器來解決具體的問題。再比如函數(shù)式編程語言提供了如 Either 類、Option 類來優(yōu)化異常處理問題等。 在模式與重用方面,Java 提供了經(jīng)典的 23 種設計模式來解決復雜的業(yè)務問題,函數(shù)式編程讓這些設計模式有了三種歸宿:
現(xiàn)實應用方面,Java8 提供了基于 lamda 表達式的函數(shù)式編程,但 Java 非函數(shù)式編程語言,Java 將問題域封裝在對象之內(nèi),并允許通過業(yè)務操作來改變對象的狀態(tài),完全與函數(shù)式編程“變量無狀態(tài)”的思想背道而馳。那么函數(shù)式編程能應用于企業(yè)級需求解決方案嗎?從另一個角度來思考,Java 是面向?qū)ο蟮牡木幊陶Z言,領域驅(qū)動設計(DDD)是面對企業(yè)級需求的解決方案,DDD 的戰(zhàn)術設計趨向于 CQRS 架構(gòu),而基于“變量不可變”的特性的函數(shù)式編程把 CQRS 架構(gòu)作為基礎設施,所以能把函數(shù)式編程視為企業(yè)級需求的解決方案嗎?很明顯不能,DDD注重模擬現(xiàn)實世界,函數(shù)式編程思維并沒有試圖模擬現(xiàn)實世界,所以無法滿足復雜的企業(yè)需求,函數(shù)式編程大處理大量數(shù)據(jù)方面比面向?qū)ο蠓绞礁哂行剩馐牵?/span>面向?qū)ο缶幊淌墙鉀Q企業(yè)級需求的解決方案,解決過程中會產(chǎn)出大量的數(shù)據(jù)需求,可借力函數(shù)式編程。另外,《函數(shù)式編程思維》作者提到多范式語言組合才是趨勢,這一點很認同,未來語言必是混合的。編程語言是我們在計算機世界里解決問題的工具,函數(shù)式更注重What,而命令式更注重How。對于解決問題的能力,沒有高低強弱之分,只是角度和工具不同而已。 附《函數(shù)式編程思維》讀書筆記:
該文章在 2023/10/25 9:52:04 編輯過 |
關鍵字查詢
相關文章
正在查詢... |