軟件開發(fā)框架之所以跟侵入性糾纏不清, 根本的原因還是框架要支持應(yīng)用的某種/某些邏輯和功能, 可以說是部分的去實(shí)現(xiàn)應(yīng)用的目標(biāo). 但是這些功能如果不能讓應(yīng)用去定制, 其現(xiàn)實(shí)應(yīng)用代價(jià)就又很微渺了. 所以框架是需要和應(yīng)用交流的, 而交流的主要目的是為了定制.
想到這個(gè)地方, 我的反應(yīng)是聲明式編程, 讓應(yīng)用通過某種方式表達(dá)出自己的定制需求, 這個(gè)表達(dá)的方式就可以是多種多樣的了: 通過遵循約定, 繼承特定框架基類, 實(shí)現(xiàn)特定框架接口, 標(biāo)注Annotation, 編寫配置文件, 調(diào)用框架API, 等等.
而像Java這樣的靜態(tài)語言所能支持的表達(dá)方式, 無論怎么看都可以掛上 "侵入性" 的標(biāo)簽, 因?yàn)槿绻蚣芤坏┒怂髴?yīng)用采納的方式, 應(yīng)用就得跟著它走. 在應(yīng)用需求表達(dá)方式問題上, 框架之間的相容性既沒有理論研究, 更沒有實(shí)踐習(xí)慣.
這里提到 "框架的侵入性" 好像用的是它最寬泛的涵義, 就是對(duì)應(yīng)用編程行為的影響. 要是這么說任何框架都不可能沒有侵入性了, 只是有些讓應(yīng)用開發(fā)人員的日子很難過, 有些則好一點(diǎn). 不過以目前的軟件體系局勢(shì)來看, 絕對(duì)的 "侵入性" 問題還沒有辦法解決, 更現(xiàn)實(shí)一點(diǎn), 似乎只有它對(duì)單元化開發(fā)和測(cè)試的影響比較有可能解決, 眼下討論才比較有現(xiàn)實(shí)意義.
不過對(duì)下一代軟件框架體系, 我倒是感到有些期望, 隨著Annotation的成熟和普及, 對(duì)于基于Java的開發(fā)來說, 我覺得這個(gè)趨勢(shì)已經(jīng)臨近了. 我的想法是可以運(yùn)用一下逆向思維, 既然應(yīng)用與框架的交互無可避免, 那么與其被動(dòng)的接受框架的 "侵入" 不如由應(yīng)用自身采取主動(dòng)行為, 進(jìn)行 "引入".
應(yīng)用的主動(dòng)引入可以從已有的 聲明式編程 出發(fā), 對(duì)于比較大的綜合應(yīng)用方向, 比如 Web應(yīng)用, 以制定通用的應(yīng)用需求表達(dá)規(guī)范為手段, 通過公開的規(guī)范, 協(xié)調(diào)應(yīng)用程序和系統(tǒng)框架之間的交流. 這聽起來就是JCP要為JavaEE做的事情, 是的, 以截至到目前的軟件體系局勢(shì), 這個(gè)事情還不得不由人力, 物力, 財(cái)力豐厚的商業(yè)實(shí)體去完成, 它們也必須在這個(gè)領(lǐng)域有足夠的商業(yè)利益吸引也才有動(dòng)力去做.
但是同樣是JCP出來的J2EE規(guī)范, Servlet很成功, 而EJB卻不是. 并且Servlet很好的解決了它那個(gè)年代的Web開發(fā)問題, 而軟硬件的發(fā)展所推動(dòng)出來的新需求, 新問題又飛快增長(zhǎng), 對(duì)新規(guī)范的需求不僅是本身增長(zhǎng)很快, 它的增長(zhǎng)速度也會(huì)隨著時(shí)間增長(zhǎng). JCP已經(jīng)開始顯得笨拙且乏力了.
一個(gè)本質(zhì)性的問題是: 目前的規(guī)范是基于少量編程語言API的大部分的自然語言描述. 基于這樣的模式, 成本太高, 就算是目前的大型開源社區(qū)要開發(fā)自己的體系規(guī)范也會(huì)是難上加難.
在這個(gè)方向上, DSL(Domain Specific Language)是個(gè)很好的創(chuàng)意, 可以有針對(duì)性的簡(jiǎn)化專門領(lǐng)域的規(guī)約方式. 不過, 我覺得還有DSL沒有特別關(guān)注的一點(diǎn), 就是同一種語言中聲明與實(shí)現(xiàn)語法的分離與融匯: DSL傾向于作為一種聲明式的語言, 被設(shè)計(jì)為獨(dú)立使用, 它很可能由另一種通用語言進(jìn)行解釋而實(shí)現(xiàn). 它的語法很可能可以直接調(diào)用實(shí)現(xiàn)語言, 但很難變成編寫應(yīng)用所用語言的一部分. (我很期望它變成應(yīng)用代碼的聲明部分)
回到解決侵入性的問題上來, 我設(shè)想的方式是目前還沒有的, 至少還沒有系統(tǒng)化. 那就是可以用一種語法給應(yīng)用編程語言增加用于聲明的語法, 同時(shí)這種語法也照顧到給應(yīng)用聲明的需求提供實(shí)現(xiàn)的系統(tǒng)編程語言語法, 從而這樣的語法可以同時(shí) 表達(dá)/約束/支持 應(yīng)用聲明和系統(tǒng)實(shí)現(xiàn).
看上去動(dòng)態(tài)語言在這個(gè)方向上有最深厚的長(zhǎng)遠(yuǎn)潛力, 不過用于有分析需求的通用工業(yè)開發(fā)領(lǐng)域, 動(dòng)態(tài)語言要走的路還有點(diǎn)長(zhǎng).
目前基于Java的開發(fā), 利用起Annotation機(jī)制會(huì)在這個(gè)方向上有長(zhǎng)足進(jìn)展, 應(yīng)用通過引用標(biāo)注來聲明需求, 系統(tǒng)在編譯時(shí)通過Annotation Processor以及Language Model, 在運(yùn)行時(shí)通過反射, 兩者結(jié)合起來去理解和實(shí)現(xiàn)應(yīng)用的需求. 而定義和引用Annotation都受到新增的Java語法約束. 不過基于Annotation機(jī)制的 應(yīng)用/系統(tǒng) 交流有時(shí)候還是需要一些自然語言描述的規(guī)范, 好在這個(gè)已經(jīng)比純粹描述/理解大篇的約定和接口調(diào)用邏輯順序簡(jiǎn)易多了. 同時(shí)Annotation引用只能放在modifier的位置還是一個(gè)過大的約束, 這個(gè)還需要Java語言進(jìn)一步的演進(jìn)去解決.
總結(jié)下來, 系統(tǒng)框架通過 "侵入" 要達(dá)到的 應(yīng)用定制 目的是不可避免的, 而要解決被動(dòng)的受到 "侵入" 的局面, 我所能想到的最好方法就是去主動(dòng) "引入". 而 "引入" 所能達(dá)到的 "主動(dòng)" 程度取決于其方式方法的靈活程度和負(fù)面影響大小. 當(dāng)應(yīng)用的特定需求可以通過統(tǒng)一的(聲明)方式利用大多不同系統(tǒng)(包括測(cè)試時(shí)的Mock系統(tǒng))而實(shí)現(xiàn)時(shí), 應(yīng)用的 "引入" 行為也就達(dá)到了一個(gè)比較理想的主動(dòng)程度, 從而可以視為沒有被特定系統(tǒng) "侵入" 了
|