網站首頁 編程語言 正文
DSL的作用是解決領域專家與軟件開發人員之間的溝通問題。聽起來很唬人,其實不是什么高深的東西,我們可以使用Fluent API 創建自己的DSL
DSL(Domain Specified Language)領域專用語言是描述特定領域問題的語言,聽起來很唬人,其實不是什么高深的東西。看一下下面的代碼:
using FlunetApiDemo; var 張三 = "張三" .是學生() .身高(1.62M) .體重(48M); Console.WriteLine(張三.BMI()); Console.WriteLine(張三.BMI狀態());
這段代碼根據學生的身高體重,計算BMI并判斷狀態(偏瘦、正常、超重還是肥胖),看到這里,各位同學可能已經發現問題了:學生有小學生、中學生和大學生,難道計算算法一樣?男生女生的計算算法也一樣?在這個問題中,各位都是領域專家,從我寫的描述特定問題的代碼中發現了問題,我需要對代碼進行修改,增加年齡和性別因素。
從上面的例子可以看到DSL的作用:是解決領域專家與軟件開發人員之間的溝通問題。領域專家通常不懂得編程,無法判斷開發人員寫的代碼是否符合領域的要求,只能是等到軟件編寫完成,從軟件運行表現出來的功能進行判斷,而這時成本已經發生了,幾個來回下來,進度超時,成本超支。DSL使用領域相關的術語編寫,領域專家可以理解,而語言本身基于某種宿主語言,比如C#,可以編譯運行,容易驗證。所以恰當的DSL可以打通領域專家和開發人員之間的障礙,使軟件的業務核心部分開發可靠并有效率。“可以執行”是DSL與需求階段使用的偽語言或者帶圖示的自然語言最大的不同。在需求描述的時候,經常使用各種圖示或者偽語言對業務進行描述,偽語言一般是一種類似的結構化語言,這種貌似語言的東西往往是很有害的,因為只是大概描述了過程,很多實現細節被忽略或者隱藏了。由于不是嚴格的編程語言,無法生成可執行的代碼,所以也就無法驗證對錯。
結合上面的例子,我們看一下如何使用Fluent Api創建自己的DSL。其使用的技術實質上是實現現有類型的擴展,這需要我們1)聲明一個static類,2)在類中使用static函數,3)使用this關鍵字修飾需要擴展的類型。上面的"張三".是學生(),“是學生”是字符串類型的一個擴展,返回的是自己定義的Student類型,這段代碼如下:
namespace FlunetApiDemo { public static class FluentExt { public static Student 是學生(this string name) { return new Student { Name = name }; } public static Student 身高(this Student student,decimal height) { student.Height = height; return student; } public static Student 體重(this Student student, decimal weight) { student.Weight = weight; return student; } public static decimal BMI(this Student student) { return student.Weight / student.Height / student.Height; } public static string BMI狀態(this Student student) { var bmi=student.BMI(); if (bmi > 24) return "肥胖"; if (bmi > 21) return "超重"; if (bmi < 15) return "偏瘦"; return "正常"; } } }
在Student類中只定義關鍵屬性:
namespace FlunetApiDemo { public class Student { public string Name { get; set; }=string.Empty; public decimal Height { get; set; } public decimal Weight { get; set; } public override string ToString() { return Name; } } }
怎么樣,挺簡單的吧。完整的代碼上傳到github: https://github.com/zhenl/FlunetApiDemo
最后的問題是代碼中的中文問題,我的原則是怎么方便怎么來,通常我們編寫程序時不主張使用中文作為變量或者方法名稱,盡管現代編程語言的編譯器很多已經不限于只支持ASCII碼,但我們仍然無法確保在某些情況下不出現問題(比如如果將中文命名的方法映射為Web Api接口,不支持中文的客戶端可能無法調用這個Api)。然而作為領域特定語言的DSL就不用有這個限制,DSL的主要目的就是溝通,如果必須用英文或者漢語拼音進行編寫,效果就會大打折扣,更不用說很多領域都是中文為主的,這里不展開說了,舉幾個例子,“唐詩”、“宋詞”、“元曲”估計翻成英語領域專家和程序員都看不懂。
原文鏈接:https://www.cnblogs.com/zhenl/p/15725290.html
相關推薦
- 2022-05-29 Python實現灰色關聯分析與結果可視化的詳細代碼_python
- 2022-10-27 python中partial庫的使用方法解析_python
- 2024-01-13 什么是B+樹?
- 2022-11-15 ASP.NET?MVC遍歷驗證ModelState的錯誤信息_實用技巧
- 2022-03-28 Easyx實現窗口自動碰撞的小球_C 語言
- 2022-09-12 shell腳本5種執行方式及腳本不同的執行方法和區別詳解_linux shell
- 2023-03-01 PostgreSQL生成列實現過程介紹_PostgreSQL
- 2022-10-01 Python?from?import導包ModuleNotFoundError?No?module?
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支