<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Domain-specific language: 一種專注於某一領域,僅針對部分表達方式的計算機程式語言。
概念有點抽象,先看程式碼吧
假設你想發一些郵件,你需要一個類能夠方便的設定收信人、發信人、標題、內容。
一個傳統的java api(具體業務程式碼都省略了):
public class Mailer { public void from(String fromAddress) { } public void to(String toAddress) { } public void subject(String theSubject) { } public void message(String body) { } public void send() { } }
測試要這樣寫:
public static void main(String[] args) { Mailer mailer = new Mailer(); mailer.from("build@example.com"); mailer.to("example@example.com"); mailer.subject("build notification"); mailer.message("some details about build status"); mailer.send(); }
我們可以做些重構,使這個api更流暢,更像DSL。
package dsl.example; public class Mailer { public Mailer from(String fromAddress) { return this; } public Mailer to(String toAddress) { return this; } public Mailer subject(String theSubject) { return this; } public Mailer message(String body) { return this; } public void send() { } }
這樣看起來好多了,但是如果能消除new就更好了。因為使用者的興趣在於傳送郵件,而不是在建立物件。
public static void main(String[] args) { new Mailer() .from("build@example.com") .to("example@example.com") .subject("build notification") .message("some details about build status") .send(); }
測試:
public static void main(String[] args) { Mailer.mail() .from("build@example.com") .to("example@example.com") .subject("build notification") .message("some details about build status") .send(); }
可以做一下靜態匯入
public static void main(String[] args) { import static dsl.example.Mailer.mail;mail() .from("build@example.com") .to("example@example.com") .subject("build notification") .message("some details about build status") .send(); }
這樣,一個DSL的語句就完成了。一般來說,使用Java編寫的DSL不會造就一門業務使用者可以上手的語言,而會是一種業務使用者也會覺得易讀的語言,同時,從程式設計師的角度,它也會是一種閱讀和編寫都很直接的語言。
建立DSL最好的方法是,首先將所需的API原型化,然後在基礎語言的約束下將它實現。DSL的實現將會牽涉到連續不斷的測試來肯定我們的開發確實瞄準了正確的方向。該“原型-測試”方法正是測試驅動開發模式(TDD-Test-Driven Development)所提倡的。
其實JDK8提供的很多api已經有很多內部DSL的語意,比如Stream流的find、count等操作都是一種DSL的語意表達,本文只是簡單的說明了如何構造DSL,有機會計劃找一個實際的業務程式碼用DSL的方式重構,敬請期待。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45