Remove comments in java or C++

Posted by chunyang on April 23, 2014
TAGS: #ruby

近段时间其实也没有做什么具体的事,只是抽了很多时间看了很多书。虽然自己也很紧张,但是在这种忙里偷闲的时间里也不忘学学脚本。

这段时间在Code Academy上学习了Ruby和Python。最开始的第一印象是:为什么Python没有对类中的成员变量或者成员函数进行一些作用域的设定?

Ruby给出非常直接的解决方法,public,private,protected关键字来支持,同时也支持一些例如@name,@@name,$name这种方式来区分不同的变量归属。上句中三个分别指代类实例变量,类变量和全局作用域变量。

之后从图书馆借了两本书:《Ruby元编程》和《Ruby编程语言》。前者是讲述Ruby在元编程领域的各种奇淫技巧,后者是讲述Ruby的基本语法知识。由于第一本书比较薄,所以一开始就尝试将这本书每天看一章的方式进行阅读,当然书的作者也是如此安排其内容。看了第一章以后就觉得:Ruby很神奇!在后续的章节阅读中,越发觉得Ruby的设计思想就是简洁,它提供给用户最大的自由度。当然这种自由度是一把双刃剑。例如本来关键字private是禁止访问类的私有成员函数的,但是通过:send方法以及instance_eval这种作用域控制的符号,你可以访问。

Ruby是一种动态脚本,它相对于静态的编译语言忽略了类型信息,但是不代表它没有类型。Ruby中几乎一切都是Object,它的继承体系可以得出:Object<-Module<-Kernel<-Class。而Object本身又是Class的子类。类的名字其实是另外一种对象而已。在Ruby1.9中,又引入了BasicObject。因为方法太多,BasicObject仅保存了很少的函数。方便用户继承,而不用引入非常多的方法。

Ruby中提供最方便的东西Integer, String, Hash, Array。这些都是一般脚本都会提供的类型,而且基本都做得很强大。Ruby支持大数运算。

Ruby允许对一个已经定义好的类动态的添加方法,动态的删除方法;Ruby允许给一个对象定义方法,这个方法称为单件方法(与设计模式中的单件不一样);Ruby可以对方法起别名,环回别名可以在版本升级时减少代码量;Ruby可以当成一种领域特定语言来使用,这也是别名的功能之一。

Ruby提供的功能非常的强大,只是觉得用户的自由非常充分,唯一剩下的就是自己如何发挥这种自由度,创造出功能比较强大的模块或者类。在Ruby中对某个问题总有解决方法,而且绝对不只一种方法。

代码的本领是练出来的,后来codekata上看到了一个练习:删除Java中的注释。这个看似简单的任务其实存在很多的坑在里面。Ruby的String类对正则表达式的支持比较强大,我选择使用正则来处理。大概的思路是一行一行的处理,针对每一行删除行注释,块注释,并且需要注意多行的注释以及隐藏在代码中间的注释。

  1. 第一版本的思路 利用两个正则表达式来删除:
    • “/\/*.*\*\//”,删除/* */中间的注释。
    • /\/\/.*/ ,删除块注释。 这个时候只能针对比较简单的注释进行删除,当然我的程序中已经增加如何处理多行注释的功能。
  2. 第二版本的思路 意识到第一版本的存在问题太多:对于冒号中的注释不应该删除,因为这是字符串内容;多行注释的时候(.*)会进行贪婪的匹配,这样对于/*xxx*/xxx/*xxx*/会出现这样的问题,中间都被删除了。
  3. 第三版本的思路 第三版本的思路主要是在前两个问题的基础上解决的。第一、针对贪婪的方式,经过调研以后发现在匹配后面增加?,原来的模式就变为非贪婪模式;第二、针对这种双引号中的内容问题,采取迂回战术,首先,将双引号之间的内容匹配,然后将双引号中的/*, */和//都替换成一个已知的常量。然后再进行正常的删除,在删除完以后再将所有的替换后的东西换成之前的内容。

程序代码在Remove comments in Java/C++

一个注释删除程序检测的能力超过我的想象,不仅仅是Ruby基本的代码能力,还包括:正则表达式,Ruby中的块传递返回值问题,注释中的各种extreme case识别,程序的逻辑,调试能力。

万里之行始于足下。

本文完