浅析:通过自定义DSL实现一个序列号生成器
原始文章首發于個人博客
一、什么是DSL
DSL是(Domain Specified Language)的簡稱,中文含義為:領域專用語言。
設計者通過特定的語義,描述一些在特定的應用場景中出現的東西。
二、為什么要使用DSL
設計并使用DSL的優勢在于:在解決特定問題時,有更簡潔、更強大的語義表達能力。可以使用更少的代碼(或配置)來描述問題,開發效率高。
我們在日常工作中,往往會在大量重復性的工作上浪費大量時間。針對這種共性很強的工作,我們設計一個具有通用性和簡潔性的描述性語言,可以減輕我們的工作負擔,也可以使項目代碼更簡潔易讀。
三、分析業務需求
在公司內部系統開發中,有一個這樣的需求:
需要設計一個序列號生成器,它能放在不同模塊代碼中,根據不同模塊的序列號生成規則生成序列號。
通過分析生成規則,發現序列號生成器需要包含的功能有:
1. 在不同業務模塊中生成的模塊CODE不一樣
2. 需要包含當前日期。但生成的日期格式每個模塊可能會不一樣。(有的是yyyy-MM-dd,有的是yyyyMMdd等)
3. 需要生成流水號。流水號各個模塊需要生成的位數可能不一樣,有的需要定長4位,有的需要定長3位。位數不足的有的需要左補0(或者左補其他符號)
四、DSL設計
通過上述的需求分析,我們不難看出:
綜上所述,便有了2種解決思路:
第一種“手動指定策略”的思路我們先不詳細說。這里來詳細說說第二種思路。
因為在業務需求中只有4個變量,所以我們首先得給那4個變量起個名字:
例如:
- 模塊編碼可以使用: ${module_code}來表示
- 日期可以使用:${date}來表示
等等…
五、詳細代碼設計
- 首先準備一個配置類,將梳理好的模塊編碼都放進去
- 使用自定義注解指定序列號生成策略
如上圖所示,電腦前有新的同學肯定已經發現了:里面還內嵌了一個@Appender注解。啥是@Appender注解?
@Appender注解定義長這樣:
這是因為考慮到后期的代碼擴展性,我將流水號生成的策略(占幾位,補什么符號等)抽離出來,使用@Appender注解可以起到靈活配置的作用。
- 寫一個腳本解析器,用于解析注解中的序列號生成策略
首先讀取注解內容
計算或獲取實際內容,然后替換掉生成策略腳本中對應的變量占位符
(注:為了精細化控制日期顯示格式,所以在代碼中用了多種日期格式變量)
字符替換方法詳情:
六、總結
上面只是簡單地談一談一種基于自定義DSL,結合注解形式來寫一個序列號生成器地思路。還有很多細枝末節的東西沒有說到,例如:
- 如何保證每天生成的流水號從1開始順序累加? --redis或其他分布式鎖機制
- 如何用最短代碼將多個模塊共用同一套生成策略?
- 如何同時集成“自動生成”和“手動生成”兩種方式?
如果展開說那又可以水一篇博文了,這篇文章主要說一下思路,也算是給自己做一個經驗累積~
總結
以上是生活随笔為你收集整理的浅析:通过自定义DSL实现一个序列号生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于排队论模型的收银台服务系统的分析及可
- 下一篇: module_init和module_e