最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

DSL

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

特點(diǎn)

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

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

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

一個傳統(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() {
    }
}

測試要這樣寫:

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),使這個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就更好了。因?yàn)橛脩舻呐d趣在于發(fā)送郵件,而不是在創(chuàng)建對象。

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

可以做一下靜態(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();
}

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

小結(jié)

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

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

相關(guān)文章

  • java web實(shí)現(xiàn)簡單留言板功能

    java web實(shí)現(xiàn)簡單留言板功能

    這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)簡單留言板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Spring筆記-@Order注解和Ordered接口解析

    Spring筆記-@Order注解和Ordered接口解析

    這篇文章主要介紹了Spring筆記-@Order注解和Ordered接口,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • logback FixedWindowRollingPolicy固定窗口算法重命名文件滾動策略

    logback FixedWindowRollingPolicy固定窗口算法重命名文件滾動策略

    這篇文章主要介紹了FixedWindowRollingPolicy根據(jù)logback 固定窗口算法重命名文件滾動策略源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • java 工廠模式的實(shí)例詳解

    java 工廠模式的實(shí)例詳解

    這篇文章主要介紹了java 工廠模式的實(shí)例詳解的相關(guān)資料,這里舉例說明該如何實(shí)現(xiàn)工廠模式,需要的朋友可以參考下
    2017-09-09
  • java開發(fā)主流定時任務(wù)解決方案全橫評詳解

    java開發(fā)主流定時任務(wù)解決方案全橫評詳解

    這篇文章主要為大家介紹了java開發(fā)主流定時任務(wù)解決方案全橫評詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 移除元素Java實(shí)現(xiàn)方式

    移除元素Java實(shí)現(xiàn)方式

    這篇文章主要介紹了移除元素Java實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 淺談java中BigDecimal類的簡單用法

    淺談java中BigDecimal類的簡單用法

    這篇文章主要介紹了淺談java中BigDecimal類的簡單用法,在開發(fā)時,如果我們需要精確計(jì)算的結(jié)果,必須使用BigDecimal類來操作。感興趣的話可以了解一下
    2020-07-07
  • 解讀Spring框架中常用的設(shè)計(jì)模式

    解讀Spring框架中常用的設(shè)計(jì)模式

    這篇文章主要介紹了解讀Spring框架中常用的設(shè)計(jì)模式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • jvm原理之SystemGC源碼分析

    jvm原理之SystemGC源碼分析

    這篇文章主要介紹了jvm源碼分析之SystemGC的完全解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-01-01
  • Springboot集成graylog及配置過程解析

    Springboot集成graylog及配置過程解析

    這篇文章主要介紹了Springboot集成graylog及配置過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12

最新評論

上思县| 阜平县| 天峨县| 桃园市| 偃师市| 南皮县| 惠东县| 宣城市| 郓城县| 荔波县| 彝良县| 财经| 襄樊市| 米泉市| 英吉沙县| 岳阳县| 延长县| 寻甸| 尤溪县| 日喀则市| 大同市| 安康市| 外汇| 延川县| 玛纳斯县| 武清区| 呼玛县| 宝山区| 新宾| 云林县| 左云县| 陆河县| 永州市| 石家庄市| 河间市| 江华| 平和县| 沁源县| 新宁县| 津南区| 弋阳县|