欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#?使用Fluent?API?創(chuàng)建自己的DSL(推薦)

 更新時間:2021年12月24日 08:28:58   作者:尋找無名的特質  
DSL領域專用語言是描述特定領域問題的語言,聽起來很唬人,其實不是什么高深的東西,下面通過實例代碼介紹下C#?使用Fluent?API?創(chuàng)建自己的DSL,感興趣的朋友參考下吧

DSL的作用是解決領域專家與軟件開發(fā)人員之間的溝通問題。聽起來很唬人,其實不是什么高深的東西,我們可以使用Fluent API 創(chuàng)建自己的DSL

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

using FlunetApiDemo;

var 張三 = "張三"
                .是學生()
                .身高(1.62M)
                .體重(48M);

Console.WriteLine(張三.BMI());
Console.WriteLine(張三.BMI狀態(tài)());

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

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

結合上面的例子,我們看一下如何使用Fluent Api創(chuàng)建自己的DSL。其使用的技術實質上是實現(xiàn)現(xiàn)有類型的擴展,這需要我們1)聲明一個static類,2)在類中使用static函數(shù),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狀態(tài)(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

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

到此這篇關于C# 使用Fluent API 創(chuàng)建自己的DSL的文章就介紹到這了,更多相關C#? Fluent API內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c#處理3種json數(shù)據(jù)的實例

    c#處理3種json數(shù)據(jù)的實例

    這篇文章主要介紹了c#處理包含數(shù)組、對象的復雜json數(shù)據(jù)的方法,,需要的朋友可以參考下
    2014-03-03
  • C#與C++之間類型的對應知識點總結

    C#與C++之間類型的對應知識點總結

    這篇文章主要介紹了C#與C++之間類型的對應知識點總結,對此有需要的朋友們可以參考下。
    2019-08-08
  • implicit關鍵字做自定義類型隱式轉換的方法

    implicit關鍵字做自定義類型隱式轉換的方法

    implicit 關鍵字用于聲明隱式的用戶定義類型轉換運算符。如果轉換過程可以確保不會造成數(shù)據(jù)丟失,則可使用該關鍵字在用戶定義類型和其他類型之間進行隱式轉換,這篇文章就給大家詳細介紹implicit關鍵字做自定義類型隱式轉換的方法,需要的朋友可以參考下
    2015-08-08
  • C#微信開發(fā)之微信公眾號標簽管理功能

    C#微信開發(fā)之微信公眾號標簽管理功能

    這篇文章主要介紹了C#微信開發(fā)之微信公眾號標簽管理功能 的相關資料,需要的朋友可以參考下
    2016-05-05
  • opencvsharp瑕疵檢測的實現(xiàn)示例

    opencvsharp瑕疵檢測的實現(xiàn)示例

    本文主要介紹了opencvsharp瑕疵檢測的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Winform消除button按下出現(xiàn)的虛線簡單實現(xiàn)方法

    Winform消除button按下出現(xiàn)的虛線簡單實現(xiàn)方法

    這篇文章主要介紹了Winform消除button按下出現(xiàn)的虛線簡單實現(xiàn)方法,通過重寫button設置Selectable參數(shù)實現(xiàn)該功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C#執(zhí)行存儲過程并將結果填充到GridView的方法

    C#執(zhí)行存儲過程并將結果填充到GridView的方法

    這篇文章主要介紹了C#執(zhí)行存儲過程并將結果填充到GridView的方法,結合實例形式分析了C#存儲過程操作及GridView控件相關操作技巧,需要的朋友可以參考下
    2017-02-02
  • 輕松學習C#的正則表達式

    輕松學習C#的正則表達式

    輕松學習C#的正則表達式,對C#的正則表達式感興趣的朋友可以參考本篇文章,幫助大家更靈活的運用C#的正則表達式
    2015-11-11
  • C#交換兩個變量值的幾種方法總結

    C#交換兩個變量值的幾種方法總結

    這篇文章介紹了C#交換兩個變量值的幾種方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • C#二叉搜索樹插入算法實例分析

    C#二叉搜索樹插入算法實例分析

    這篇文章主要介紹了C#二叉搜索樹插入算法,實例分析了C#二叉樹操作的相關技巧,需要的朋友可以參考下
    2015-04-04

最新評論