最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

DSL(Domain Specified Language)領(lǐng)域?qū)S谜Z言是描述特定領(lǐng)域問題的語言,聽起來很唬人,其實(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)問題了:學(xué)生有小學(xué)生、中學(xué)生和大學(xué)生,難道計(jì)算算法一樣?男生女生的計(jì)算算法也一樣?在這個(gè)問題中,各位都是領(lǐng)域?qū)<?,從我寫的描述特定問題的代碼中發(fā)現(xiàn)了問題,我需要對代碼進(jìn)行修改,增加年齡和性別因素。

從上面的例子可以看到DSL的作用:是解決領(lǐng)域?qū)<遗c軟件開發(fā)人員之間的溝通問題。領(lǐng)域?qū)<彝ǔ2欢镁幊蹋瑹o法判斷開發(fā)人員寫的代碼是否符合領(lǐng)域的要求,只能是等到軟件編寫完成,從軟件運(yùn)行表現(xiàn)出來的功能進(jìn)行判斷,而這時(shí)成本已經(jīng)發(fā)生了,幾個(gè)來回下來,進(jìn)度超時(shí),成本超支。DSL使用領(lǐng)域相關(guān)的術(shù)語編寫,領(lǐng)域?qū)<铱梢岳斫猓Z言本身基于某種宿主語言,比如C#,可以編譯運(yùn)行,容易驗(yàn)證。所以恰當(dāng)?shù)腄SL可以打通領(lǐng)域?qū)<液烷_發(fā)人員之間的障礙,使軟件的業(yè)務(wù)核心部分開發(fā)可靠并有效率?!翱梢詧?zhí)行”是DSL與需求階段使用的偽語言或者帶圖示的自然語言最大的不同。在需求描述的時(shí)候,經(jīng)常使用各種圖示或者偽語言對業(yè)務(wù)進(jìn)行描述,偽語言一般是一種類似的結(jié)構(gòu)化語言,這種貌似語言的東西往往是很有害的,因?yàn)橹皇谴蟾琶枋隽诉^程,很多實(shí)現(xiàn)細(xì)節(jié)被忽略或者隱藏了。由于不是嚴(yán)格的編程語言,無法生成可執(zhí)行的代碼,所以也就無法驗(yàn)證對錯(cuò)。

結(jié)合上面的例子,我們看一下如何使用Fluent Api創(chuàng)建自己的DSL。其使用的技術(shù)實(shí)質(zhì)上是實(shí)現(xiàn)現(xiàn)有類型的擴(kuò)展,這需要我們1)聲明一個(gè)static類,2)在類中使用static函數(shù),3)使用this關(guān)鍵字修飾需要擴(kuò)展的類型。上面的"張三".是學(xué)生(),“是學(xué)生”是字符串類型的一個(gè)擴(kuò)展,返回的是自己定義的Student類型,這段代碼如下:

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類中只定義關(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;
        }
    }
}

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

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

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

相關(guān)文章

  • C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法

    C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法

    本文通過例子,講述了C++調(diào)用C#的DLL程序的方法,作出了以下總結(jié),具有一定的參考價(jià)值,下面就讓我們一起來學(xué)習(xí)吧
    2015-10-10
  • C# SendInput 模擬鼠標(biāo)操作的實(shí)現(xiàn)方法

    C# SendInput 模擬鼠標(biāo)操作的實(shí)現(xiàn)方法

    C# SendInput 模擬鼠標(biāo)操作的實(shí)現(xiàn)方法,需要的朋友可以參考一下
    2013-04-04
  • C#中將DataTable轉(zhuǎn)換成CSV文件的方法

    C#中將DataTable轉(zhuǎn)換成CSV文件的方法

    DataTable用于在.net項(xiàng)目中,用于緩存數(shù)據(jù),DataTable表示內(nèi)存中數(shù)據(jù)的一個(gè)表,在.net項(xiàng)目中運(yùn)用C#將DataTable轉(zhuǎn)化為CSV文件,接下來通過本文給大家提供一個(gè)通用的方法,感興趣的朋友可以參考下
    2016-10-10
  • C#使用CefSharp實(shí)現(xiàn)內(nèi)嵌網(wǎng)頁詳解

    C#使用CefSharp實(shí)現(xiàn)內(nèi)嵌網(wǎng)頁詳解

    這篇文章主要介紹了C# WPF里怎么使用CefSharp嵌入一個(gè)網(wǎng)頁,并給出一個(gè)簡單示例演示C#和網(wǎng)頁(JS)的交互實(shí)現(xiàn),感興趣的小伙伴可以了解一下
    2023-04-04
  • C#使用LINQ查詢文件列表并找出最大文件

    C#使用LINQ查詢文件列表并找出最大文件

    在現(xiàn)代 C# 開發(fā)中,LINQ (Language Integrated Query) 提供了一種強(qiáng)大而優(yōu)雅的方式來處理集合數(shù)據(jù),本文將詳細(xì)介紹如何使用 LINQ 查詢文件系統(tǒng)中的文件,并找出最大的文件數(shù)量,需要的朋友可以參考下
    2024-10-10
  • Win10下C# DateTime出現(xiàn)星期幾問題的解決方法

    Win10下C# DateTime出現(xiàn)星期幾問題的解決方法

    這篇文章主要介紹了Win10下C# DateTime出現(xiàn)星期幾問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • C#異步執(zhí)行任務(wù)的方法

    C#異步執(zhí)行任務(wù)的方法

    這篇文章主要介紹了C#異步執(zhí)行任務(wù)的方法,以一個(gè)簡單實(shí)例形式分析了C#異步執(zhí)行的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#圖像對比度調(diào)整的方法

    C#圖像對比度調(diào)整的方法

    這篇文章主要介紹了C#圖像對比度調(diào)整的方法,涉及C#實(shí)現(xiàn)圖像對比度操作的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#連接數(shù)據(jù)庫的方法

    C#連接數(shù)據(jù)庫的方法

    ASP.NET連接數(shù)據(jù)庫的技術(shù)叫ADO.NET,它是用來向數(shù)據(jù)庫提交sql語句的一堆類。這里連接的是Sql Server 2008數(shù)據(jù)庫,其他數(shù)據(jù)庫用法差不多,就是調(diào)用的類名不一樣
    2015-11-11
  • C# 設(shè)計(jì)模式系列教程-外觀模式

    C# 設(shè)計(jì)模式系列教程-外觀模式

    外觀模式松散了客戶端與子系統(tǒng)的耦合關(guān)系,讓子系統(tǒng)內(nèi)部的模塊能更容易擴(kuò)展和維護(hù)。
    2016-06-06

最新評論

营山县| 济宁市| 三河市| 阿拉善左旗| 获嘉县| 孝感市| 宁阳县| 桐庐县| 临朐县| 登封市| 浙江省| 交口县| 扶风县| 昌都县| 安岳县| 南昌县| 鹰潭市| 尚志市| 沽源县| 贡觉县| 嵊泗县| 新巴尔虎左旗| 韶山市| 清丰县| 宁晋县| 上林县| 襄汾县| 镇雄县| 茂名市| 木里| 正安县| 密云县| 蒙阴县| 平泉县| 安吉县| 青神县| 车险| 禹城市| 白水县| 桦南县| 小金县|