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