Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725
Atitit.?提升軟件開發效率and?開發質量---java?實現dsl?4gl?的本質and?精髓??O725
?
1.?DSL主要分為三類:外部DSL、內部DSL,以及語言工作臺。 1
2.?DSL規則 2
2.1.?DSL?=?整潔的代碼 2
2.2.?DSL必須以文本代碼的形式出現 2
2.3.?DSL的語法應該盡可能地接近英語或者其他自然語言 2
3.?DSL?文本形式?or?圖形標識 2
4.?實現方式 2
4.1.?2.?管道抽象 2
4.2.?3.?層次結構抽象 3
4.3.?4.?異步抽象 3
5.?常見的dsl 4
5.1.?css?,html.easyui?表單驗證等.. 4
5.2.?Rule?Engine)語言、drools,工作流(Workflow)語言等。??Jbpm 4
5.3.?SQL?hql??linq?,XQuery,正則表達式 4
5.4.?業務api.通用模塊。工作流語言。。圖形化編程.ant?,shell..Java?6注解,attilaxc#.常見的DSL還有規則引擎(AOP實現,,框架api??,,.xml..json..yaml 4
6.?#--實現java內部?DSL 4
6.1.?參考在的語言??anno?frm?tapestry?? 4
6.2.?Groovy 4
6.3.?Ide整合的dsl--code?templete 5
6.4.?方法鏈 5
返回this: 5
返回中間對象 5
相比返回中間對象的的方式來說,返回this的方式更加容易組織連貫接口的代碼 6
6.5.?靜態工廠方法(static?factory?method)和import對于創建簡潔易讀的DSL來說是不錯的助手。 6
6.6.?元編程; 6
6.7.?編譯工具;可以使用lex,yacc,或者javacc,antlr 6
6.8.?使用框架 6
6.9.?Std?lib 7
7.?DSL?and?易讀API的區別 7
8.?Java實現dsl的限制 7
9.?Java?實現dsl的優點 7
10.?結論 7
11.?參考 8
?
1.?DSL主要分為三類:外部DSL、內部DSL,以及語言工作臺。
2.?DSL規則
2.1.?DSL?=?整潔的代碼
2.2.?DSL必須以文本代碼的形式出現
2.3.?DSL的語法應該盡可能地接近英語或者其他自然語言
作者::?老哇的爪子?Attilax?艾龍,??EMAIL:1466519819@qq.com
轉載請注明來源:?http://blog.csdn.net/attilax
?
3.?DSL?文本形式?or?圖形標識
……或者為什么不使用圖形標識?文本型的DSLs有幾大優勢。首先是更加容易建立語言以及一個好的編輯器。其次,文本型的工件比圖形化的模型庫更加?容易集成到現有的開發工具(CVS/SVN?diff/merge)中。第三,文本型的DSLs通常更容易被開發者接受,因為“真正的開發人員不畫圖”。
如果對于系統的某些方面,圖形標識有助于看清楚架構元素之間的關系,你可以使用類似于Graphviz或者Prefuse之類的工具。既然模型以一?種清晰而又干凈的形式包含了相關的數據,我們就可以輕易的將模型數據導出成GraphViz或者Prefuse工具能夠閱讀的形式。
4.?實現方式
4.1.?2.?管道抽象
在Shell中,我們可以通過管道將一系列的小命令組合在一起實現復雜的功能。管道中流動的是單一類型的文本流,計算過程就是從輸入流到輸出流的變?換過程,每個命令是對文本流的一次變換作用,通過管道將作用疊加起來。在Shell中,很多時候我們只需要一句話就能完成log統計這樣的中小規模問題。?和其他抽象機制相比,管道的優美在于無嵌套。比如下面這段C程序,由于嵌套層次較深,不容易一下子理解清楚:
//Cmin(max(min(max(a,b),c),d),e)
而用管道來表達同樣的功能則清晰得多:
#!/bin/bashmax?a?b?|?min?c?|?max?d?|?min?e
?
?
4.2.?3.?層次結構抽象
除了管道這種“線性”結構外,流暢接口還可用于構造層次結構抽象。比如,用Javascript動態創建創建下面的HTML片段:
<div?id="’product_123’"?class="’product’"><img?src="’preview_123.jpg’"?alt=""?/><ul> <li>Name:?iPad2?32G</li> <li>Price:?3600</li></ul></div>
若采用Javascript的DOM?API:
?而下面流暢接口API則要有表現力得多:
//Javascriptvar?obj?=$.div({id:’product_123’,?class:’product’})????.img({src:’preview_123.jpg’})????.ul()????????.li().text(‘Name:?iPad2?32G’)._li()????????.li().text(‘Price:?3600’)._li()????._ul()?._div();
4.3.?4.?異步抽象
流暢接口不僅可以構造復雜的層次抽象,還可以用于構造異步抽象。在基于回調機制的異步模式中,多個異步調用的同步和嵌套問題是使用異步的難點所?在。有時一個稍復雜的調用和同步關系會導致代碼充滿了復雜的同步檢查和層層回調,難以理解和維護。這個問題從本質上講和上面HTML的例子一樣,是由于多?數通用語言并未把異步作為基本元素/語義,許多異步實現模式是向語言的妥協。針對這個問題,我用Javascript編寫了一個基于流暢接口的異步?DSL,示例代碼如下:
?
5.?常見的dsl
5.1.?css?,html.easyui?表單驗證等..
5.2.?Rule?Engine)語言、drools,工作流(Workflow)語言等。??Jbpm
?
5.3.?SQL?hql??linq?,XQuery,正則表達式
5.4.?業務api.通用模塊。工作流語言。。圖形化編程.ant?,shell..Java?6注解,attilaxc#.常見的DSL還有規則引擎(AOP實現,,框架api??,,.xml..json..yaml
?
?
6.?#--實現java內部?DSL
6.1.?參考在的語言??anno?frm?tapestry??
實現方式1:::
實現方式2:::
?
6.2.?Groovy
6.3.?Ide整合的dsl--code?templete
使用Java,我們同時能利用強大且成熟的類似于Eclipse和IntelliJ?IDEA的集成開發環境,由于這些集成開發環境“自動完成(auto-complete)”、自動重構和debug等特性,使得DSL的創建、使用和維護?來的更加簡單。另外,Java5中的一些新特性(比如generic、varargs?和static?imports)可以幫助我們創建比以往任何版本任何語言都簡潔的API。
?
6.4.?方法鏈
使用方法鏈接來創建DSL有兩種方式,這兩種方式都涉及到鏈接中方法的返回值。我們的選擇是返回this或者返回一個中間對象,這決定于我們試圖要所達到的目的。
返回this:
在可以以下列方式來調用鏈接中方法的時候,我們通常返回this:
·?可選擇的
·?以任何次序調用
·?可以調用任何次數
我們發現運用這個方法的兩個用例:
1?相關對象行為鏈接
2?一個對象的簡單構造/配置
使用連貫接口,再一次減少了代碼噪音,所帶來的結果是更易讀的代碼。需要指出的很重要的一點是,在返回this的時候,鏈中任何方法都可以在任何時候被調用,并且可以被調用任何次數。在我們的例子中,color這個方法我們可想調用多少次就調用多少次,并且每次調用都會覆蓋上一次調用所設置的值,這在應用程序的上下文中可能是合理的。
?
返回中間對象
從連貫接口的方法中返回中間對象和返回this的方式相比,有這樣一些優點:
·?我們可以使用編譯器來強制業務規則(比如:必需屬性)
·?我們可以通過限制鏈中下一個元素的可用選項,通過一個特殊途徑引導我們的連貫接口用戶
·?在用戶可以(或必須)調用哪些方法、調用順序、用戶可以調用多少次等方面,給了API創建者更大的控制力
相比返回中間對象的的方式來說,返回this的方式更加容易組織連貫接口的代碼
對方法返回this的連貫接口建檔比對返回中間對象的連貫接口建檔來的簡單的多,尤其是在使用Javadoc來建檔的情況下。?
?
6.5.?靜態工廠方法(static?factory?method)和import對于創建簡潔易讀的DSL來說是不錯的助手。
dialog.table("results").selectCell(6,?8);?//?row?6,?column?8
dialog.table("results").selectCell(row(6).column(8));
6.6.?元編程;
???1.?利用現有語言進行元編程;(比如:我們web開發常用的一些ssh框架,而語言層面,lisp,ruby這些語言的宏編程直接提供元編程能力)
?
6.7.?編譯工具;可以使用lex,yacc,或者javacc,antlr
等幫助我們建立新語言的描述和解釋。比如antlr提供了詞法描述,語法描述,各?種目標語言(java,c,c++)的詞法分析器,語法分析器生成。利用他你可以實現一個完整的語言。在各種建模工具逆向工程,比如通過代碼生成圖表描述?的工具uml,powerdesign)等都可以看到他的身影;
?
6.8.?使用框架
Rails框架被稱為基于Ruby的DSL,用于管理Ruby開發的Web應用程序。Rails之所以被稱為DSL,原因之一在于Rails應用了一些Ruby語言的特性,使得基于Rails編程看上去與基于通用目的的Ruby語言編程并不相同。
如果把Rails看作是一種語言,它應該是基于Ruby、以Ruby為根基的,同時它自身也有獨立的特性。
Rails都看作一個很大的DSL
?
6.9.?Std?lib
7.?DSL?and?易讀API的區別
在DSL和API兩者間其實很難區分。在內部DSL的例子中,他們本質上幾乎是一樣的。在聯想到DSL這個詞匯的時候,我們其實是在利用主編程語言在有限的范圍內創建易讀的API。“內部DSL”幾乎是一個特定領域內針對特定問題而創建的極具可讀性的API的代名詞。
?
8.?Java實現dsl的限制
任何內部DSL都受它基礎語言的文法結構的限制。比如在使用Java的情況下,大括弧,小括弧和分號的使用是必須的,并且缺少閉包和元編程有可能會導致DSL比使用動態語言創建來的更冗長。
?
?
9.?Java?實現dsl的優點
一般來說,使用Java編寫的DSL不會造就一門業務用戶可以上手的語言,而會是一種業務用戶也會覺得易讀的語言,同時,從程序員的角度,它也會是一種閱讀和編寫都很直接的語言。和外部DSL或由動態語言編寫的DSL相比有優勢,那就是編譯器可以增強糾錯能力并標識不合適的使用,
?
10.?結論
Java適用于創建開發人員易讀易寫的、并且對于商業用戶用樣易讀的內部領域特定語言。用Java創建的DSL可能比那些由動態語言創建的DSL來?的冗長。但好的一面是,通過使用Java,我們可以利用編譯器來增強DSL的語義。另外,我們依賴于成熟且強大的Java集成開發環境,從而使DSL的創?建、使用和維護更加簡單。
?
?
11.?參考
Paip.聲明式編程以及DSL?總結?-?attilax的專欄?-?博客頻道?-?CSDN.NET
paip.?dsl?編程語言優點以及?常見的dsl?-?attilax的專欄?-?博客頻道?-?CSDN.NET
DSL?用于Java開發中?-?linugb118--java?space?-?BlogJava.htm
atitit.提升開發效率--java實現DSL
API設計新思維:用流暢接口構造內部DSL?_?IT癮
轉載于:https://www.cnblogs.com/attilax/p/5963921.html
總結
以上是生活随笔為你收集整理的Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: map的用法
- 下一篇: HDU 2204 Eddy's爱好(容斥