You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
《簡約的軟體開發思維:用 Functional Programming 重構程式》CH14
目錄
update()
取代 『取得、修改、設定』update()
能處理巢狀資料嗎?updateOption()
update2()
incrementSizeByName()
的 4 種實作方法update3()
Ch14. 處理巢狀資料的函數式工具
用高階函式處理物件內的值
以下為一段有程式碼異味的程式
將屬性名稱轉為顯性
假設新增了另一段程式,重複的程式碼又出現了
解法:寫⼀個能更新(update)物件內屬性值的函數式工具,進而消除程式碼重複
重構 3 : 以
update()
取代 『取得、修改、設定』步驟
update()
取代以上三個段落,其中『修改』的部分為回呼update()
能處理巢狀資料嗎?-> 能,讓我們來看看以下範例:
以
update()
重構incrementSize()
由於 size 屬性值位於兩層巢狀結構內(經過兩個物件才能取得該值),故需呼叫兩次
update()
資料的巢狀深度有多少,
update()
的巢狀呼叫次數就有多少實作成普適化的
updateOption()
實作兩層巢狀結構的
update2()
將
incrementSize()
改以update2()
實作函式
incrementSizeByName()
的 4 種實作方法update()
和incrementSize()
update()
和update2()
update()
實作三層巢狀結構的
update3()
若是
update4()
、update5()
會是怎麼樣?觀察發現程式再度飄出『函式名稱中的程式碼異味』:函式名稱中的數字總是和鍵的數量相同!!!
將隱性引數轉為顯性
加入⼀個代表『 巢狀深度 』 的 depth 參數
以上改寫如何確保 depth 的值和鍵的數量應該要相同呢?
-> 將所有鍵按順序存成一個陣列,就不需設額外的 depth 參數了,該陣列的長度(即:元素數量)就是『巢狀深度』
若是
update0()
的話...只需多加一個判斷式,若 keys 陣列的長度為零 (= 沒有鍵),則直接呼叫
modify()
,否則遞迴呼叫updateX()
。=> 結論:所有遞迴呼叫皆應收斂到某種不涉及遞迴呼叫的情況,稱為基本條件(base case)
什麼是遞迴
遞迴函式 (recursive function) 就是在其定義中呼叫自己的函式,這種自己呼叫自己的做法叫「遞迴呼叫 recursive call」
為何要用?
可能會造成什麼問題?
安全的遞迴要具備什麼?
遇到深度巢狀資料時的設計考量
nestedUpdate()
需要傳入一長串鍵作為路徑,但我們很難記得這些鍵到底指的是什麼解法:為巢狀資料建立抽象屏障
抽象屏障(abstraction barrier):
抽象屏障可以隱藏實作細節,使用時,不需要了解函式的底層實作
寫⼀個能根據給定貼⽂編號( ID )修改部落格貼⽂( post )的函式(貼⽂儲存在 category 巢狀物件的『posts』鍵下)
結合以上,就可以得到:
使用抽象屏障優點
總結高階函式的應用
try/catch
敘述標準化小字典
路徑 (path): 用來定位巢狀物件中的 key 的序列,如下的 'options', 'size',每個鍵對應到一個巢狀層
問題與討論
前端開發中,何時會用到遞迴?
Beta Was this translation helpful? Give feedback.
All reactions