欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java如何構(gòu)造DSL方法重構(gòu)

 更新時(shí)間:2022年07月07日 14:34:42   作者:??你呀不牛??  
這篇文章主要介紹了Java如何構(gòu)造DSL方法重構(gòu),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考價(jià)值

DSL

Domain-specific language: 一種專注于某一領(lǐng)域,僅針對(duì)部分表達(dá)方式的計(jì)算機(jī)編程語(yǔ)言。

特點(diǎn)

  • 方法鏈 Method Chaining
  • 功能序列 Functional Sequence
  • 嵌套函數(shù) Nested Functions 嵌套函數(shù)
  • Lambda表達(dá)式/閉包 Lambda Expressions/Closures

概念有點(diǎn)抽象,先看代碼吧

假設(shè)你想發(fā)一些郵件,你需要一個(gè)類能夠方便的設(shè)置收信人、發(fā)信人、標(biāo)題、內(nèi)容。

一個(gè)傳統(tǒng)的java api(具體業(yè)務(wù)代碼都省略了):

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() {
    }
}

測(cè)試要這樣寫:

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();
}

我們可以做些重構(gòu),使這個(gè)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() {
    }
}

這樣看起來(lái)好多了,但是如果能消除new就更好了。因?yàn)橛脩舻呐d趣在于發(fā)送郵件,而不是在創(chuàng)建對(duì)象。

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();
}

測(cè)試:

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();
}

可以做一下靜態(tài)導(dǎo)入

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();
}

這樣,一個(gè)DSL的語(yǔ)句就完成了。一般來(lái)說(shuō),使用Java編寫的DSL不會(huì)造就一門業(yè)務(wù)用戶可以上手的語(yǔ)言,而會(huì)是一種業(yè)務(wù)用戶也會(huì)覺得易讀的語(yǔ)言,同時(shí),從程序員的角度,它也會(huì)是一種閱讀和編寫都很直接的語(yǔ)言。

小結(jié)

創(chuàng)建DSL最好的方法是,首先將所需的API原型化,然后在基礎(chǔ)語(yǔ)言的約束下將它實(shí)現(xiàn)。DSL的實(shí)現(xiàn)將會(huì)牽涉到連續(xù)不斷的測(cè)試來(lái)肯定我們的開發(fā)確實(shí)瞄準(zhǔn)了正確的方向。該“原型-測(cè)試”方法正是測(cè)試驅(qū)動(dòng)開發(fā)模式(TDD-Test-Driven Development)所提倡的。

其實(shí)JDK8提供的很多api已經(jīng)有很多內(nèi)部DSL的語(yǔ)義,比如Stream流的find、count等操作都是一種DSL的語(yǔ)義表達(dá),本文只是簡(jiǎn)單的說(shuō)明了如何構(gòu)造DSL,有機(jī)會(huì)計(jì)劃找一個(gè)實(shí)際的業(yè)務(wù)代碼用DSL的方式重構(gòu),敬請(qǐng)期待。

相關(guān)文章

  • Map映射LinkedHashSet與LinkedHashMap應(yīng)用解析

    Map映射LinkedHashSet與LinkedHashMap應(yīng)用解析

    這篇文章主要為大家介紹了Map映射LinkedHashSet與LinkedHashMap的應(yīng)用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步
    2022-03-03
  • springboot自動(dòng)裝配的源碼與流程圖

    springboot自動(dòng)裝配的源碼與流程圖

    在日常的開發(fā)過(guò)程中Spring Boot自動(dòng)裝配的特性給我們開發(fā)減少了很多重復(fù)性的工作,這篇文章主要給大家介紹了關(guān)于springboot自動(dòng)裝配的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 值得Java開發(fā)者關(guān)注的7款新工具

    值得Java開發(fā)者關(guān)注的7款新工具

    作為老牌語(yǔ)言Java,其生態(tài)圈也出來(lái)了一些有關(guān)云服務(wù)、監(jiān)控、文檔分享方面的工具,這篇文章主要介紹了Java開發(fā)者值得關(guān)注的7款新工具,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Java 基礎(chǔ)之內(nèi)部類詳解及實(shí)例

    Java 基礎(chǔ)之內(nèi)部類詳解及實(shí)例

    這篇文章主要介紹了 Java 基礎(chǔ)之內(nèi)部類詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 解決springcloud-gateway限流遇到的問(wèn)題

    解決springcloud-gateway限流遇到的問(wèn)題

    這篇文章主要介紹了解決springcloud-gateway限流遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java Iterator接口遍歷單列集合迭代器原理詳解

    Java Iterator接口遍歷單列集合迭代器原理詳解

    這篇文章主要介紹了Java Iterator接口遍歷單列集合迭代器原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java在PDF中添加表格過(guò)程詳解

    Java在PDF中添加表格過(guò)程詳解

    這篇文章主要介紹了Java在PDF中添加表格過(guò)程詳解,本文將介紹通過(guò)Java編程在PDF文檔中添加表格的方法。添加表格時(shí),可設(shè)置表格邊框、單元格對(duì)齊方式、單元格背景色、單元格合并、插入圖片、設(shè)置行高、列寬、字體、字號(hào)等,需要的朋友可以參考下
    2019-07-07
  • 一文帶你看懂Android動(dòng)畫的實(shí)現(xiàn)原理

    一文帶你看懂Android動(dòng)畫的實(shí)現(xiàn)原理

    動(dòng)畫是 Android 應(yīng)用程序中重要的交互特性,ndroid 提供了多種動(dòng)畫效果,包括平移、縮放、旋轉(zhuǎn)和透明度等,它們可以通過(guò)代碼或 XML 來(lái)實(shí)現(xiàn),本文將介紹 Android 動(dòng)畫的原理和實(shí)現(xiàn)方法,并提供一些示例,需要的朋友可以參考下
    2023-07-07
  • java實(shí)現(xiàn)微信支付結(jié)果通知

    java實(shí)現(xiàn)微信支付結(jié)果通知

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信支付結(jié)果通知,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java取整與四舍五入

    Java取整與四舍五入

    本文詳細(xì)講解了Java取整與四舍五入,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評(píng)論