我正在开发一个代码可视化工具,我希望能够在项目中显示每个类,方法和模块的大小(以行为单位)。似乎现有的解析器(如Ripper)可以使这个信息很容易获得。有没有一种首选的方法呢?有没有一种方法可以评估在不同地点重新开放的课程的大小?动态(Class.new {}
,Module.new {}
)定义的结构怎么样?
答案 0 :(得分:2)
我认为,如果没有实际运行类所属的整个Ruby程序,那么你所要求的是不可能的(然后你会遇到暂停问题)。 Ruby非常动态,因此可以随时随地将行添加到类的定义中,而无需按名称引用特定的类(例如,在作为参数传递给方法的类上使用class_eval
)。并不是说仍然保存了类定义的源代码......我认为你可以得到的最接近的是该类方法的source_location
。
您可以为每个文件获取source_location
个的最大和最小行数。然后你必须假设每个文件只打开一次类,并且文件中最后一个方法的大小可以忽略不计(以及在第一个方法定义之前发生的类定义的任何非方法部分)或者在最后一个之后)。
如果你想要更精确的东西可能你可以运行程序,获取方法source_location
,并尝试将它们与源文件的单独解析相关联,寻找封闭的class
块等。
但是你所做的任何事情都很可能涉及关于如何定义类的假设,因此并不总是正确的。
编辑:刚看到你也在询问方法和模块,而不仅仅是类,但我认为类似的论点适用于那些。答案 1 :(得分:0)
我已经创建了一个以wdebaum建议的方式处理这个问题的gem。 class_source。它当然不包括所有情况,但对于需要此类事物的人来说,这是一个很好的80%解决方案。 Patches welcome!