天天看點

C# 使用Fluent API 建立自己的DSL

DSL的作用是解決領域專家與軟體開發人員之間的溝通問題。聽起來很唬人,其實不是什麼高深的東西,我們可以使用Fluent API 建立自己的DSL

DSL(Domain Specified Language)領域專用語言是描述特定領域問題的語言,聽起來很唬人,其實不是什麼高深的東西。看一下下面的代碼:

這段代碼根據學生的身高體重,計算BMI并判斷狀态(偏瘦、正常、超重還是肥胖),看到這裡,各位同學可能已經發現問題了:學生有國小生、中學生和大學生,難道計算算法一樣?男生女生的計算算法也一樣?在這個問題中,各位都是領域專家,從我寫的描述特定問題的代碼中發現了問題,我需要對代碼進行修改,增加年齡和性别因素。

從上面的例子可以看到DSL的作用:是解決領域專家與軟體開發人員之間的溝通問題。領域專家通常不懂得程式設計,無法判斷開發人員寫的代碼是否符合領域的要求,隻能是等到軟體編寫完成,從軟體運作表現出來的功能進行判斷,而這時成本已經發生了,幾個來回下來,進度逾時,成本超支。DSL使用領域相關的術語編寫,領域專家可以了解,而語言本身基于某種宿主語言,比如C#,可以編譯運作,容易驗證。是以恰當的DSL可以打通領域專家和開發人員之間的障礙,使軟體的業務核心部分開發可靠并有效率。“可以執行”是DSL與需求階段使用的僞語言或者帶圖示的自然語言最大的不同。在需求描述的時候,經常使用各種圖示或者僞語言對業務進行描述,僞語言一般是一種類似的結構化語言,這種貌似語言的東西往往是很有害的,因為隻是大概描述了過程,很多實作細節被忽略或者隐藏了。由于不是嚴格的程式設計語言,無法生成可執行的代碼,是以也就無法驗證對錯。

結合上面的例子,我們看一下如何使用Fluent Api建立自己的DSL。其使用的技術實質上是實作現有類型的擴充,這需要我們1)聲明一個static類,2)在類中使用static函數,3)使用this關鍵字修飾需要擴充的類型。上面的"張三".是學生(),“是學生”是字元串類型的一個擴充,傳回的是自己定義的Student類型,這段代碼如下:

在Student類中隻定義關鍵屬性:

怎麼樣,挺簡單的吧。完整的代碼上傳到github: https://github.com/zhenl/FlunetApiDemo

最後的問題是代碼中的中文問題,我的原則是怎麼友善怎麼來,通常我們編寫程式時不主張使用中文作為變量或者方法名稱,盡管現代程式設計語言的編譯器很多已經不限于隻支援ASCII碼,但我們仍然無法確定在某些情況下不出現問題(比如如果将中文命名的方法映射為Web Api接口,不支援中文的用戶端可能無法調用這個Api)。然而作為領域特定語言的DSL就不用有這個限制,DSL的主要目的就是溝通,如果必須用英文或者漢語拼音進行編寫,效果就會大打折扣,更不用說很多領域都是中文為主的,這裡不展開說了,舉幾個例子,“唐詩”、“宋詞”、“元曲”估計翻成英語領域專家和程式員都看不懂。

本文來自部落格園,作者:尋找無名的特質,轉載請注明原文連結:https://www.cnblogs.com/zhenl/p/15725290.html

繼續閱讀