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