「那 insert 和 insertRec 的差異呢?」
「insertRec 是 insertRecursive 的縮寫,意思是『用遞迴來插入』。」
「遞迴?」又聽到了新名詞。
「對呀。你可以把遞迴想像成:在處理問題時,把問題拆成更小的同類型問題,然後再把那個拆過的問題拆成更小的問題,拆到不能再拆為止。比如說呢?我現在要蓋12層樓的房子,為了達成目標,我先去研究怎麼蓋11層樓的房子;而為了研究怎麼蓋11層樓的房子,我就去研究怎麼蓋10層樓的房子;不停的往前找資料,直到最後,我找到了怎麼蓋1層樓的房子,蓋好之後我就能回去蓋2層樓的房子,然後3層樓、4層樓,以此類推,最後我終於蓋了12層樓的房子!」
我聽著點點頭。
「還有,你可能注意到了 insertRec 前面有個 private。這表示它是內部函式,只有 BinarySearchTree 自己能用,只要離開 BinarySearchTree 的大括號之後就看不到了。」
「誒?意思是說在 main 裡面也不能用嗎?」我想起學長之前在 main 裡面呼叫程式的樣子。
「沒錯,不能。他們只能透過 insert 來間接執行 insertRec 的功能。來,我示範給你看。」
fun insert(value: T) {
root = insertRec(root, value)
}
private fun insertRec(node: TreeNode<T>?, value: T): TreeNode<T> {
//todo 裡面還會呼叫 insertRec
return node
}
「這樣做有什麼好處啊?」我歪著頭,有點不解。
「當然有啊。」小孩露出一副理所當然的表情。「這樣外面的人就看不到你『怎麼做到的』,也不能強迫你『一定要用某種方式做到』。這就是一種安全機制,確保別人只能按照我們設計好的入口來操作。」
「有點抽象耶。」
「舉個例子好了。」小孩指著我的手機,「像 Apple Pay 這種手機支付。商家雖然刷了你的卡,卻完全不知道你的真實卡號是什麼。對商家來說,他只管收錢(就像呼叫 insert),至於背後的卡號驗證流程(insertRec),他根本看不到,也碰不到。」
「感覺就像電影裡的藏鏡人,深藏功與名呢。」我感嘆。