我的大腦不能再處理物件導向程式設計了

唐小娟發表於2013-03-18

今天我意識到已經沒有什麼比物件導向程式設計更困擾我了。尤其是 Java。人們確實都在用它嗎!? — Swizec April 29, 2012

前幾個星期我在做一個編譯器的作業——語義分析部分要用到物件導向程式設計,簡直是噩夢。需要用訪問者模式( visitor pattern)去遍歷樹,並做些奇怪的事情。

這讓我一度想在角落裡蜷縮起來,在臥室裡邊自言自語,邊來回搖晃。這讓River Tam在逃離房間前大喊:“太擁擠了!”

 

OOP像什麼

神經病?

神經病?

在物件導向程式設計裡,一切都攪在一起。函式和資料綁在一起,所有的一切都相互依賴,當你要呼叫一個函式( function)時根本就不知道這個函式用來做什麼。

而且這是在假設物件單子(monad)是沒有什麼副作用(side-effect)的情況下的。不然誰又知道會發生什麼呢?這個世界就要爆炸了!

物件導向寫出來的軟體根本沒辦法理解。我曾經覺得我可以理解,但我寫了幾個月的程式導向的程式後,我發現我已經沒有腦力去理解物件導向的程式碼了。太亂了。

當你要使用單態模式時,並且一個物件要使用另外一個物件時。讓我給你看個例項:

要回答這個簡單的問題需要知道一切:foo的整個執行歷史,整個程式碼。是你命名的,你必須記住名字。

噢,我有提到bar類嗎?它依賴於foo。哦耶,它們去年因為利益而成為了朋友。相當有趣。儘管bar曾經用baz騙過foo(譯者注:foo和bar在計算機世界裡常被用於例子中的變數名,函式名。)沒有人知道foo將會如何反擊!

 

函數語言程式設計

fp, by okeef creations

fp, by okeef creations

在@sbelak 的數次激勵下,我在兩年前開始學習函數語言程式設計(functional programming)。

有人說程式導向可擴充套件性更高,幾乎不需要更多的代價就可以擴充套件到多處理器上,清晰的程式碼,可以寫出更容易開發、更容易維護、更少bug的軟體。

我雖然沒有體會到所有的這些好處,但我現在已經可以用一種新的思維來思考我寫的程式碼了,那是一種更容易理解的方法。

最初寫函式式程式時,就像對我進行前腦切除手術一樣痛苦,就像用熱紅的烙鐵燒我的腳一般讓我掙扎不堪。你確定這裡不需要用迴圈語句?但我需要變數,不是嗎?至少要一點可變性吧?真的嗎?不需要嗎?這就像一種儀式,任何時候你們都可能會跳起來,對我說“給你個驚喜”,然後開始嘲笑我。

但我堅持下來了。雖然我的程式碼看上去很可怕,但我愛上了它了。

函式式程式碼首先吸引我的地方就是在於寫python函式時僅需要傳遞資料。不需要儲存中間變數,僅僅傳遞一個函式的結果給另外一個函式。

誰又在乎中間的步驟?我關心的僅僅是這一大塊程式碼建立了X,而不是它首先做了Y,然後Z,然後把A和B合併成了X。

當然,你當然可以定義一個X的函式,將Y,Z,A,B都包含在內,但為什麼要建立一個僅僅被呼叫過一次的函式呢?僅僅像這樣

X = A+B(Y(Z))不是更好麼?

 

資料的瀑布

普萊維斯瀑布

普萊維斯瀑布

我現在思考程式碼的方式是就像是資料的瀑布。

你有了資料,函式鏈上的函式都是一個暗礁。資料持續的下落,可能改變了某些屬性,然後落到了下一個函式上。

最後你有一個水池了。就在這裡你的資料在經歷了許多函式後,最後落進了水池。可能它還會下落到下一個函式,或者你在需要的時候可以使用它。

你可以說這就是過程化程式設計(procedural programming),但我不喜歡副作用(side-effect)和指令程式碼等。雖然它仍是函數語言程式設計,但這就是我如何理解程式碼的。你的想法可能不同。

不論你是如何理解你的程式碼的,不管你在你腦中如何執行程式碼——但如果你能處理物件導向程式設計的複雜度,我就要脫帽對你致敬。你是真的比我厲害。

我想你應該試試“函數語言程式設計”。你會喜歡它的。

相關文章