解決侵入的根本方法討論

 

最近又看到一些關於框架侵入性的討論, 有些想法, 謹此拋磚引玉.

我覺得軟件開發框架之所以跟侵入性糾纏不清, 根本的原因還是框架要支持應用的某種/某些邏輯和功能, 可以說是部分的去實現應用的目標. 但是這些功能如果不能讓應用去定製, 其現實應用代價就又很微渺了. 所以框架是需要和應用交流的, 而交流的主要目的是爲了定製.

想到這個地方, 我的反應是聲明式編程, 讓應用通過某種方式表達出自己的定製需求, 這個表達的方式就可以是多種多樣的了: 通過遵循約定, 繼承特定框架基類, 實現特定框架接口, 標註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系統)而實現時, 應用的 "引入" 行爲也就達到了一個比較理想的主動程度, 從而可以視爲沒有被特定系統 "侵入" 了.

發佈了0 篇原創文章 · 獲贊 0 · 訪問量 4437
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章