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