C#?使用Fluent?API?創(chuàng)建自己的DSL(推薦)
DSL的作用是解決領(lǐng)域?qū)<遗c軟件開(kāi)發(fā)人員之間的溝通問(wèn)題。聽(tīng)起來(lái)很唬人,其實(shí)不是什么高深的東西,我們可以使用Fluent API 創(chuàng)建自己的DSL
DSL(Domain Specified Language)領(lǐng)域?qū)S谜Z(yǔ)言是描述特定領(lǐng)域問(wèn)題的語(yǔ)言,聽(tīng)起來(lái)很唬人,其實(shí)不是什么高深的東西??匆幌孪旅娴拇a:
using FlunetApiDemo;
var 張三 = "張三"
.是學(xué)生()
.身高(1.62M)
.體重(48M);
Console.WriteLine(張三.BMI());
Console.WriteLine(張三.BMI狀態(tài)());
這段代碼根據(jù)學(xué)生的身高體重,計(jì)算BMI并判斷狀態(tài)(偏瘦、正常、超重還是肥胖),看到這里,各位同學(xué)可能已經(jīng)發(fā)現(xiàn)問(wèn)題了:學(xué)生有小學(xué)生、中學(xué)生和大學(xué)生,難道計(jì)算算法一樣?男生女生的計(jì)算算法也一樣?在這個(gè)問(wèn)題中,各位都是領(lǐng)域?qū)<?,從我?xiě)的描述特定問(wèn)題的代碼中發(fā)現(xiàn)了問(wèn)題,我需要對(duì)代碼進(jìn)行修改,增加年齡和性別因素。
從上面的例子可以看到DSL的作用:是解決領(lǐng)域?qū)<遗c軟件開(kāi)發(fā)人員之間的溝通問(wèn)題。領(lǐng)域?qū)<彝ǔ2欢镁幊?,無(wú)法判斷開(kāi)發(fā)人員寫(xiě)的代碼是否符合領(lǐng)域的要求,只能是等到軟件編寫(xiě)完成,從軟件運(yùn)行表現(xiàn)出來(lái)的功能進(jìn)行判斷,而這時(shí)成本已經(jīng)發(fā)生了,幾個(gè)來(lái)回下來(lái),進(jìn)度超時(shí),成本超支。DSL使用領(lǐng)域相關(guān)的術(shù)語(yǔ)編寫(xiě),領(lǐng)域?qū)<铱梢岳斫猓Z(yǔ)言本身基于某種宿主語(yǔ)言,比如C#,可以編譯運(yùn)行,容易驗(yàn)證。所以恰當(dāng)?shù)腄SL可以打通領(lǐng)域?qū)<液烷_(kāi)發(fā)人員之間的障礙,使軟件的業(yè)務(wù)核心部分開(kāi)發(fā)可靠并有效率?!翱梢詧?zhí)行”是DSL與需求階段使用的偽語(yǔ)言或者帶圖示的自然語(yǔ)言最大的不同。在需求描述的時(shí)候,經(jīng)常使用各種圖示或者偽語(yǔ)言對(duì)業(yè)務(wù)進(jìn)行描述,偽語(yǔ)言一般是一種類(lèi)似的結(jié)構(gòu)化語(yǔ)言,這種貌似語(yǔ)言的東西往往是很有害的,因?yàn)橹皇谴蟾琶枋隽诉^(guò)程,很多實(shí)現(xiàn)細(xì)節(jié)被忽略或者隱藏了。由于不是嚴(yán)格的編程語(yǔ)言,無(wú)法生成可執(zhí)行的代碼,所以也就無(wú)法驗(yàn)證對(duì)錯(cuò)。
結(jié)合上面的例子,我們看一下如何使用Fluent Api創(chuàng)建自己的DSL。其使用的技術(shù)實(shí)質(zhì)上是實(shí)現(xiàn)現(xiàn)有類(lèi)型的擴(kuò)展,這需要我們1)聲明一個(gè)static類(lèi),2)在類(lèi)中使用static函數(shù),3)使用this關(guān)鍵字修飾需要擴(kuò)展的類(lèi)型。上面的"張三".是學(xué)生(),“是學(xué)生”是字符串類(lèi)型的一個(gè)擴(kuò)展,返回的是自己定義的Student類(lèi)型,這段代碼如下:
namespace FlunetApiDemo
{
public static class FluentExt
{
public static Student 是學(xué)生(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狀態(tài)(this Student student)
{
var bmi=student.BMI();
if (bmi > 24) return "肥胖";
if (bmi > 21) return "超重";
if (bmi < 15) return "偏瘦";
return "正常";
}
}
}
在Student類(lèi)中只定義關(guān)鍵屬性:
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;
}
}
}
怎么樣,挺簡(jiǎn)單的吧。完整的代碼上傳到github: https://github.com/zhenl/FlunetApiDemo
最后的問(wèn)題是代碼中的中文問(wèn)題,我的原則是怎么方便怎么來(lái),通常我們編寫(xiě)程序時(shí)不主張使用中文作為變量或者方法名稱,盡管現(xiàn)代編程語(yǔ)言的編譯器很多已經(jīng)不限于只支持ASCII碼,但我們?nèi)匀粺o(wú)法確保在某些情況下不出現(xiàn)問(wèn)題(比如如果將中文命名的方法映射為Web Api接口,不支持中文的客戶端可能無(wú)法調(diào)用這個(gè)Api)。然而作為領(lǐng)域特定語(yǔ)言的DSL就不用有這個(gè)限制,DSL的主要目的就是溝通,如果必須用英文或者漢語(yǔ)拼音進(jìn)行編寫(xiě),效果就會(huì)大打折扣,更不用說(shuō)很多領(lǐng)域都是中文為主的,這里不展開(kāi)說(shuō)了,舉幾個(gè)例子,“唐詩(shī)”、“宋詞”、“元曲”估計(jì)翻成英語(yǔ)領(lǐng)域?qū)<液统绦騿T都看不懂。
到此這篇關(guān)于C# 使用Fluent API 創(chuàng)建自己的DSL的文章就介紹到這了,更多相關(guān)C#? Fluent API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#與C++之間類(lèi)型的對(duì)應(yīng)知識(shí)點(diǎn)總結(jié)
這篇文章主要介紹了C#與C++之間類(lèi)型的對(duì)應(yīng)知識(shí)點(diǎn)總結(jié),對(duì)此有需要的朋友們可以參考下。2019-08-08
implicit關(guān)鍵字做自定義類(lèi)型隱式轉(zhuǎn)換的方法
implicit 關(guān)鍵字用于聲明隱式的用戶定義類(lèi)型轉(zhuǎn)換運(yùn)算符。如果轉(zhuǎn)換過(guò)程可以確保不會(huì)造成數(shù)據(jù)丟失,則可使用該關(guān)鍵字在用戶定義類(lèi)型和其他類(lèi)型之間進(jìn)行隱式轉(zhuǎn)換,這篇文章就給大家詳細(xì)介紹implicit關(guān)鍵字做自定義類(lèi)型隱式轉(zhuǎn)換的方法,需要的朋友可以參考下2015-08-08
C#微信開(kāi)發(fā)之微信公眾號(hào)標(biāo)簽管理功能
這篇文章主要介紹了C#微信開(kāi)發(fā)之微信公眾號(hào)標(biāo)簽管理功能 的相關(guān)資料,需要的朋友可以參考下2016-05-05
opencvsharp瑕疵檢測(cè)的實(shí)現(xiàn)示例
本文主要介紹了opencvsharp瑕疵檢測(cè)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Winform消除button按下出現(xiàn)的虛線簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了Winform消除button按下出現(xiàn)的虛線簡(jiǎn)單實(shí)現(xiàn)方法,通過(guò)重寫(xiě)button設(shè)置Selectable參數(shù)實(shí)現(xiàn)該功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C#執(zhí)行存儲(chǔ)過(guò)程并將結(jié)果填充到GridView的方法
這篇文章主要介紹了C#執(zhí)行存儲(chǔ)過(guò)程并將結(jié)果填充到GridView的方法,結(jié)合實(shí)例形式分析了C#存儲(chǔ)過(guò)程操作及GridView控件相關(guān)操作技巧,需要的朋友可以參考下2017-02-02

