atitit.元編程總結 o99,atitit編程總結o99
atitit.元編程總結 o99.doc
1. 元編程(Metaprogramming) 1
2. 元編程的曆史and發展 1
3. 元類型and中繼資料 1
4. 元編程實現方式 2
4.1. 代碼產生 2
4.2. lex和yacc分析器 2
4.3. 泛型程式設計 2
4.4. 註解 2
4.5. 解釋型架構 2
4.6. 對象工廠概念,一個會寫程式的程式! 3
4.7. Aop 3
4.8. 資料對象觸發器和 可配置的插入式服務 3
5. 應用情境 4
6. 參考 4
1. 元編程(Meta programming)
元編程(Metaprogramming)是指某類電腦程式的編寫,這類電腦程式編寫或者操縱其他程式(或者自身)作為它們的資料,或者在運行時完成部分本應在編譯時間完成的工作。很多情況下比手工編寫全部代碼相比工作效率更高。編寫元程式的語言稱之為元語言,被操作的語言稱之為目標語言。一門語言同時也是自身的元語言的能力稱之為反射。
就是將商務邏輯與實現代碼進行分離,僅用XML這類的描述性語言描述業務之間的映射關係,不需要寫實現代碼即完成編程。
作者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請註明來源: http://blog.csdn.net/attilax
2. 元編程的曆史and發展
在1994年初露端倪,由一個叫 Erwin Unruh 的人首先發現。在1994年,C++標準委員會在聖迭戈(SanDiego)舉行的一次會議期間, Erwin Unruh展示了一段特別的代碼。這段代碼的特別之處在於程式的功能在編譯期實現而非運行期,編譯器以錯誤資訊的方式產生從2到某個給定值之間的所有質數。同年夏天, Todd Veldhuizen 受Erwin 的例子啟發,發現可以使用C++模板進行元編程,並發表了一份技術報告
3. 元類型and中繼資料
類型的類型(泛型???) ,資料的資料為中繼資料 (anno/attr)
4. 元編程實現方式
4.1. 代碼產生
“元編程”實際上是“代碼產生”的一種別稱
可以給它一小段代碼,讓它返回一段可執行檔程式,或是一個可以識別或重寫的解析樹
最常用的元編程工具是編譯器,把進階語言轉換為組合語言或機器語言。更靈活的方法是在程式中嵌入解譯器直接處理常式資料。有一些實現例如為Object Pascal編寫的RemObject's Pascal Script。
4.2. lex和yacc分析器
另一個很常用的元編程例子是lex和yacc,用來產生詞法分析器和文法分析器。Yacc通常用作編譯器的編譯器,產生一個把進階語言轉換為機器語言的工具。
所以,所謂模板元編程,你可以理解為:它把編譯器當成了更高層次的解譯器和運行時而已. 模板編程是產生式編程(比如泛型程式設計)
4.3. 泛型程式設計4.4. 註解
註解在其中扮演了核心角色。其思想是通過註解夠告訴工具如何產生新代碼、轉碼或者決定運行期的行為。以Java Persistence API(JPA)為例,這也是Java 1.5引入的功能。它允許開發人員以聲明的方式如@Entity,指定Java對象與資料庫實體之間的關係。然後Hibernate這類工具就可以使用這些 註解,在運行期產生對應檔和SQL查詢。
4.5. 解釋型架構
Openbiz架構特別之處在於這是一個解釋型架構,相當於"編譯器"的角色。 當其它開發環境和架構致力於讓開發人員少寫代碼的時候,Rocky兄提出,別讓他們寫代碼了直接用簡單XML語言來描述映射關係即完成編程。
4.6. 對象工廠概念,一個會寫程式的程式!
每次提到這個概念都讓我激動不已,彷彿我們距離智能化編程只有咫尺之遙。這個理念據我所知最先提出的是.Net的自省(這個漢語翻譯很詭異)這一概念,即由主程式動態建立出另一個獨立的子程式,動態編譯,然後按需裝載及銷毀(跟變形金剛似的),當時看的我也十分激動,此後這個概念基本上就再也沒人提了。
直到後來我閱讀分析過了Openbiz的底層原始碼驚人地發現了基於PHP實現的對象工廠這一理念。剖析一下思路,以資料對象為例:
基於XML的中繼資料檔案被視為發給"工廠"的裝配單,上面描述了應具體如何"組裝"這個對象,以及這個對象與地層資料庫的映射關係,與同層級的其它對象的映射關係(例如一對多的 ORM)
對象工廠接到建立這樣對象的生產指令後,按描述建立並組裝所需對象,並以序列化的方式將對象體和狀態緩衝在系統內,為再次觸發調用,而最佳化效能。直到中繼資料設定檔改變之前,對象只需要動態生產一次,即無限次使用。
4.7. Aop
4.8. 資料對象觸發器和 可配置的插入式服務
這個郵件和簡訊的觸發肯定不應該在UI層實現,因為我們要考慮不管訂單從何處被產生,都應觸發發送郵件這個邏輯。所以這個商務邏輯應該被耦合在資料對象上,即只要有訂單被產生就應當觸發該邏輯。
而發郵件和發簡訊些種常見的可重用性邏輯,可以被定義為pluginService, 例如在發郵件的Service中,收件者,標題,內容應當是API的參數,而發郵件的帳戶,SMTP伺服器資訊相對於業務整個系統來說通常變化不大,應作 為中繼資料介面,而如何與伺服器連結來發送郵件則是具體被重用的對象邏輯了。這種設計的精妙之處我們將在下一篇文章中具體給大家分析
5. 應用情境
基於這種編程邏輯,我們解決一個常見的修改和擴充問題。
例如:客戶經常會再項目驗收時提出底地層資料欄位的修改,"您看連絡人管理這個模組,能不能再增加個 生日 和 喜好 欄位,要不然這尾款恐怕..."。
怎麼辦?
改吧。增刪讀寫(CRUD),列取(List),搜尋(Search)一個不能少全都要改。
誰改?
肯定你改啊,因為是你寫程式。
Openbiz中繼資料就不一樣了,現在我只修改一個資料描述檔案,然後是對象工廠會檢測到中繼資料設定檔發生改變,然後他來自動重新編寫對象和所有與其相關的映射調用(ORM)。
當你面對的是一個業務偶合性特別複雜的系統時,你會發現這些上層對象"你中有我,我中有你"堆疊式調用複雜至極(噁心至極)。比如在文檔修改記錄的視圖中也調用了連絡人的這幾個欄位等,你確定能一個不差的修改遍與這個資料結構的每一個角落嗎?
此非人力所能為也!但對象工廠可以,因為是按需生產建立。
6. 參考
元編程_百度百科.htm
元編程_互動百科.htm
Java 8的類型註解:工具和機會 _Linux伊甸園開源社區-24小時變換開源資訊,全年無休!.htm
源於java編程思想的Openbiz架構實現PHP的中繼資料編程_PHP_it動力.htm