Java DSL簡介(收集整理)

一、領域特定語言(DSL)

領域特定語言(DSL)通常被定義為一種特別針對某類特殊問題的計算機語言,它不打算解決其領域外的問題。對于DSL的正式研究已經持續很多年,直 到最近,在程序員試圖采用最易讀并且簡煉的方法來解決他們的問題的時候,內部DSL意外地被寫入程序中。近來,隨著關于Ruby和其他一些動態語言的出 現,程序員對DSL的興趣越來越濃。這些結構松散的語言給DSL提供某種方法,使得DSL允許最少的語法以及對某種特殊語言最直接的表現。

這里將描述怎樣使用Java語言來編寫領域特定語 言,并將建議一些組建DSL語言時可采用的模式。

Java適合用來創建內部領域特定語言嗎?

在我們審視Java語言是否可以作為創建DSL的工具之前,我們首先需要引進“內部DSL”這個概念。一個內部DSL在由應用軟件的主編程語言創 建,對定制編譯器和解析器的創建(和維護)都沒有任何要求。Martin Fowler曾編寫過大量各種類型的DSL,無論是內部的還是外部的,每種類型他都編寫過一些不錯的例子。但使用像Java這樣的語言來創建DSL,他卻 僅僅一筆帶過。

另外還要著重提出的很重要的一點是,在DSL和API兩者間其實很難區分。在內部DSL的例子中,他們本質上幾乎是一樣的。在聯想到DSL這個詞匯 的時候,我們其實是在利用主編程語言在有限的范圍內創建易讀的API。“內部DSL”幾乎是一個特定領域內針對特定問題而創建的極具可讀性的API的代名 詞。

任何內部DSL都受它基礎語言的文法結構的限制。比如在使用Java的情況下,大括弧,小括弧和分號的使用是必須的,并且缺少閉包和元編程有可能會導致DSL比使用動態語言創建來的更冗長。

但從光明的一面來看,通過使用Java,我們同時能利用強大且成熟的類似于Eclipse和IntelliJ IDEA的集成開發環境,由于這些集成開發環境“自動完成(auto-complete)”、自動重構(auto-reconstruct)和debug等特性,使得DSL的創建、使用和維護 來的更加簡單。另外,Java5中的一些新特性(比如generic、varargs 和static imports)可以幫助我們創建比以往任何版本任何語言都簡潔的API。

一般來說,使用Java編寫的DSL不會造就一門業務用戶可以上手的語言,而會是一種業務用戶也會覺得易讀的語 言,同時,從程序員的角度,它也會是一種閱讀和編寫都很直接的語言。和外部DSL或由動態語言編寫的DSL相比有優勢,那就是編譯器可以增強糾錯能力并標 識不合適的使用,而Ruby或Pearl會“愉快接受”荒謬的input并在運行時失敗。這可以大大減少冗長的測試,并極大地提高應用程序的質量。然而, 以這樣的方式利用編譯器來提高質量是一門藝術,目前,很多程序員都在為盡力滿足編譯器而非利用它來創建一種使用語法來增強語義的語言。

利用Java來創建DSL有利有弊。最終,你的業務需求和你所工作的環境將決定這個選擇正確與否。

二、Camel DSL

Camel使用一種Java領域特定的語言(Domain Specific Language,DSL)來創建企業集成模式(Enterprise Integration Patterns)或路由。Camel同時支持一種基于Spring的 XML 配置,以及 Scala DSL。

??? 使用Java DSL的優點是你使用的IDE可以在你開始編寫時,智能的實例代碼,而不需要在大量的XML上浪費時間。Java DSL非常有表現能力,因為你可以在語言中混合搭配你自己的代碼,來進行表達式或斷言評估,或容易地添加自定義的處理模塊。

DSL的主要入口有

  • CamelContext 用于創建一個Camel 路由規則庫(routing rule base);
  • RouteBuilder 用于創建路由集合。

參考:

  • http://camel.apache.org/dsl.html
  • 說明: 這只是簡單的概念介紹,詳細的請參看 http://www.infoq.com/cn/articles/internal-dsls-java

?

轉載于:https://www.cnblogs.com/JoannaQ/p/3448814.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387464.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387464.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]JSon數據解析的四種方式

轉至http://blog.csdn.net/enuola/article/details/7903632 作為一種輕量級的數據交換格式,json正在逐步取代xml,成為網絡數據的通用格式。 有的json代碼格式比較混亂,可以使用此“http://www.bejson.com/”網站來進行JSON格式化校驗&#xf…

2.8 list

#include<list> 雙向循環鏈表 list結點的三個域&#xff1a;數據域、前驅元素指針域、后繼元素指針域 對于list的迭代器&#xff0c;只有或--的操作&#xff0c;無n或-n的操作 創建list對象&#xff1a; list<int> l; list<int> l(10); 插入和遍歷&…

Spring AOP兩種實現機制是什么?

Spring AOP兩種實現機制是什么&#xff1f; 1.如果是有接口聲明的類進行AOP 時&#xff0c;spring調用的是java.lang.reflection.Proxy 類來做處理 2.如果是沒有接口聲明的類時&#xff0c; spring通過cglib包和內部類來實現 在AOP&#xff0c;權限控制&#xff0c;事務管理等…

iOS開發UI篇—Quartz2D使用(繪圖路徑)

1 //1.獲取圖形上下文 2 CGContextRef ctxUIGraphicsGetCurrentContext(); 3 //2.繪圖&#xff08;畫線&#xff09; 4 //設置起點 5 CGContextMoveToPoint(ctx, 20, 20); 6 //設置終點 7 CGContextAddLineToPoint(ctx, 200, 300); 8 //渲染 9…

2.9 bitset

#include<bitset> bitset容器是一個bit位元素的序列容器&#xff0c;每個元素只占一個bit位&#xff0c;取值為0或1&#xff0c;因而很節省內存空間。 bitset<n> b; b.any() 是否有1 b.none() 是否無1 b.count() 1的個數 b.size() 大小 b[pos] 訪問 b.…

C# 談談Interface和通過Interface傳遞web頁面數據

接口&#xff1a;描述可屬于任何類或結構的一組相關功能&#xff0c;通過interface關鍵字來聲明&#xff1b;接口只包含方法、委托或事件和屬性的簽名&#xff08;接口包含的成員&#xff09;、不能包含字段&#xff08;因為字段是包含數據的&#xff09;。方法的實現是“繼承”…

Spring支持如下5種作用域

當通過Spring容器創建一個Bean實例時&#xff0c;不僅可以完成Bean實例的實例化&#xff0c;還可以為Bean指定特定的作用域。Spring支持如下5種作用域&#xff1a; singleton&#xff1a;單例模式&#xff0c;在整個Spring IoC容器中&#xff0c;使用singleton定義的Bean將只有…

RBAC授權

給用戶授予RBAC權限沒有權限會報如下錯誤&#xff1a;執行查看資源報錯&#xff1a; unable to upgrade connection: Forbidden (userkubernetes, verbcreate, resourcenodes, subresourceproxy)[roottest4 ~]# kubectl exec -it http-test-dm2-6dbd76c7dd-cv9qf sh error: una…

出卷子

http://chujuanzi.com/ 出卷子 涵蓋初高中全部學科題庫&#xff0c;全國名校試卷最快更新。試卷新、試題全、解析準、完全免費&#xff0c;提供豐富試題輔助教師有效出試卷&#xff0c;組卷方便快捷。&#xff08;高中語文 高中數學 高中英語 高中物理 高中化學 高中生物 高中政…

2.10 stack

#include<stack> 后進先出 Last In First Out LIFO 插入和刪除元素只能在表的一端進行。 插入端 棧頂 Stack Top 入棧 Push 刪除端 棧底 Stack Bottom 出棧 Pop stack<int> s; s.push(1); //入棧 int i s.top(); //獲得棧頂元素 s.pop(); //出棧 s.size…

13結構型模式之橋接模式

概念 Bridge 模式又叫做橋接模式&#xff0c;是構造型的設計模式之一。Bridge模式基于類的最小設計原則&#xff0c;通過使用封裝&#xff0c;聚合以及繼承等行為來讓不同的類承擔不同的責任。它的主要特點是把抽象&#xff08;abstraction&#xff09;與行為實現&#xff08;i…

話說Svn與Git的區別

把第一條理解到位思想到位了做起來才會有的放矢&#xff0c;其他幾條都是用的時候才能體會到 1) 最核心的區別Git是分布式的&#xff0c;而Svn不是分布的。能理解這點&#xff0c;上手會很容易&#xff0c;聲明一點Git并不是目前唯一的分布式版本控制系統&#xff0c;還有比如M…

Ubuntu下Postgres安裝與配置

postgres8.4安裝配置&#xff1a;1.安裝postgres8.4~$ sudo apt-get install postgresql 2.修改超級管理員postgres密碼&#xff1a;以系統用戶運行psql~$ sudo -u postgres psql postgres修改postgres密碼(123456)postgres# /password postgres 3.備份修改的配置文件&#xff…

2.11 queue

#include<queue> 先進先出&#xff08;First In First Out, FIFO&#xff09; 隊尾插入&#xff0c;隊首刪除 queue<int> q; q.push(1); //入隊 int qf q.front(); //獲取隊首元素 int qe q.back(); //獲取隊尾元素 q.pop(); //出隊 q.size(); //大小 q.…

簡易中控紫貓插件版(3)壓縮包使用說明

1.環境配置腳本運行環境&#xff1a;沒什么說的 正常的最新版手機按鍵 當然還需要 最新的紫貓插件中控運行環境&#xff1a;首先要保證把壓縮包的所有php文件都扔到網站的根目錄下 必須保證網站的php版本是5.4 不然紫貓插件的php框架會出問題 然后你要知道網站數據庫的賬號和密…

Java9新特性

Java 8 發布三年多之后&#xff0c;即將快到2017年7月下一個版本發布的日期了。 你可能已經聽說過 Java 9 的模塊系統&#xff0c;但是這個新版本還有許多其它的更新。 這里有九個令人興奮的新功能將與 Java 9 一起發布。 1. Java 平臺級模塊系統 Java 9 的定義功能是一套全新的…

IOS 應用中從豎屏模式強制轉換為橫屏模式

在 iPhone 應用里&#xff0c;有時我們想強行把顯示模式從縱屏改為橫屏&#xff08;反之亦然&#xff09;&#xff0c;CocoaChina 會員 “alienblue” 為我們提供了兩種思路第一種&#xff1a;通過人為的辦法改變view.transform的屬性。具體辦法&#xff1a;view.transform一般…

2.12 priority_queue

#include<queue> priority_queue與queue的不同&#xff1a;最大元素位于隊首 priority_queue<int> pq; pq.push(1); //入隊 pq.pop(); //出隊 int i pq.top(); //獲取隊首元素 pq.size(); //大小 pq.empty(); //判空 如果隊列元素是結構體&#xff0c;重載&…

vue資料鏈接

vue 官方api&#xff1a;https://cn.vuejs.org/ vue資源精選&#xff1a;http://vue.awesometiny.com/ vue GitHub地址&#xff1a;https://github.com/vuejs/vue element-ui 官方中文api&#xff1a;http://element-cn.eleme.io/#/zh-CN/component/dropdown swiper中文網&…

Java面試常見算法

在程序員的職業生涯中&#xff0c;算法亦算是一門基礎課程&#xff0c;尤其是在面試的時候&#xff0c;很多公司都會讓程序員編寫一些算法實例&#xff0c;例如快速排序、二叉樹查找等等。 本文總結了程序員在代碼面試中最常遇到的10大算法類型&#xff0c;想要真正了解這些算法…