我畫著圖,FluentAPI 她自己就生成了
- 2020 年 11 月 17 日
- 筆記
在 Newbe.ObjectVistor 0.3 版本中我們非常興奮的引入了一個緊張刺激的新特性:使用狀態圖來生成任意給定的 FluentAPI 設計。
開篇摘要
在非常多優秀的框架中都存在一部分 FluentAPI 的設計。這種 API 設計更加符合人類自言語言描述。使得代碼更加具備可讀性。
在 Newbe.ObjectVistor 0.3 版本中,我們設計引入了一種使用狀態圖來自動生成 FluentAPI 代碼的機制。極大了簡化了 FluentAPI 實現所需要的腦力勞動。
本篇我們將通過一些示例,來了解一下當前版本中該特性的主要效果。
整數累加 FluentAPI
假如,我們現在需要實現下面這樣效果的一個 API:
這個 API 使用 FluentAPI 的方式來表述一個累加的過程。
為了實現這個 API 設計,在 Newbe.ObjectVisitor 0.3 中,使用下面這樣一個狀態圖標記表述這個 API 設計:
這實際上是 mermaid 狀態圖標記。轉換為圖形即為下面這個效果。不需要過多的解釋就可以理解:
有了這個狀態圖之後,使用 Newbe.ObjectVisitor 中的 FluentApiDesignParser
和 FluentApiFileGenerator
便可以生成如下代碼。
有了這個模板之後,只要實現 Core_AddNumber
和 Core_Sum
,一個符合預期設計的 FluentAPI 就完成了!
累加後累乘
現在,我們稍微改變一下需求。上節我們實現的是一個 1+2+3 這樣的累加效果。現在我們需要一個 (1+2+3)*(4+5+6)*(7+8+9+10) 這樣的效果。
示例的調用代碼如下:
為了實現這個效果,我們修改一下狀態圖,增加一條新的規則,得到:
如圖:
創建數據庫鏈接字符串
前面的示例或許缺乏生產實際,現在添加一個生產示例。我們現在要實現一個 ConnectionStringBuilder 用來創建數據庫連接字符串,其中有以下限制:
- 必須指定 Host。
- 身份認證方式必須且只能指定一種,要麼是用戶名密碼方式,要麼是 Windows 憑據。
首先,我們有一個模型來保存上面提到的數據。
接着,我們直接使用狀態圖來設計這個 FluentAPI。設計結果如下:
如圖:
有了設計,接下來就是使用生成器啪嗒一下生成代碼,然後添加實現,這裡只展示需要自己實現的內容:
下面是簡單的兩個測試用例:
值得特別提出但是,這和直接使用 ConnectionStringModel 模型來構建字符串,通過 FluentAPI 的形式,約束了開發者能夠賦值的屬性。可以避免忘記對必要的屬性賦值或者錯誤賦值等等出錯情況。
Get 和 Delete 沒有 Body,Post 和 Put 才有
和上一節類型,我們使用 FluentAPI 來構建請求,但是需要滿足以下約束:
- 可以指定 Uri
- Get 和 Delete 不能指定 Body,但是 Post 和 Put 可以
上設計:
上圖:
注意,這裡引入了一些奇怪的關鍵詞 share
,由於這些關鍵詞還未全部定稿,因此不展開說明。
可以通過以下鏈接,查看生成的代碼和測試用例。
造一輛汽車一定要四個輪子一個引擎
我們需要實現一個 CarBuilder,有一些約束:
- CarBuilder 當且僅當在調用四次 AddWheel 和一次 AddEngine 之後才能出現 Build 方法
- 雖然限制了次數,但是,順序不能限定,什麼順序都可以。
上設計:
上圖,這個圖從出發點出發,不論怎麼走都會經過四次 AddWheel 和 一次 AddEngine:
注意,雖然設計看起來非常複雜,但是,需要手寫的代碼只有非常簡短的兩段:
可以通過以下鏈接,查看生成的代碼和測試用例。
本篇總結
這是一個很有意思的設計,如果你對這個設計很感興趣,有新奇的想法,歡迎關注 Newbe.ObjectVisitor 項目,提出您的寶貴想法。
發佈說明
- Newbe.ObjectVisitor 0.3.7 發佈,自動生成 FluentAPI
- Newbe.ObjectVisitor 0.2.10 發佈,更花里胡哨
- Newbe.ObjectVisitor 0.1.4 發佈,初始版本
使用樣例
番外分享
GitHub 項目地址://github.com/newbe36524/Newbe.ObjectVisitor
Gitee 項目地址://gitee.com/yks/Newbe.ObjectVisitor
- 本文作者: newbe36524
- 本文鏈接: //www.newbe.pro/Newbe.ObjectVisitor/Generate-Fluent-API-by-Design/
- 版權聲明: 本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!