這是我首次準備就有關用 elm 進行遊戲開發的内容撰寫一個系列的文章. 這是一種能編譯成 html 和 javascript,以便你可以将其直接部署到web伺服器上,或者打包到 nw.js 中以建立一個獨立的應用或者遊戲,這樣的程式設計語言. 沒有多少教程可以參考,但是随着我的慢慢進步之中我已經了解到了越來越多的東西. 因為 elm 正處在積極的發展過程中,如果或者當我的文章有點過時的時候,我将會對它們進行更新. 也會慢慢糾正我在裡面留下的錯誤 …
函數式程式設計 (fp) 是一種令人驚異的邊界不清的範式. 不少人對它都有很多不同的認識,而它所為我呈現的,則是一個希望能編寫更加簡單的可組合式代碼的群體, 以避免強 耦合 并建立出易于調試的軟體.
games
從很多程式設計的領域看來,遊戲開發是最适合面向對象的而且遊戲總是帶很多狀态。從表面上看,面向對象這種方法很适合。當我使用 functional programming的時候,我發現這種方法也很适合遊戲程式設計,而且我也對如何解決問題很感興趣。
為什麼我選擇用functional programming開發遊戲呢? 簡單的說,我對傳統的軟體設計方法感到厭倦。指令式的面向對象代碼對導緻一下過度設計的問題,而且很不美觀。
這僅僅是我的個人觀點,是以請放松,但是如果你渴望一些不同的事物,為什麼不來functional的路上看看呢。
iteration
看看下面最簡單的js例子,對于一個數組取平方。使用"指令式"的代碼你會描述一些将要發生的事情。而用functional代碼(聲明式程式設計的子集),你去描述你想要做的事情。是以"指令式"的風格中我們會定義一個臨時的index變量然後建立一個循環,周遊一遍數組,然後每個value取平方。
相比起來,functional的方法路線呢,如果你寫js可以考慮下lodash這個庫。然而使用一個專門是functional programming的語言,會比的很容易,是以我們使用elm來做這件事。
使用elm我們不需要定義臨時變量,我們也會建立一個數組更容易,而且定義一個function複用。通過map我們将每個list的數字取平方,然後傳回一個新的list。
正如你看到的,functions是對于傳進來的每個變量有類型提示的。import list (..)這一行簡單引入了核心list function,elm自帶的這些function 提供了 map和filter的方法。
filtering
現在設想一下我們想從數組中移除奇數,然後隻平方哪些過濾後的數組。通常,“指令式”的js是這樣寫的:
當然,這樣寫可以用,但是定義另外一個數組看起來很亂,而且我們還是得寫循環。這就是"指令式"代碼最不具有新意的地方。你可能會在你的代碼的1000個地方重複寫上面的代碼。
現在我們試試functional 的寫法:
我們在numbers裡增加一個filter,然後這塊方法就變得可以複用了,我們不需要對于有點不同的需求寫重複代碼。
這裡就是functional programming閃耀的地方了,你花了更少的時間在編寫想要的做的東西上,而且代碼閱讀起來也很友善。還有就是這證明了方法是可以鍊式調用的。