• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
                今天先放圖哈。智能完成已經(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

            評(píng)論:
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-16 16:34 | ccsdu2009
            幫你頂頂 太冷清了  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二)[未登錄](méi) 2010-09-16 17:45 | king
            同樓上,勇氣可嘉。  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-16 17:59 | 溪流
            UI也可以單元測(cè)試啊,學(xué)習(xí)了  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-16 18:04 | Sunshine Alike
            看來(lái)C#越來(lái)越威武了~~  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-16 19:38 | pengwang
            加油,哪里像我整天陷在一坨一坨的business logic里,丫的根本不像Martin說(shuō)的幫客戶(hù)解決問(wèn)題也很有成就感,沮喪啊。  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-16 19:48 | schindlerlee
            強(qiáng)烈支持  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-16 21:47 | megax
            折疊不應(yīng)該由plugin來(lái)處理,否則會(huì)很痛苦的。編輯器本身應(yīng)該提供那些行不顯示的功能,并對(duì)scrollbar和caret的更新提供支持,然后才讓plugin去處理折疊。輸入法光標(biāo)跟隨,那是輸入法本身提供的功能,有的輸入法沒(méi)有光標(biāo)跟隨,比如微軟的日語(yǔ)輸入法,而且如果用sogou的輸入法的話(huà),它有一個(gè)bug,在多語(yǔ)言切換之后,就無(wú)法跟隨了。正確的處理方法還是自己處理IME消息,然后移動(dòng)窗口。如果不處理的話(huà),那么你輸入一個(gè)句子的話(huà),會(huì)對(duì)每一個(gè)漢字產(chǎn)生一個(gè)OnChar,效率較低。  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-16 23:10 | 陳梓瀚(vczh)
            @megax
            我的編輯器有l(wèi)istener,可以讓插件監(jiān)聽(tīng)和同步在編輯器上的發(fā)生的所有事情,所以可以放進(jìn)插件,這個(gè)倒不用擔(dān)心,而且這么做還能讓你的單元測(cè)試更容易寫(xiě),單元測(cè)試運(yùn)行得更快,所以不會(huì)有問(wèn)題的哈。

            不過(guò)因?yàn)槲业牟寮强梢宰龀赏瑫r(shí)插入多個(gè)的(combinator),因此可以把折疊的功能獨(dú)立出來(lái)做成一個(gè)“服務(wù)”供其他跟語(yǔ)言相關(guān)的插件享用。個(gè)人認(rèn)為這種做法最利于解耦以及測(cè)試。只要測(cè)試跟上了,開(kāi)發(fā)的痛苦就會(huì)大大減少了。因?yàn)橥纯鄟?lái)源于debug,而不是寫(xiě)代碼本身。

            至于光標(biāo)跟隨,我只響應(yīng)了一個(gè)IME消息,在需要的時(shí)候更新那個(gè)輸入框的位置。不過(guò)我沒(méi)有處理把一個(gè)句子不分割成很多Char的事情,因?yàn)檫@個(gè)才會(huì)受到實(shí)現(xiàn)的影響,而且你也只會(huì)在輸入注釋的時(shí)候用輸入法,所以也就不需要做了。  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-16 23:12 | 陳梓瀚(vczh)
            @pengwang
            因?yàn)槟憬鉀Q的不是客戶(hù)的問(wèn)題,而是經(jīng)理制造出來(lái)的問(wèn)題哈。  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-19 17:39 | 空明流轉(zhuǎn)
            師祖威武。  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-19 19:16 | luna
            輸入法的窗口會(huì)跟隨光標(biāo)移動(dòng)……
            把輸入法的光標(biāo)跟隨去掉不就行了。  回復(fù)  更多評(píng)論
              
            # re: 開(kāi)發(fā)自己的IDE(二) 2010-09-19 23:06 | 陳梓瀚(vczh)
            @luna
            你可能理解錯(cuò)我的意思了,我是自己寫(xiě)代碼讓輸入法的窗口跟著光標(biāo)移動(dòng)了- -b  回復(fù)  更多評(píng)論
              
            国产亚洲欧美成人久久片| 精品久久久久成人码免费动漫| AV无码久久久久不卡网站下载 | 国产高潮国产高潮久久久91 | 久久香蕉综合色一综合色88| 精品久久久久久国产三级| 久久久久亚洲av综合波多野结衣 | 一级女性全黄久久生活片免费 | 91超碰碰碰碰久久久久久综合| 久久久无码精品亚洲日韩软件| 国产精品禁18久久久夂久| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久久噜噜噜久久| 777米奇久久最新地址| 天天综合久久一二三区| 国产精品久久久久aaaa| 一本一本久久A久久综合精品| 久久99精品国产麻豆不卡| 精品国产VA久久久久久久冰| 久久99热这里只频精品6| 国産精品久久久久久久| 九九久久99综合一区二区| 精品伊人久久大线蕉色首页| 亚洲国产婷婷香蕉久久久久久| 国产成人久久精品麻豆一区| 大伊人青草狠狠久久| 7777精品久久久大香线蕉| 最新久久免费视频| 久久久久久无码国产精品中文字幕 | 97精品伊人久久久大香线蕉| 国产成人精品白浆久久69 | 精品99久久aaa一级毛片| 99久久免费国产精精品| 日产精品久久久久久久性色| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 一本色道久久88综合日韩精品| 国产激情久久久久影院老熟女免费 | 亚洲国产精品成人久久蜜臀 | 精品免费久久久久久久| 久久超碰97人人做人人爱| 欧洲成人午夜精品无码区久久|