1. 程式人生 > >開發式程式設計,宣告式程式設計和產生式程式設計(www.mynetweaver.cn)

開發式程式設計,宣告式程式設計和產生式程式設計(www.mynetweaver.cn)

從概念上看,WebDynpro是基於MVC的宣告式程式設計(declarative programming),也就是面向元資料解析的程式設計。我們可以比較一下幾種常見的程式設計模型,來加深理解。

開發式程式設計是編碼的,如:Java, C#
宣告式程式設計是解析的,如:ANT(spring等的xml不一樣,它們是靜態描述型的,不那麼verb)
產生式程式設計是生成的,如:AOP(AspectJ),DSL(Drools)

開發式程式設計是聚合的,
宣告式程式設計是宣告的,
產生式程式設計是組合的,

宣告式程式設計和產生式程式設計看起來很像:
1.宣告式程式設計需要一個解析器,產生式程式設計需要一個生成器;
2.產生式程式設計(正統的)需要一個編輯器,宣告式程式設計也可以有(如jbpm)。
3.產生式程式設計有一個元模型,宣告式程式設計也可以定義。

本質的區別在於:
1.產生式是自底向上,而宣告式是自定向下。即產生式程式設計用的思路是組合概念(用小粒度的概念組合生成大粒度的概念),
而宣告式程式設計是解析概念,用統一的概念來理解,把不同差異性交由具體程式解析。
2.宣告式程式設計的編輯器生成的是xml檔案,將由框架程式解析;而產生式生成程式程式碼,不做解析執行。
3.由於1,導致元資料模型不一樣,產生式是相對細粒度的,而宣告式是粗粒度的(不能直接比較大小,定義的是無差異性的概念)。如Ant,jbpm都是很大的概念。

前段時間javaeye上有關普元的黃柳青談中國軟體開發情況:"目前,國內傳統大型企業應用軟體有兩種方式居多:編碼式開發方式和一次開發方式。值得注意的是,兩種方式都有致命的缺陷---編碼式開發方式使得企業級應用軟體的快速開發和實施難以實現;一次性開發持續執行的方式,則導致軟體的嚴重僵化和應用的不適應。儘管有時兩種方式的操作者會彼此攻擊,但在使用者看來,它們之間並無顯著不同"

其說的以及普元做的,就是這三個開發方式。

buaawhl 老大說:"Interpreter is over Code Generator。meta programming的最高層次是語言級別直接解決,比如,smalltalk, ruby, python, 還有其他reflection 支援的非常好的語言。甚至 STL 等 template 技術,也可以算作語言級別。Code Generation 是最低級別的meta programming解決方案。技術含量也最低。這個級別必須超越,才能夠真正達到質變,完全跳出概念炒作的層次。"

我一直以為:其實程式碼生成也沒有那麼壞,關鍵在於生成什麼東東,如果是生成結構性的程式碼,就很容易被人bs,因為這種程式碼是大都可以用template完成的,同時因為這種程式碼往往不是最終的產物,就存在同步維護問題。
但如果生成的是功能性程式碼,這類程式碼是最終執行程式碼,那麼通常就把用於設計的程式碼看作是最終產物,最明顯的例子是DSL。