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