CK表達(dá)式編輯器就是嘗試解決需求變化而導(dǎo)致的程序頻繁改變問(wèn)題的。為了增強(qiáng)編輯器的功能,而使用了.Net C# 4.0來(lái)做編譯器,對(duì)類型控制也非常嚴(yán)格,沒(méi)有C#基礎(chǔ),恐怕是難以操作這個(gè)編輯器。
表達(dá)表編輯界面說(shuō)明:
表達(dá)式編輯區(qū)
可以對(duì)部分方法和屬性進(jìn)行顏色區(qū)分,對(duì)有一定編程經(jīng)驗(yàn)的朋友有一定幫助。
腳本
如果勾選了腳本,則表達(dá)式編輯區(qū)的內(nèi)容一定要是一個(gè)方法,即一定要有return,每一行都有;號(hào)。
類別
包含了默認(rèn)和用戶傳入的方法的類別。
方法
所有可以高亮顯示的方法,不過(guò),如果用戶傳入了新的命名空間,即使不是高亮顯示的方法也是可用的。
傳參區(qū)
可以查看開(kāi)發(fā)員傳入的參數(shù),如果在字典區(qū),可以雙擊參數(shù)名,在表達(dá)式編輯區(qū)顯示。
表格定義
如果開(kāi)發(fā)員傳入了DataTable對(duì)象,由表達(dá)式編輯區(qū)那里可以使用List來(lái)引用該DataTable默認(rèn)對(duì)應(yīng)的實(shí)體,編輯器會(huì)自動(dòng)生成新的類型。
方法說(shuō)明區(qū)
詳細(xì)介紹各個(gè)方法的使用語(yǔ)法。
編譯生成類
這是一個(gè)給C#開(kāi)發(fā)員查看的選項(xiàng)卡,有C#開(kāi)發(fā)經(jīng)驗(yàn)的朋友會(huì)非常容易看明白生成的內(nèi)容,從而調(diào)整自己的表達(dá)式,不過(guò)沒(méi)C#開(kāi)發(fā)經(jīng)驗(yàn)的朋友還是不要看為好。
什么是表達(dá)式編輯器?
這個(gè)工具允許技術(shù)員傳入一系列的參數(shù),由用戶編輯一個(gè)公式返回一種特定的結(jié)果。之所以需要使用表達(dá)式編輯器,就是因?yàn)橛脩艟庉嫷墓浇?jīng)常變,技術(shù)員無(wú)法想出一辦法來(lái)適應(yīng)用戶的需求。簡(jiǎn)單說(shuō),編輯器的作用與Excel的公式是相似的。
這個(gè)工具在國(guó)外是比較成熟的,如DevExpress就有相關(guān)的公式編輯器。如下圖所示
還有做得像個(gè)編程工具一樣的:
表達(dá)式編輯器中的編輯文本,是需要一種解釋邏輯才能解釋出來(lái)的,常見(jiàn)的辦法就像Excel那樣擁有獨(dú)立的解釋引擎,但也有直接使用某種語(yǔ)言的編譯器進(jìn)行解釋,如Javascript,VB等都有相當(dāng)成熟的實(shí)現(xiàn)。
什么時(shí)候使用表達(dá)式編輯器:
首先,該工具一般是開(kāi)發(fā)員,實(shí)施員和用戶使用的,目標(biāo)是減少程序的變化,但能適應(yīng)客戶的需要。下面舉例幾個(gè)常見(jiàn)的例子:
1, 商品金額計(jì)算
隨著業(yè)務(wù)的發(fā)展,客戶的要求不同(筆者只舉大家可以簡(jiǎn)單理解的例子,過(guò)于簡(jiǎn)單不要介意)
Level1:?jiǎn)蝺r(jià)*數(shù)量,但如果開(kāi)發(fā)員這樣操作的話,那就可能要不斷改程序了。
客戶的業(yè)務(wù)發(fā)展了,要增加打折:
Level2:?jiǎn)蝺r(jià)*數(shù)量*打折,但是大家都知道這可能不夠。
客戶接著發(fā)展了會(huì)員系統(tǒng):
Level3:?jiǎn)蝺r(jià)*數(shù)量*打折*(會(huì)員折扣),這個(gè)方案也許會(huì)好一點(diǎn),但似乎還不行。
客戶發(fā)展了外國(guó)商品:
Level4:(總價(jià)-稅率-運(yùn)費(fèi))/貨品數(shù)*數(shù)量*打折*(會(huì)員折扣)。那又怎樣呢?
…………………
作為軟件編寫者,可以不斷修改自己的程序,但每一次修改都面臨大量的測(cè)試,測(cè)試后也可能會(huì)出現(xiàn)更多的BUG,客戶也會(huì)覺(jué)得很煩。這時(shí)客戶就會(huì)發(fā)飆罵人:“能不能動(dòng)動(dòng)腦子,像人家Excel那樣配置好不好?”做程序員的不敢得罪無(wú)理的客戶,那只有苦逼地接受。那能不能讓這個(gè)事情簡(jiǎn)單一點(diǎn)呢?就算不能完全解決問(wèn)題,也起碼讓測(cè)試好做一點(diǎn)呢?
2, 工資計(jì)算
隨著業(yè)務(wù)發(fā)展,客戶的要求也是不同的。
Level1:工資等級(jí)決定工資,如 C3=2000元。
Level2:工作年限*100 + 等級(jí)工資 – 社保。
Level3:工作年限*100 + 等級(jí)工資 + (各項(xiàng)目獎(jiǎng)金) – 社保五金。
Level4:工作年限*100 + 等級(jí)工資 + (各項(xiàng)目獎(jiǎng)金) – 社保五金 + 高溫/粉塵/空調(diào)費(fèi)補(bǔ)貼。
Level5:工作年限*100 + 等級(jí)工資 + (各項(xiàng)目獎(jiǎng)金) – 社保五金 + 高溫/粉塵/空調(diào)費(fèi)補(bǔ)貼 + 崗位補(bǔ)貼。
………………………….
同樣的問(wèn)題,你會(huì)覺(jué)得客戶都是“變態(tài)”的。但客戶覺(jué)得軟件連這些都想不到,真是垃圾。那有沒(méi)有辦法讓這些東西變得簡(jiǎn)單一點(diǎn)。
編譯生成類
這是一個(gè)給C#開(kāi)發(fā)員查看的選項(xiàng)卡,有C#開(kāi)發(fā)經(jīng)驗(yàn)的朋友會(huì)非常容易看明白生成的內(nèi)容,從而調(diào)整自己的表達(dá)式,不過(guò)沒(méi)C#開(kāi)發(fā)經(jīng)驗(yàn)的朋友還是不要看為好。
常用操作
1.常規(guī)類型的四則運(yùn)算
點(diǎn)擊設(shè)計(jì)
設(shè)計(jì)完成之后,點(diǎn)保存,返回前一個(gè)界面,隨意修改界面中的參數(shù),再點(diǎn)計(jì)算就可以計(jì)算出結(jié)果了。
2.常規(guī)類型的.Net語(yǔ)法運(yùn)算
原理相對(duì)簡(jiǎn)單,不作更多說(shuō)明。
3.List,DataTable的操作運(yùn)算
List,DataTable是.Net中常見(jiàn)的集合類型。
而要操作這兩種集合,就要對(duì)C#的集合編輯有一定的了解了,如
Sum(Table,r=>CTypeDecimal(r[“單價(jià)”])*CTypeDecimal(r[“數(shù)量”]))
其中Sum,CTypeDecimal都是編輯器自帶的C#方法,而Lambda表達(dá)式的寫法,已經(jīng)算是C#對(duì)集合操作中比較簡(jiǎn)單的寫法了。
上圖中,List是默認(rèn)從DataTable轉(zhuǎn)換過(guò)來(lái)的對(duì)象集合。
4.任意類型的操作運(yùn)算
為了達(dá)到編輯器最大的功能,可以支持任意的類型進(jìn)行操作,如下圖:
上表中,“列表.DataSource”中的“列表”是一個(gè)控件的Name,這里就只有學(xué)過(guò).Net WindowsForm才能明白寫什么了。
高級(jí)操作
1. 腳本與單一返回
控件不只是簡(jiǎn)單返回一個(gè)值,還可以寫一堆的腳本。
也就是說(shuō)你可以在腳本上對(duì)數(shù)據(jù)集進(jìn)行操作。
不過(guò),寫腳本的話,你必須非常清楚C#的語(yǔ)法,不然也沒(méi)辦法做到的。
2.引入新命名空間
編輯器還可以無(wú)限擴(kuò)展功能,可以引入命名空間,如下圖,System.IO是原來(lái)沒(méi)有的功能,但可以通過(guò)編輯引入。并實(shí)現(xiàn)IO操作。
3.引入自定義方法
編輯器甚至可以引入你自己寫的一個(gè)方法,可以是string 格式,還可以是Delegate對(duì)象形式的,也就是什么自己寫的方法都可以。
不過(guò)為了讓開(kāi)發(fā)自己寫的方法與編輯器的后續(xù)方法不沖突,強(qiáng)制要求用戶為方法名或?qū)傩缘拿Q增加下劃線_。
增加自定義方法的辦法:
請(qǐng)注意到:Function = new Func<string,string,string>(this._SayHelloWorld)這個(gè)寫法,這就是直接使用用戶自己定義的方法。