JSDeodorant:JavaScript程序的类意识外文翻译资料

 2022-12-18 03:12

英语原文共 4 页,剩余内容已隐藏,支付完成后下载完整资料


JSDeodorant:JavaScript程序的类意识

Laleh Eshkevari、Davood Mazinanian、Shahriar Rostami和Nikolaos Tsantalis

计算机科学与软件工程系

加拿大蒙特利尔康科迪亚大学

电子邮件:{l mousa,d mazina,s rostam,tsantalis}@cse.concordia.ca

摘要:

在最近更新了JavaScript规范,增加了对类和名称空间声明的语法支持之前,开发人员使用自定义解决方案来模拟模块化分解(例如类和名称空间)和其他面向对象的构造,例如接口和继承关系。然而,由于几年来缺乏标准,用于模拟面向对象构造的自定义解决方案的变化和多样性很大,使得在基于以前的语言规范开发的JavaScript项目中,维护和理解变得十分困难。在本文中,我们主要介绍一个名为JSDEODORANT的Eclipse插件,它可以支持JavaScript程序的类感知维护和理解。(https://youtu.be/k4u2lwkl6ju)。

一、引言

JavaScript是一种动态类型化语言,它支持程序化、功能化和原型化的面向对象编程范例。虽然在拥有所有这些特性让这种语言十分强大,但JavaScript程序在开发、调试和维护方面仍然存在一定问题。尽管JavaScript十分流行,但它的支持工具与传统语言(例如Java或C (1))还是无法比拟。流行的开发工具,例如JSHint、JSLint和ESLint,只能帮助JavaScript开发人员检测编码风格问题和语法错误。最先进的开发环境为代码开发和维护提供了支持也有限。例如,EclipseJavaScript开发工具(JSDT)提供有限的代码定位、语法高亮显示、代码补完和简单的快速修复。JetBrains WebStorm是最著名的专门为JavaScript设计的商业IDE之一,它还支持一些基本的重构,比如提取和内联函数。

但是,在工具支持方面仍有进步的空间。比如说自动检测代码片段,开发人员在JavaScript项目中模拟面向对象的构造。但是在最近对语言规范进行更新之前,开发人员必须使用自定义解决方案[2]来模拟模块化分解构造(例如类和名称空间),以及本地OOP构造(例如接口和继承关系)。缺乏标准导致了大量的模式和实例,每种模式和实例都各有长处和短处。事实上,在前面的工作[3]中,我们记录了4个用于模拟类声明的流行模式,5个用于模拟命名空间的模式,以及3个用于导入/导出类和函数的模块模式,这些模式都可以组合使用。

尽管最新的javascript规范为类和名称空间声明提供了语法支持,但现在仍然存在大量的程序是基于旧版本的javascript的,它们都不可避免地模拟了面向对象的构造。同时很多开发者也不愿将他们的代码迁移到最新的ECMAScript规范(即ES6)。可以肯定的是,维护一个不支持识别其构建块(模块、名称空间、类和接口)的程序是具有一定难度的。

在最近的一项研究中,Silva等人[4]介绍了能够检测类和继承模拟的JSClassFinder。但它在可扩展性、准确性和可用性方面存在一些限制。我们在前面的工作[3]中探讨了这些局限性,同时介绍了JSDEODORANT这种自动检测高精度和召回的函数的构造函数(即类声明)的方法。在本文中,我们通过添加对继承关系标识的支持来扩展JSDEODORANT,并实现一个可以实现许多包括类感知代码导航和可视化功能在内的Eclipse插件。与此同时还进行了JSDEODORANT、EclipseJSDT、JetBrains Webstorm和JSClassFinder之间与类意识相关的特性的全面比较。

二、实例

JSDEODORANT已经发展成为成一个用于分析JavaScript项目的独立于IDE的工具组件。其核心思想为存储一个表示给定javascript项目结构的层次对象模型,该模型是根据JavaScript文件的抽象语法树(ast)构建的。这个模型隐藏了多余的AST细节,同时它也能详细地在上面实现各种分析算法。在最高级别,该模型能够捕获JavaScript(即由一组相关的JavaScript类组成的)模块依赖关系信息。JSDEODORANT支持在JavaScript(CommmonJS和Google Closure Library)中定义模块的两个常见的实例标准[3],它的可扩展性让其能够支持其他标准(例如AMD)。简言之,为了识别构造函数(以下称为类),JSDEODORANT首先分析对象创建表达式(即新关键字的用法),然后执行轻量级数据流分析,将每个类实例化表达式绑定到其相应的类声明。当存在显式类实例化时,此方法将标记为类。然后,JSDEODORANT使用推理机制来识别项目中没有实例化的类。为此,除了原型对象外,JSDEODORANT还会评估其余未标记函数声明的主体,以推断函数是否是实际模拟类[3]。

标识类层次结构。缺乏对面向对象构造的语法支持,使得JavaScript开发者只能使用几个不同的模式来模拟类之间的继承关系。JSDEODORANT目前检测到以下三种模式:

1)使用子类型的原型初始化子类型的原型:

subType.prototype=Object.create(superType.prototype);

2)使用用户定义的函数,例如extends()或inherits(),这些函数在内部实现了第一种模式:

3)使用调用或应用函数调用子类型主体内的super类型的构造函数。在JavaScript中,这些函数允许更改函数的上下文,即,调用调用或应用的函数体中此对象的绑定。例如,在以下代码段中,将调用父类型函数,并指向子类型的上下文:

function subType(arg1, agr2, ..){

superType.call(this, arg1, arg2, .. );

// some code

}

三、工具特点

3.1文件概要

在JavaScript中,属性和方法可以在模拟类声明的主体中声明,也可以添加到其原型中(比如下面的示例)。

helma.Color = function(R, G, B) {

var value = null; // some code this.getName = function() {

return helma.Color.COLORVALUES[value];

};

// some code }

helma.Color.prototype.fromName = function(name) { // some code

};

将方法添加到原型(示例中的fromName)的优点是:1)它一次性存储在内存中,并在类的所有实例之间共享;2)可以重写派生类中的方法,但仍然可以调用基类的方法。但在类的主体中定义的方法具有对类的私有成员的完全访问权,即局部变量和函数(例如,示例中的函数getName具有对值的访问权)。所以开发人员可能根据情况倾向于某一种风格。为了识别类成员,JSDEODORANT评估类主体内外的赋值语句。标识的类成员显示在模块视图中,该视图概述了JavaScript模块的结构(见图1)。

图1. JSDEODORANT文件大纲结构。

如上所述,接口、抽象类/方法、继承和多态性也在能够JavaScript中进行模拟。例如通过提供一个空方法或一个记录或抛出“未实现”错误消息[5]的方法来模拟抽象方法,从而强制子类实现它。JSDEODORANT识别抽象、重写和重写方法,如图1所示。

类/接口成员用描述性图标:

情况模拟:假如一个需要在conditionaldelay.js上进行维护的开发者(图1)。他可以看到文件包含一个类,即,goog.async.ConditionalDelay。他可以推断这是一个派生类(因为重写图标),它的所有方法都可添加到类的原型中。让他可以通过模块视图来理解JavaScript模块的抽象视图,还可以双击对应元素轻松导航至类/接口或其成员的源代码。

3.2类型层次

如上所述,JavaScript开发者可以用各种模式来模拟继承(见第二章),JSDEODORANT支持三种最常见的模式。开发者可以通过a)右键单击模块视图中的类并从弹出菜单中选择“显示类型层次结构”(如图1),或b)将鼠标悬停在编辑器中的类名上并从弹出菜单中选择“JSDEODORANT:打开类型层次结构”(如图2)来轻松查看类的类型层次结构。在这两种情况下,类型层次结构将在模块视图中呈现给开发人员(如图3)。

图2.编辑器视图中的JSDEODORANT类型层次结构。

情况模拟:在前面的示例中,如果从文件大纲推断类ConditionDelay具有父类型之后,开发者决定进一步检查这个特定类的类型层次结构。通过使用上述导航机制,他可以找到supertype类goog.disposable,并通过双击supertype导航到其声明。此外,类型层次视图(图3)还能检查其兄弟子类型,并查看整个JavaScript项目的树结构中的所有类型声明(类和接口)。最后,这个视图可以帮助开发者捕获特定类的继承树的深度。

图3. JSDEODORANT类型层次视图。

3.3类感知代码导航

在[3]中,我们提出了在JavaScript程序中检测类模拟的算法。JSDEODORANT标识类实例创建表达式并将其绑定到类声明,从而使类声明中的代码导航可以实现,反之亦然。使用JSDEODORANT,开发人员可以很容易地找到实例化,方法如下:a)将鼠标悬停在编辑器中的类名上,然后从弹出菜单(图2)中选择“JSDEODORANT:查找实例化”;或者b)右键单击模块视图中的类,然后从弹出菜单中选择“查找实例化”(图1)。在这两种情况下,JSDEODORANT都在Instantiations视图(图4)中提供了结果,在该视图中,开发人员可以双击任何表达式来导航到相应的源代码片段。类感知代码导航也可用于从实例化表达式导航到类声明(图5)。

图5. JSDEODORANT类实例化结果。

情况模拟:假设开发者必须向ConditionDelay类的函数构造函数添加(或删除)一个参数。在修改构造函数之前,他需要标识项目中这个特定类的所有实例化,从而执行更改,以便添加(或删除)与参数对应的参数。

3.4 可视化

JSDEODORANT可视化模块依赖关系,以及所选类的UML类图。

图5.从实例化表达式导航到类声明

模块依赖项以类似于UML包图的方式可视化,以提供JavaScript项目的体系结构视图。类图说明了类结构(属性、方法)和继承关系。开发人员可以通过右键单击模块视图中的类名并从弹出菜单中选择“显示类图”来查看类图。图6显示了类形状的类图示例。开发人员可以通过双击类、属性或方法导航到声明元素的源代码。此外,通过单击相应的按钮,开发人员可以轻松地导航到类型层次结构或实例化视图。

图6. JSDEODORANT类图视图。

四、验证

4.1精度

我们在两个开源JavaScript项目中测试了JSDEODORANT在检测继承关系方面的准确性。我们选择了表I中所示的项目,因为这两个项目都使用JSDoc注释,通过查找所有@extends JSDoc标记,可以构建一个无偏见的Oracle。

表一

继承关系检测的准确性。

Program

Size (KLOC)

Identified relations

TP

FP

FN

Precision

Recall

closure-library-v20160315

605.3

643

643

0

120

100%

97%

Helma-1.7.0

31.5

29

29

0

2

100%

93%

值得注意的是,这些项目的测试文件中声明的一些类没有注释,因此也不在Oracle中,而JSDEODORANT标识了它们的继承关系。本文的两位作者分别对源代码进行了独立检查,并将检测到的关系标记为真阳性(TP),当可以推断出它们之间的实际继承关系时。最终的标签是一致的,并在发生冲突时寻求其他意见。对于错误否定(FN),可以看到,尽管一些类是用@extends标记注释的,但是开发人员没有在代码中实现继承关系。我们请读者参考[3]了解类检测的准确性。

4.2工具比较

表II总结了JSDEODORANT、EclipseJSDT、WebStorm和JSClassFinder提供的类意识特性的比较。

表二

工具比较。

lt;

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[20241],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。