大家讀過 Metaprogramming Ruby 這本書嗎?沒讀過也沒關係,我也還沒開始讀。那有聽過 Code Generation 嗎?這次的主題是延續去年討論過的 Unlight 這款遊戲,我們這次要來看的是 Unlight 如何把 DSL 用到想找問題卻找不到在哪裡實作的。
Ruby 在 Metaprogramming 或者 DSL 來說一直都是強項,除了知名的 Ruby on Rails 框架讓我們可以透過一些 DSL 的特性來讓開發更容易之外,也有很多 Ruby 的 Gem 利用了這樣的性質作了不少特殊的應用。
像是 ElasticSearch 提供的 APM(Application Performance Monitor) 功能中,社群實作的 Ruby 版本 Agent 就實作了 span_method
這樣的 DSL 讓我們可以將方法重新包裝成能夠被 Agent 追蹤(Tracing)的方法。
除此之外,Ruby 也允許我們使用 eval
這個邪惡的方法,這也表示我們可以利用 Ruby 產生 Ruby 程式碼片段,再利用 eval
動態的擴充方法加入到正在運行的 Ruby 中。有著這樣彈性的 Ruby 語言自然很容易的能夠設計出許多容易使用的工具(像是 Chef、Vagrant)讓我們使用相對簡單的語法來設計相對應的機制。
不過,如果過度使用之後會變成怎樣的災難呢?這次我們將會來看 Unlight 這款遊戲怎麼利用這樣的特性加速開發,雖然以遊戲的情境來說善用 DSL 確實可以加快開發的速度與減少重複的程式碼撰寫,但是寫到連除錯都難以進行的時候,是否真的是一件好事呢?
About 蒼時弦也
現在是五倍紅寶石的佛系 Web 開發者,對遊戲很有興趣但是一直提不起勁。