高阶函数初探(四)

less than 1 minute read

Published:

这周主要将上周讨论的方法实现了,并将十个项目进行了详细的统计,得到了第一版的数据,从数据中我们或许能看到一点东西。

主要工作

上周主要做了三个工作:

  • 完善提取调用关系的代码
  • 将每个函数声明和调用都与相应的作者进行匹配
  • 统计了第一版较为完善的信息

提取调用关系

按照之前讨论的思路,首先遍历项目,提取所有的函数声明的信息,并保存函数的类名,方法名,参数的数量和函数参数的位置,然后再遍历一遍项目,提取每一个函数调用,并根据之前提取的信息进行匹配函数的声明,通过一次又一次的修改测试,整出来一个尚可的版本。
提取函数调用并保存到数据库,便于快速查询。
图片描述
但是,提取调用关系仍然存在以下问题(每跑一个项目都会发现相应的问题,修改完以后还要重新跑一遍之前的项目,心累)。

  • 如果高阶函数在声明的时候存在默认值,在函数调用时无法根据参数来判断是否为高阶函数调用。 图片描述
  • 创建新的对象的时候没有用new关键字,因为在匹配函数调用时,我需要知道这个调用具体属于哪个对象,属于哪个类,我将一个文件中的所有new出来的对象存在一个symbol表中,但是没有关键字new不容易识别:
    图片描述
  • 一些非常奇怪的调用:
    图片描述
    图片描述
  • 一些高阶函数十分相似的:
    图片描述
  • 嵌套函数,有些高阶函数嵌套在一些函数里面,按照常理这些函数并不属于某些class或者object,只能在所嵌套的函数内使用,所以这些嵌套函数并没有统计。
    图片描述

除了上面的问题,提取的函数调用基本没有什么问题,还有就是在函数调用类型判断的时候,类型一的数量实际上会比实际上多,因为里面会包含那种从上层函数直接继承来的函数。因为在判断类型的时候,类型一是处于逻辑上的else语句上。 图片描述

作者匹配

上周解决了提取git log困难的信息,采用了将其存入数据库的方法,现在派上了用场了,我的思路是根据函数所在文件的路径以及函数的第一行来进行匹配。
图片描述
但是其中也存在一些问题,95%以上的作者都能找到,另有一些函数没有找到作者,最后通过发现,函数第一行都能匹配到,但是路径总是不对,最后通过观察发现,有些文件或者变换了路径或者修改了文件名称导致在log文件中没有找到,最后只能通过手动将剩余没有找的信息补充完整。
图片描述

最终的统计结果

详细的信息(每个函数声明和调用的信息)sql文件已上传,最终的简略表格统计在这里列出。

  • 基本信息
    图片描述
  • 高阶函数声明代码行数信息 图片描述
  • 高阶函数声明类型信息
    图片描述
  • 高阶函数调用类型信息
    图片描述
  • 高阶函数声明调用作者信息
    图片描述