今天先放圖哈。智能完成已經(jīng)開(kāi)始做試驗(yàn)了不過(guò)距離能看還差很遠(yuǎn),所以今天先繼續(xù)談一下著色的事情。
這就是我暫時(shí)實(shí)現(xiàn)的所有功能了。首先著色算法可以外掛,其次左邊那個(gè)邊欄(大小和繪制均可以訂制)操作他的時(shí)候會(huì)發(fā)生什么事情也是外掛的。著色器與“斷點(diǎn)變紅”是分離在兩個(gè)不同的插件接口里面的,原因
上一篇文章說(shuō)過(guò)了。你們可能還會(huì)注意到那個(gè)灰色的框框。那個(gè)框框的確是會(huì)被編輯器當(dāng)成一個(gè)整體來(lái)對(duì)待,不過(guò)我絕對(duì)
還沒(méi)有實(shí)現(xiàn)折疊。因?yàn)樵谖业脑O(shè)計(jì)里面,如何進(jìn)行折疊應(yīng)該是插件的事情,控件本身只要處理好怎么編輯和顯示就行了。還有一個(gè)比較難發(fā)現(xiàn)的就是,我這玩意兒也是支持輸入法的,輸入法的窗口會(huì)跟隨光標(biāo)移動(dòng)……
在開(kāi)發(fā)這個(gè)東西的時(shí)候我嘗試了兩種新方法。第一種是MVC。MVC開(kāi)發(fā)高亮還真是容易啊,不僅文字緩存部分(C#也是可以精確控制內(nèi)存的哈)可以獨(dú)立出來(lái),連編輯操作(各種按鍵鼠標(biāo)組合)其實(shí)也可以不做在控件里面。這樣有什么好處呢,當(dāng)然是可以進(jìn)行高強(qiáng)度的單元測(cè)試了哈。第二種就是GUI自動(dòng)化,光對(duì)類(lèi)進(jìn)行單元測(cè)試還是不夠的,Visual Studio 2010為.net單元測(cè)試工程提供了一個(gè)Coded UI Test框架可以給我啟動(dòng)一個(gè)獨(dú)立的外部程序(MFC寫(xiě)的也行,WinForm寫(xiě)的也行,WPF寫(xiě)的也行,網(wǎng)頁(yè)都行)然后操作上面的各種控件最后拿到控件里面的信息。不過(guò)可惜的是我的文本框并沒(méi)有按照Windows的UI Automation標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)(從而讓盲人也能使用這個(gè)控件),因此只能進(jìn)行鍵盤(pán)和鼠標(biāo)的操作,至于我繪制的東西是什么則需要其他方法。C#跨進(jìn)程怎么做最方便呢?當(dāng)然是Windows Communication Foundation了哈。為了寫(xiě)足夠的單元測(cè)試是要不惜一切D。不過(guò)顯然WCF的服務(wù)不可能做在控件里,因此我的solution下面暫時(shí)就有控件工程、測(cè)試工程和被測(cè)試的“獨(dú)立程序”工程了。
有了GUI自動(dòng)化測(cè)試,我在進(jìn)行重構(gòu)的時(shí)候,就可以放心的修改代碼,然后執(zhí)行測(cè)試程序,去外面喝杯茶。過(guò)個(gè)幾分鐘測(cè)試工程就會(huì)跟我報(bào)告一共掛掉了多少個(gè)case,只要修好就行了。這種方法杜絕了絕大多數(shù)由粗心引起的bug。如果你在公司使用類(lèi)似技術(shù)來(lái)對(duì)付你的代碼的話(huà)可以有效減少工作時(shí)間,從而讓公司可以榨取更多價(jià)值。
操作的組合還是比較麻煩的。為了全套支持,我特地操作了一下Visual Studio 2010的文本框,然后對(duì)一些我看不順眼的行為經(jīng)過(guò)修改之后,現(xiàn)在已經(jīng)可以實(shí)現(xiàn){LEFT, RIGHT, UP, DOWN, HOME, END, PAGEUP, PAGEDOWN, ENTER, BACKSPACE, DELETE}×{null, CONTROL, SHIFT, CONTROL+SHIFT}共44種操作方法。加上鼠標(biāo),突破半百。這么復(fù)雜的東西,如果沒(méi)有足夠的單元測(cè)試,也沒(méi)有足夠的GUI自動(dòng)化測(cè)試的話(huà),隨便改個(gè)什么都很有可能發(fā)生問(wèn)題的。所以開(kāi)發(fā)這類(lèi)程序的時(shí)候要十分小心,一定要寫(xiě)單元測(cè)試。
至于著色應(yīng)該怎么測(cè)試呢?只要有了WCF,就十分簡(jiǎn)單了。測(cè)試程序發(fā)送兩個(gè)坐標(biāo),WCF服務(wù)返回坐標(biāo)之間所有字符的顏色代號(hào)就行了。代號(hào)是可以在測(cè)試程序跟被測(cè)程序之間約定的,所以這種方法就讓測(cè)試變得十分簡(jiǎn)單了。
開(kāi)發(fā)這一部分一共花掉我大約四天時(shí)間(假設(shè)不用上班每天能寫(xiě)8個(gè)小時(shí),累計(jì)出來(lái)的)。當(dāng)然平時(shí)要上班所以實(shí)際花費(fèi)是要多一倍不止的。其實(shí)當(dāng)我在紙上畫(huà)出了上圖C#著色器的狀態(tài)機(jī)之后,也沒(méi)想到實(shí)現(xiàn)出來(lái)速度這么猛的。雖然著色器使用狀態(tài)機(jī)來(lái)實(shí)現(xiàn)已經(jīng)是速度最快的方法了(經(jīng)過(guò)大學(xué)4年寫(xiě)編譯器的經(jīng)驗(yàn)……不過(guò)我后來(lái)用C++做出了一個(gè)能根據(jù)正則表達(dá)式在內(nèi)存中產(chǎn)生詞法分析器的,比手寫(xiě)的更快),不過(guò)還是要感嘆一下.net到了4.0還是比起當(dāng)年的2.0要進(jìn)步無(wú)窮多倍的哈。虛擬機(jī)可以在執(zhí)行的時(shí)候才開(kāi)始產(chǎn)生并優(yōu)化x86代碼,可以讓程序越跑越快(非騙人,編譯原理小白請(qǐng)自行學(xué)習(xí)),這還是靜態(tài)編譯其所不能達(dá)到的。之前還看過(guò)channel9上面的視頻講微軟某個(gè)研究院在做一個(gè)全新的javascript引擎(看起來(lái)好像沒(méi)有加進(jìn)IE9beta),就是用了動(dòng)態(tài)的兩階段profile+optimize+codegen的方法,通過(guò)為瓶頸代碼使用激進(jìn)優(yōu)化方法,從而讓總體的運(yùn)行和編譯時(shí)間的總和降到最低。生成X86什么的還是非常麻煩的,總之我已經(jīng)被機(jī)器碼囧了半年,暫時(shí)不想碰JIT了……當(dāng)然這是遲早要再碰一次的。
寫(xiě)到這里就先碎覺(jué)了,下一篇開(kāi)始說(shuō)之前在糾結(jié)的過(guò)程中產(chǎn)生的幾個(gè)智能完成的方案。遲早都要把它給做出來(lái)的。
posted on 2010-09-16 10:32
陳梓瀚(vczh) 閱讀(10012)
評(píng)論(12) 編輯 收藏 引用 所屬分類(lèi):
開(kāi)發(fā)自己的IDE