最近在公司和一些同事交流的時候發現了一點,就是大部分人其實是很難接受“代碼和數據沒有本質區別”這一點的。舉例來說,他們認為一段HTML代碼(或者當然也可以是JavaScript之類的),
<div id="1">
wahaha
</div>
和一段XML數據
<test>
subara
</test>
相比,意義是截然不同的。同樣,作為分別執行這兩段“字符串”的一個是瀏覽器,相比另一個可能是桌面客戶端之類的C#程序,也是有本質區別的(區別當然就是一個是執行代碼決定怎么展示,另一個只是用程序定義好的控件顯示傳過來的數據)。當時一起討論問題的其實不乏一些資深的“工程師”和“開發者”,但是聽到一些人異口同聲的反駁我(并且沒有人主動支持我的觀點)時,我不經在腦海里想到,“他們不懂編程”,令人難過的是這太常見了。
會引出這個話題,主要是開始在討論MVC,然后就自然而然的說起了SpringMVC,然后討論到作為View通常支持的一些模板語言(JSP、Velocity等),很自然的我就提到了“不使用View也是一種View”,很顯然我所指的是常見的前后端分離的方式由后端應用提供數據(例如JSON)來支持前端渲染的做法。
不幸的是,我的觀點(很奇怪的)并沒有得到大家的理解,討論的過程就略去了,主要的分歧就是上面列出的觀點,大家普遍接受的觀點就是“View是指最終呈現在用戶面前的(這里就是Web頁面了)東西”,如果只是返回數據的應用,那就稱不上是MVC Web應用,而是類似于API應用之類的Whatever什么東西。
當然,雖然討論的當時我沒有想到要去列舉,但是其實我們是可以從Spring支持的ViewResolver類型來倒推這個MVC框架設計者關于View的理解的。具體這里的ViewResolver除了模板語言視圖還支持哪些類型的返回值就留給大家自己查詢和參考吧:)
然后關于代碼和數據的相關的思考,我記得最早是在<SICP>上看到的,當然,在這里我也無意在做一遍并不準確的解釋,有興趣的人自然會去翻書。。。
> '(car (a b))
'(car (a b))
> (car '(car (a b)))
'car
> (cdr '(car (a b)))
'((a b))
大概就是這種感覺吧。當然上面也不是說把View單純當做展現給用戶看得東西就是錯的理解,只是在更加抽象、簡潔的解釋面前,會顯得相對來說不那么準確了吧。就醬。