日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅析:通过自定义DSL实现一个序列号生成器

發布時間:2024/8/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析:通过自定义DSL实现一个序列号生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原始文章首發于個人博客

一、什么是DSL

DSL是(Domain Specified Language)的簡稱,中文含義為:領域專用語言。
設計者通過特定的語義,描述一些在特定的應用場景中出現的東西。

二、為什么要使用DSL

設計并使用DSL的優勢在于:在解決特定問題時,有更簡潔、更強大的語義表達能力。可以使用更少的代碼(或配置)來描述問題,開發效率高。

我們在日常工作中,往往會在大量重復性的工作上浪費大量時間。針對這種共性很強的工作,我們設計一個具有通用性和簡潔性的描述性語言,可以減輕我們的工作負擔,也可以使項目代碼更簡潔易讀。

三、分析業務需求

在公司內部系統開發中,有一個這樣的需求:

需要設計一個序列號生成器,它能放在不同模塊代碼中,根據不同模塊的序列號生成規則生成序列號。

通過分析生成規則,發現序列號生成器需要包含的功能有:

1. 在不同業務模塊中生成的模塊CODE不一樣
2. 需要包含當前日期。但生成的日期格式每個模塊可能會不一樣。(有的是yyyy-MM-dd,有的是yyyyMMdd等)
3. 需要生成流水號。流水號各個模塊需要生成的位數可能不一樣,有的需要定長4位,有的需要定長3位。位數不足的有的需要左補0(或者左補其他符號)

四、DSL設計

通過上述的需求分析,我們不難看出:

  • 各個業務模塊的序列號生成策略有一定的共性:比如都可能包含:日期、流水號等
  • 序列號生成策略中的變量僅有:模塊編碼、日期、流水號這三項,且業務模塊對于流水號的需求僅定長不同
  • 綜上所述,便有了2種解決思路:

  • 設計一個序列號生成工廠組件,提供:模塊編碼、日期、流水號等生成策略選項,由開發人員在實際開發過程中自己調用相關方法,按需使用。
  • 考慮到每個模塊都對應一個唯一的模塊編碼(模塊編碼要有,但是可以不作為生成序列號的一部分被顯示),因此可以將業務模塊和對應的模塊編碼相綁定。然后再利用注解,在對應的模塊編碼上指定相應的生成策略。
  • 第一種“手動指定策略”的思路我們先不詳細說。這里來詳細說說第二種思路。

  • 先將各個業務模塊對應的模塊編碼梳理出來,整理成一個配置類
  • 在配置類中的模塊編碼上,使用注解指定該模塊對應的序列號生成規則
  • 打算使用類似于EL表達式中取值的方式(即:類似于:xxx的方式)(注:后續代碼中為了方便,直接用了的方式來取值,就沒有寫{xxx}的方式)(注:后續代碼中為了方便,直接用了{}的方式來取值,就沒有寫xxx便了)來實時計算并填充數據
  • 將計算出來的序列號返回
  • 因為在業務需求中只有4個變量,所以我們首先得給那4個變量起個名字:
    例如:

    • 模塊編碼可以使用: ${module_code}來表示
    • 日期可以使用:${date}來表示
      等等…

    五、詳細代碼設計

    • 首先準備一個配置類,將梳理好的模塊編碼都放進去
    • 使用自定義注解指定序列號生成策略

    如上圖所示,電腦前有新的同學肯定已經發現了:里面還內嵌了一個@Appender注解。啥是@Appender注解?
    @Appender注解定義長這樣:

    這是因為考慮到后期的代碼擴展性,我將流水號生成的策略(占幾位,補什么符號等)抽離出來,使用@Appender注解可以起到靈活配置的作用。

    • 寫一個腳本解析器,用于解析注解中的序列號生成策略
  • 首先讀取注解內容

  • 計算或獲取實際內容,然后替換掉生成策略腳本中對應的變量占位符
    (注:為了精細化控制日期顯示格式,所以在代碼中用了多種日期格式變量)

  • 字符替換方法詳情:

    六、總結

    上面只是簡單地談一談一種基于自定義DSL,結合注解形式來寫一個序列號生成器地思路。還有很多細枝末節的東西沒有說到,例如:

    • 如何保證每天生成的流水號從1開始順序累加? --redis或其他分布式鎖機制
    • 如何用最短代碼將多個模塊共用同一套生成策略?
    • 如何同時集成“自動生成”和“手動生成”兩種方式?

    如果展開說那又可以水一篇博文了,這篇文章主要說一下思路,也算是給自己做一個經驗累積~

    總結

    以上是生活随笔為你收集整理的浅析:通过自定义DSL实现一个序列号生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。