随笔-341  评论-2670  文章-0  trackbacks-0
    今天先放图哈。智能完成已经开始做试验了不过距离能看还差很远,所以今天先继续谈一下着色的事情。

    这就是我暂时实现的所有功能了。首先着色算法可以外挂,其次左边那个边栏(大小和绘制均可以订制)操作他的时候会发生什么事情也是外挂的。着色器与“断点变红”是分离在两个不同的插件接口里面的,原因上一篇文章说过了。你们可能还会注意到那个灰色的框框。那个框框的确是会被编辑器当成一个整体来对待,不过我绝对还没有实现折叠。因为在我的设计里面,如何进行折叠应该是插件的事情,控件本身只要处理好怎么编辑和显示就行了。还有一个比较难发现的就是,我这玩意儿也是支持输入法的,输入法的窗口会跟随光标移动……

    在开发这个东西的时候我尝试了两种新方法。第一种是MVC。MVC开发高亮还真是容易啊,不仅文字缓存部分(C#也是可以精确控制内存的哈)可以独立出来,连编辑操作(各种按键鼠标组合)其实也可以不做在控件里面。这样有什么好处呢,当然是可以进行高强度的单元测试了哈。第二种就是GUI自动化,光对类进行单元测试还是不够的,Visual Studio 2010为.net单元测试工程提供了一个Coded UI Test框架可以给我启动一个独立的外部程序(MFC写的也行,WinForm写的也行,WPF写的也行,网页都行)然后操作上面的各种控件最后拿到控件里面的信息。不过可惜的是我的文本框并没有按照Windows的UI Automation标准来实现(从而让盲人也能使用这个控件),因此只能进行键盘和鼠标的操作,至于我绘制的东西是什么则需要其他方法。C#跨进程怎么做最方便呢?当然是Windows Communication Foundation了哈。为了写足够的单元测试是要不惜一切D。不过显然WCF的服务不可能做在控件里,因此我的solution下面暂时就有控件工程、测试工程和被测试的“独立程序”工程了。

    有了GUI自动化测试,我在进行重构的时候,就可以放心的修改代码,然后执行测试程序,去外面喝杯茶。过个几分钟测试工程就会跟我报告一共挂掉了多少个case,只要修好就行了。这种方法杜绝了绝大多数由粗心引起的bug。如果你在公司使用类似技术来对付你的代码的话可以有效减少工作时间,从而让公司可以榨取更多价值。

    操作的组合还是比较麻烦的。为了全套支持,我特地操作了一下Visual Studio 2010的文本框,然后对一些我看不顺眼的行为经过修改之后,现在已经可以实现{LEFT, RIGHT, UP, DOWN, HOME, END, PAGEUP, PAGEDOWN, ENTER, BACKSPACE, DELETE}×{null, CONTROL, SHIFT, CONTROL+SHIFT}共44种操作方法。加上鼠标,突破半百。这么复杂的东西,如果没有足够的单元测试,也没有足够的GUI自动化测试的话,随便改个什么都很有可能发生问题的。所以开发这类程序的时候要十分小心,一定要写单元测试。

    至于着色应该怎么测试呢?只要有了WCF,就十分简单了。测试程序发送两个坐标,WCF服务返回坐标之间所有字符的颜色代号就行了。代号是可以在测试程序跟被测程序之间约定的,所以这种方法就让测试变得十分简单了。

    开发这一部分一共花掉我大约四天时间(假设不用上班每天能写8个小时,累计出来的)。当然平时要上班所以实际花费是要多一倍不止的。其实当我在纸上画出了上图C#着色器的状态机之后,也没想到实现出来速度这么猛的。虽然着色器使用状态机来实现已经是速度最快的方法了(经过大学4年写编译器的经验……不过我后来用C++做出了一个能根据正则表达式在内存中产生词法分析器的,比手写的更快),不过还是要感叹一下.net到了4.0还是比起当年的2.0要进步无穷多倍的哈。虚拟机可以在执行的时候才开始产生并优化x86代码,可以让程序越跑越快(非骗人,编译原理小白请自行学习),这还是静态编译其所不能达到的。之前还看过channel9上面的视频讲微软某个研究院在做一个全新的javascript引擎(看起来好像没有加进IE9beta),就是用了动态的两阶段profile+optimize+codegen的方法,通过为瓶颈代码使用激进优化方法,从而让总体的运行和编译时间的总和降到最低。生成X86什么的还是非常麻烦的,总之我已经被机器码囧了半年,暂时不想碰JIT了……当然这是迟早要再碰一次的。

    写到这里就先碎觉了,下一篇开始说之前在纠结的过程中产生的几个智能完成的方案。迟早都要把它给做出来的。
posted on 2010-09-16 10:32 陈梓瀚(vczh) 阅读(9969) 评论(12)  编辑 收藏 引用 所属分类: 开发自己的IDE

评论:
# re: 开发自己的IDE(二) 2010-09-16 16:34 | ccsdu2009
帮你顶顶 太冷清了  回复  更多评论
  
# re: 开发自己的IDE(二)[未登录] 2010-09-16 17:45 | king
同楼上,勇气可嘉。  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-16 17:59 | 溪流
UI也可以单元测试啊,学习了  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-16 18:04 | Sunshine Alike
看来C#越来越威武了~~  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-16 19:38 | pengwang
加油,哪里像我整天陷在一坨一坨的business logic里,丫的根本不像Martin说的帮客户解决问题也很有成就感,沮丧啊。  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-16 19:48 | schindlerlee
强烈支持  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-16 21:47 | megax
折叠不应该由plugin来处理,否则会很痛苦的。编辑器本身应该提供那些行不显示的功能,并对scrollbar和caret的更新提供支持,然后才让plugin去处理折叠。输入法光标跟随,那是输入法本身提供的功能,有的输入法没有光标跟随,比如微软的日语输入法,而且如果用sogou的输入法的话,它有一个bug,在多语言切换之后,就无法跟随了。正确的处理方法还是自己处理IME消息,然后移动窗口。如果不处理的话,那么你输入一个句子的话,会对每一个汉字产生一个OnChar,效率较低。  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-16 23:10 | 陈梓瀚(vczh)
@megax
我的编辑器有listener,可以让插件监听和同步在编辑器上的发生的所有事情,所以可以放进插件,这个倒不用担心,而且这么做还能让你的单元测试更容易写,单元测试运行得更快,所以不会有问题的哈。

不过因为我的插件是可以做成同时插入多个的(combinator),因此可以把折叠的功能独立出来做成一个“服务”供其他跟语言相关的插件享用。个人认为这种做法最利于解耦以及测试。只要测试跟上了,开发的痛苦就会大大减少了。因为痛苦来源于debug,而不是写代码本身。

至于光标跟随,我只响应了一个IME消息,在需要的时候更新那个输入框的位置。不过我没有处理把一个句子不分割成很多Char的事情,因为这个才会受到实现的影响,而且你也只会在输入注释的时候用输入法,所以也就不需要做了。  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-16 23:12 | 陈梓瀚(vczh)
@pengwang
因为你解决的不是客户的问题,而是经理制造出来的问题哈。  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-19 17:39 | 空明流转
师祖威武。  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-19 19:16 | luna
输入法的窗口会跟随光标移动……
把输入法的光标跟随去掉不就行了。  回复  更多评论
  
# re: 开发自己的IDE(二) 2010-09-19 23:06 | 陈梓瀚(vczh)
@luna
你可能理解错我的意思了,我是自己写代码让输入法的窗口跟着光标移动了- -b  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理