卷2:第22章 Yesod

2018-02-24 15:55 更新

Preface:

這篇文章是在圖靈社區(qū)中接受的第一份翻譯工作 ---- 翻譯AOSA(The Architecture of Open Source Application),目的是:

  • 在翻譯文檔的過程中深入學(xué)習(xí)開源軟件架構(gòu),同時(shí)進(jìn)行知識(shí)共享
  • 認(rèn)識(shí)更多的人

以下是AOSA的第2卷的第22章,關(guān)于Yesod這個(gè)Web框架的(由),Yesod的簡單介紹可以參照Wiki,及其官網(wǎng). 由于是初稿翻譯,今后也將不斷完善,歡迎指正。

Yesod?是用Haskell語言編寫的Web框架。目前流行的眾多Web框架得益于其宿主動(dòng)態(tài)語言的某些特性,而Yesod則不同----其得益于Haskell的靜態(tài)語言的特性,使得代碼更高效,也更安全。

Yesod的開發(fā)從兩年前起至今,一路不斷地發(fā)展,也使之變得越發(fā)地強(qiáng)大。Yesod被創(chuàng)造伊始,便是為了滿足解決實(shí)際項(xiàng)目問題的需要,同時(shí)其也在實(shí)際項(xiàng)目經(jīng)驗(yàn)積累中不斷地完善起來。起初,該框架的開發(fā)以及維護(hù)完全就是“個(gè)人秀”的行為,而緊接下來的一年里,在源自于社區(qū)不斷開發(fā)以及維護(hù)努力之下,終于使得Yesod一躍成為了非?;钴S的一個(gè)開源項(xiàng)目。

Yesod處于萌芽階段時(shí),并沒有很好的定義、設(shè)計(jì),有哪個(gè)實(shí)際項(xiàng)目組愿意嘗試其進(jìn)行開發(fā)是一件讓人想都不敢想的事。后來,Yesod的變更使之逐漸進(jìn)入穩(wěn)定階段,并且也被應(yīng)用到了一些實(shí)際項(xiàng)目中,這時(shí)候我們也開始著手對設(shè)計(jì)決策的不足進(jìn)行重新考察。那時(shí)起,我們將改善項(xiàng)目的主要精力投放于如何讓面向用戶的API更易用 ---- 很快我們有了穩(wěn)定的1.0發(fā)行版。

你可能會(huì)問:為什么要再開發(fā)一個(gè)Web框架呢? 或者讓我們換一種提問方式:為什么要用Haskell呢? 一般看來,目前世界上大多數(shù)開發(fā)者都圍繞以下兩類語言風(fēng)格:

  • 靜態(tài)類型語言,比如Java,C#和C++。這些編程語言提供高效的代碼執(zhí)行以及類型安全,但開發(fā)起來總讓人覺得比較笨重

  • 動(dòng)態(tài)類型語言,比如Ruby和Python。這些編程語言極大地提升了生產(chǎn)效率(至少短期來說是這樣),但是卻難掩執(zhí)行效率的相對低下以及編譯器對程序正確性驗(yàn)證支持不足的特點(diǎn)(對于最后這點(diǎn)而言,解決方案是進(jìn)行一定的單元測試。我們一會(huì)兒會(huì)談到。)

這是對語言的一種錯(cuò)誤的二分法。靜態(tài)類型語言沒有理由變得這么愚蠢。Haskell在作為強(qiáng)類型語言的同時(shí),也兼顧了許多Ruby和Python中的表達(dá)特性。事實(shí)上,Haskell的類型系統(tǒng)比Java及其語言家族更加嚴(yán)謹(jǐn),能在編譯期糾正更多的錯(cuò)誤:空指針異常被排除了;不可變的數(shù)據(jù)結(jié)構(gòu)簡化了代碼推理的同時(shí),也簡化了并行與并發(fā)編程。

那么為什么選擇Haskell? 它是一門高效的,對開發(fā)者友好的編程語言,它也提供了許多編譯時(shí)期程序正確性的檢查。

Yesod的目標(biāo)就是Haskell的強(qiáng)大特性引入到Web開發(fā)中去。Yesod努力讓你的代碼更加緊湊,盡最大可能讓你的每一行代碼在編譯器都完成正確性檢查。換句話說,與需要大型庫去單元測試程序基本屬性相對地,編譯器都為你做好了。

從深層面來說,我們在Yesod中運(yùn)用了盡可能多的高級(jí)性能優(yōu)化技術(shù),有了它們的幫助,你的高層次代碼運(yùn)行起來便能如虎添翼。

22.1 與其他Web框架的比較

總的來說,Yesod與其他主流框架(Rails,Django之流)大同小異。其主要采用了MVC范式----通過一個(gè)模板系統(tǒng)將邏輯與表現(xiàn)分離,同時(shí)提供了一個(gè)對象關(guān)系映射(ORM)系統(tǒng),以及一個(gè)用于完成路由的前端控制器。

Yesod強(qiáng)大的地方在于一些細(xì)節(jié)之處。Yesod盡可能在編譯階段捕獲錯(cuò)誤或者異常,而非延遲到運(yùn)行時(shí),并且通過類型系統(tǒng)提供自動(dòng)化捕捉bug以及保證安全性缺陷。盡管Yesod的目標(biāo)是維護(hù)一系列用戶友好,高層的API,但其采用了許多函數(shù)式編程世界的新技術(shù)來提升程序的性能的同時(shí),也不懼對開發(fā)者暴露這些內(nèi)部細(xì)節(jié)。

Yesod在架構(gòu)上的主要挑戰(zhàn)來自于如何平衡這兩個(gè)看上去相互沖突的目標(biāo)。舉例來說,Yesod路由方式(稱為類型安全的路由)并沒有格外標(biāo)新立異。從歷史上來看,實(shí)現(xiàn)類似問題的解決方案總是一個(gè)乏味,伴隨錯(cuò)誤叢生的過程。應(yīng)對類似的問題,Yesod的解決方案在于采用了模板Haskell(Template Haskell,代碼生成的一種形式)使得一些中間步驟實(shí)現(xiàn)了自動(dòng)化,從而加速了解決方案實(shí)現(xiàn)的過程。

類型安全的HTML已經(jīng)存在好一段時(shí)間了,在這個(gè)方面,Yesod既保證類型安全的威力得到充分發(fā)揮,也保持了對于開發(fā)者友好的通用模板語言所應(yīng)有的特點(diǎn)。

22.2 Web應(yīng)用接口(WAI)

待續(xù)..

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)