关于文本编辑器与IDE

IDE是用来创作程序的(这里之所以不说“写程序”,是因为程序不光是写出来的,还要重构、编译、调试、管理等);文本编辑器是用来编辑文件的,当然也可以编辑程序源代码。

我见到网上有争论说Rubyon Rails不需要IDE,文本编辑器即可,又考虑到文本编辑器与IDE是个旷日持久的话题,所以发表一下我的看法。

本文的文本编辑器主要以(g)Vim7.3为例,IDEVisualStudio 2010为例。制定版本号是避免人家说“VS972002不是这样!”。VS我用了五六年,Vim用了两年。

关于创作程序

我倾向于认为创作程序是一项艺术,而不是体力活;我常常自称自己为程序构架师,而不是打字员。

创作程序要打字(写代码)、编译、调试、重构(如重命名一个方法内的变量,将方法从子类提升到父类,修改一个接口,以至于继承此接口的20个类都要发生变化等等)、管理(用文件夹或其他结构组织源代码等)。显然,IDE之所以为IDE,就是因为I——Integrated(集成)。集成开发环境嘛,以上五种操作一般都包含进了。文本编辑器只支持打字一项。

但是,有些文本编辑器对扩展的强大支持使其生命力旺盛,不仅能编辑普通文件,还能很好地适应多种语言的源代码。例如,Vim加些扩展就能针对某种语言实现语法高亮、缩进。又加上一些扩展就能实现所谓的自动补全、编译和调试。这才使得有些人认为个别文本编辑器可以替代IDE了。

关于自动补全

需要越好的自动补全,越需要IDE。如果你不用自动补全,你可能不需要“智慧型”IDE,如VisualStudioeclipse。而据我所知自动补全有两种,一是VimCtrl-p,Ctrl-n之类的,根据上下文中相同单词来补全。例如,我写了

Thisis probably my first real blog entry, something of value, thatI probably know more about than most people.

然后写en,按ctrl+p,就会提示entry。“上下文”的范围可以是此文档,或者其他更大的范围。这种提示不涉及语法。

另一种提示就是VSIntelliSense,在C#的一个类MyClass中定义了publicvoid Search(string keyword),在另一个文件里有

intseed=123;

MyClass.

然后写se,不用按任何键,IntelliSense就会提示你Search,而不会提示seed。显然,我们程序员需要的是IntelliSense。至于“上下文补全”能在多大程度上满足我们则是另一回事。

有人会说了,Vim加个插件,也能IntelliSense。但是,这势必涉及语法分析,然而众所周知,脚本语言的执行速度(如Vimpythonemacselisp)没有CC++快,所以VimIntelliSense不可能比VS快。所以,还不如用IDE

第二,我认为创作程序需要自动补全,越智能的越好。有人说,“自动补全使人懒惰,我因此记不住那些常用的方法名了。而改用文本编辑器后,我能下意识地拼出1000个方法名了。”我说过创作程序是一项艺术,我不背方法名,我知道,我只要记住头两三个字母,智能补全就能告诉我有哪些方法可用,然后我从中选一个我想要的就可以了。这是填空题与选择题的差别。我平常没有在背单词(背方法名)了,就有更多精力看书,看怎么设计,就能掌握更上层的知识,写出更好的程序。写程序时,我不是在“默写单词”,而是专注在程序逻辑上。我不知道“真”是true还是ture,但IntelliSense知道。

关于用法提示

另外,用法提示在程序入门阶段和后期也都十分重要。在入门阶段,比如我学习怎么读取文件,我打File.自动补全提示我一大堆单词,尽管现代程序基本都偏爱“望文生义式”的命名,但总有些命名不懂其意思或用法。这时,用法提示能告诉我怎么用它。例如,我要读文件,file.Re(我不知道读是reed还是read),自动补全提示我还有Renew方法,我就会好奇看看这个方法干什么。用法提示会告诉我。当然了,看文档也可以学习新方法,最快就是按一下F1之类的快捷键,就新打开一个界面,告诉你Renew怎么用。但用法提示是用中学——写代码时不小心看到而学,看文档是学中学——本来要学A,不小心看到B,顺便学一下。用中学比较方便。

这样的话,如果文本编辑器要支持用法提示,必须要支持语法分析,还要能够读文档。上面说过,语法分析代价大,还不如用IDE

关于重构

要越厉害的重构,越要用IDE。考虑以下代码

inta=12;

a=a+12;

a=a*12;

system.out.print(a);

如果我要把a改名为b,在IDE的语法分析的帮助下,改名就是一个动作,很方便。诚然,在这个例子中,Vim也比较方便,记下第一行和最后一行的行号,写:1,4s/a/b/gc就行了。(如果有不记行号的方法请告诉我)

但如果一个类中有个私有变量叫name,该类的构造函数(或一个方法)中有个同名参数name(覆盖了类变量name),我只想修改类变量name(参数name不变),这个修改Vim就不容易做了。

更厉害的重构就不用说了。我有一个接口interfaceIPlayer,有实现类ComputerPlayerHumanPlayer。我现在在IPlayer新增一个方法GetName(),我在IDE里可以在IPlayer.GetName()上点击“在所有继承类中实现此方法”(通过返回默认值或抛异常来实现此方法),然后就可以编译通过。这是O(1)复杂度的操作。如果在文本编辑器中,我想不得不变成O(n)的操作,尽管这个n可能是一个粘贴操作而已。

有人会说,重构代表了你一开始设计不完善,没考虑周到。我用文本编辑器,我写代码之前我都打好草稿,想清楚再写,很少重构。我认为,这观点有其道理,但重构是应对变化的手段,而“应对变化是软件设计的不变真理”。当后来需求变更时,文本编辑器将不得不面临O(n)的重构。

关于编辑文件

根据上面的讨论,越不需要自动补全,越不需要用法提示,越不需要重构,越不像是在创作程序,越可以用文本编辑器。

我不是没在用Vim,我有把它设置为默认的文本编辑器,Windows自带的notepad被我删了。我用它看各种文件(包括源代码),确实很方便。注意,我基本是用它来看,偶尔修改文件。因为它文字处理真的很方便,删除引号内的文本、连接段落、宏等等。这方面,IDE们就没这么强的功能了。我装了几个语法高亮插件后,看HTMLJavascriptJavaC#等等都没压力了。

所以,我创作程序时结合使用IDE和文本编辑器。VisualStudio可以添加外部工具,我就添加了gVim。我在VS里编辑、重构、编译,遇到适合Vim的文本操作时,就点击菜单上的gVim,就用gVim打开了我正在编辑的源代码,我做好文字处理,保存,VS提示我源代码已变,我令VS重新读取文件,变更显示出来了,我按F5编译,新的程序已经躺在硬盘上了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章