没有合适的资源?快使用搜索试试~ 我知道了~
超越源代码的克隆:API文档和基础结构即代码实践的研究。穆罕默德·阿米齐安·乌马齐兹引用此版本:穆罕默德·阿米齐安·乌马齐兹。超越源代码的克隆:API文档和基础结构即代码实践的研究。软件工程[CS.SE]。波尔多大学,2020年。英语。NNT:2020BORD0007。电话:02879899HAL ID:电话:02879899https://theses.hal.science/tel-02879899提交日期:2020年HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire波尔多学院B.UN I V E R S I TD EB O R D E A U X科学与技术THesa在波尔多计算机科学研究实验室获得波尔多大学博士学位专业:计算机科学博士培训:计算机科学博士学校:数学与计算机科学超越源代码的克隆:API文档和基础结构即代码实践研究由穆罕默德·阿梅齐安·乌马兹于2020年1月27日在评审团面前进行答辩,评审团成员包括:评审团主席Jean-Philippe DOMENGER,法国波尔多大学教授论文指导Jean-Rémy FALLERI,HDR.................................................................................................... 波尔多INP高级讲师,法国论文联合主任Xavier BLANC,法国波尔多大学教授.........................................................报告员Mireille BLAY-FORNARINO,法国尼斯大学教授................................................Tom MENS,比利时蒙斯大学教授..................................................................检查员Anne ETien,法国里尔第一大学HDR.................................................................... 讲师Tewfik ZIADI,法国HDR................................................................................. 索邦大学高级讲师摘要当软件开发、维护和演进是开发生命周期的重要组成部分时,它们占总成本和工作量的80% 在维护过程中,开发人员有时会复制并粘贴源代码片段以供重用。这种看似无害的做法比我们预期的要普遍得多。在文献中通常被称为"克隆",这些源代码重复是软件工程中一个众所周知且研究得很好的主题在这篇论文中,我们将重点介绍源代码之外的软件工件的复制粘贴实践特别是,我们选择专注于两种特定类型的软件工件:API文档和部署文件(即Dockerfiles),因为它们分别是:开发人员了解如何使用和集成外部API,并代表开发人员和应用程序用户之间的最后一步。对于每一个软件工件,我们都遵循一种通用的实证研究方法。因此,我们发现API文档和软件部署文件(即Dockerfiles)包含重复内容,并且这种重复的频率从27.69%(API文档)到近50%(Dockerfiles)不等。然后我们确定这种复制品存在背后的原因。 此外,我们对有经验的开发人员进行了一项调查,发现他们意识到了这种重复,经常面对他们。但我对他们的看法褒贬不一。最后,我们表明,这两种类型的软件工件都缺乏具有重复使用机制的工具来处理重复问题,而且一些开发人员甚至依赖于专门的工具来管理它们。关键词:文档、重复、Dockerfile、Docker、重复使用摘要在软件开发中,维护和开发是开发生命周期的重要组成部分,占总成本和工作量在维护工作中,开发人员有时会复制并粘贴源代码片段以供重用。这种看似无害的做法比人们想象的更普遍在文献中通常被称为"克隆",这些源代码副本是软件工程中众所周知和研究的主题。在这篇论文中,我们的目标是阐明复制和粘贴到代码之外的软件工件上的实践。 特别是,我们选择将我们的贡献集中在两种类型的软件工件上:API文档和部署文件(即D. Do- ckerfiles),因为 对于每个软件工件,我们遵循一种通用的Emperic研究方法。作为结果,我们显示API文档D. Dockerfiles)面临着重复,这种重复很常见,从27.69%(API文档)到几乎50%(Dockerfiles)不等 然后,我们确定这些重复项存在背后的原因。此外,我们还对有经验的开发人员进行了调查,发现他们意识到了这些重复项,并且经常遇到这些重复项,但对它们的看法不一最后,我们证明了这两个软件工件都缺乏重用机制来处理重复,一些开发人员甚至使用特别的工具来处理它们关键词:文档、复制、Dockerfile、Docker、重用LaBRI-351,解放之路-33400 Talence-法国内容。1引言11.1背景。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...... ... ... ... ... ...21.2问题陈述。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...31.3方法论。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...... ... ...51.4捐款。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...... ...61.5论文大纲。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...... ... ...72背景92.1上下文102.1.1克隆定义102.1.2克隆检测方法142.2超越Code21的软件工件中克隆的实证研究2.3克隆管理282.4摘要303API文档中的重复项333.1导言343.2背景353.3数据收集373.3.1存储库383.3.2调查393.3.3重复检测工具403.4捐款413.4.1RQ1:度假村开发人员是否经常复制粘贴文档标签?423.4.2RQ2:文档标签复制粘贴的原因是什么?....................................................... 44我ii内容3.4.3RQ3:用户可以避免重复文档。文档工具的时代?............................................................................................... 503.5对有效性的威胁523.6结论534Dockerfiles中的重复项554.1导言564.2背景574.3数据收集604.3.1存储库604.3.2调查614.3.3重复检测工具624.4捐款644.4.1RQ1:官方项目是否维护Dockerfiles系列,为什么?644.4.2RQ2:Dockerfile系列中是否会出现重复项?为什么?.............................................664.4.3RQ3:专家使用的工具有哪些优点和缺点?Dockerfiles年龄?............................................................................................. 724.5对有效性的威胁774.6结论795结论815.1贡献摘要815.1.1API文档中的重复项815.1.2Dockerfiles中的重复项825.2观点和讨论835.2.1API文档中的重复项835.2.2Dockerfiles中的重复项845.2.3讨论84法文摘要87图101列表表列表103C. HAPTER简介通过这一章,我们介绍了本文的背景、动机和贡献。本文通过实证研究两种类型的软件工件之间的重复。 我们首先仔细研究了两种编程语言(Java和Ruby)的API文档中的重复内容。然后我们处理另一个重复的问题,取笑Dockerfiles。 在本章中,我们将描述这两个令人不安的挑战和我们的主要贡献。内容。1.1背景。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ......21.2问题陈述。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ......31.3方法论。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...... 51.4捐款。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 61.5论文大纲。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 7112第1章. 引言1.1上下文当 开 发 软 件 时 , 维 护 和 开 发 是开发生命周期的重 要 组 成 部 分 , 占 总 成 本 和 工 作 量 的80%[ Alkhatib,1992 ]。在开发或维护阶段,开发人员可能会复制和粘贴源代码片段。在文献中通常被称为"克隆",这些源代码重复是软件工程中一个众所周知且深入研究的主题。 多重实证研究[Baker,1995; Baxter等人,1995] 1998年; Rieger等人。2004年; Zibran等人。[2011]已经表明,大量软件可以有5%到20%的代码库被克隆。在过去的20年里,许多研究试图理解不使用代码克隆的潜在原因[Baxter et al. (1998年; Kapser,2009年; Rieger,2005年; Cordy,2003年)。例如,Cordi [Cordy,2003]指出,在金融行业,克隆是一种常见的重复使用策略。他解释说,由于金融产品与其他产品没有太大区别,当一个新产品必须开发时,开发人员首先克隆一个类似的现有项目,然后调整它以生产开发商不得不避免这种做法,因为在错误的情况下,货币风险非常因此,任何金融工具都必须经过严格的测试(金融软件70%的成本都花在了测试上[Cordy,2003])。因此,简单地通过克隆来重用现有的源代码是便宜和快速百特等人 [百特等人。[1998]还写了一些所谓的意外克隆,这些克隆是在开发人员没有意识到的情况下产生的。在使用实例库的过程中,可能会发生这种克隆,其中开发人员必须编写重复的样板代码,如一系列调用来执行任务。虽然一些研究讨论了代码克隆可能的积极影响[Kapser和Godfrey,2006],但其他研究指出,代码克隆并非无关紧要[Juergens等人,2006]。2009年b]。无论代码克隆是否成功,在维护过程中,如果克隆的代码片段中存在错误,则开发人员必须在所有克隆的片段中传播错误修复程序,此过程可能会增加维护成本。此外,并非所有开发人员都意识到该错误存在于其代码库中的其他地方。因此,要求开发人员知道他们的代码是否被克隆,以及其他克隆片段的位置。在过去的十年里,已经发布了多个代码克隆检测器。 克隆-检测器用于识别代码库中类似或相同的代码片段。 现有的克隆检测器使用大量的技术,如基于AST(抽象语法树)的克隆检测[Baxteret al. 1998],基于令牌的代码克隆检测[Kamiya等人,[White et al.,2002]或甚至深度学习技术[White et al. 2016a]。虽然软件工程界在过去的二十年里对代码克隆非常感兴趣,但对源代码之外的软件工件中克隆的存在却很少感兴趣。在软件系统的这些工件可以是不同的类型:API文档、设计图、需求规范、构建配置-1.2. 问题陈述3部署文件、部署文件等。非代码软件工件会对最终产品产生很大影响,因此在开发过程中起着关键作用。研究表明,在非代码软件工件中克隆也很例如,多项研究[Liu et al. Störrle,2013]已经表明,UML图也像源代码一样具有完全相同的面重复。于尔根斯等人 [Jürgens等人。2010年;Domann等人。[2009]表明需求规范也可能面临这样的重复。McIntosh等人 [麦金托什等人。[2014]表明构建配置文件也面临克隆问题。在所有非代码软件工件中,我们在本文中重点研究了克隆的存在:API文档和部署文件(即Dockerfiles)。 我们选择了这两个特定的非代码软件工件,因为它们在开源项目中广泛可用。此外,这些人工制品在开源项目中的可用性使它们非常适合我们进行实证研究。最后,据我们所知,还没有研究对这两种类型的克隆进行研究。过去的人工制品特别是,我们仔细查看了API文档,因为它帮助开发人员了解如何使用,从而将他们不知道的外部API集成到他们的代码中。 我们认为,克隆API文档可能会导致不一致,从而误导开发人员和维护人员,使他们无法正确理解API的行为,从而增加软件开发的成本和工作量。此外,我们还想更仔细地了解一下Dockerfiles,它是一种专有的部署文件。Dockerfiles用于将应用程序及其所有依赖项打包到一个易于发布的包中。这些软件包是开发人员和应用程序用户之间的最后一步Dockerfiles被编写为由用域特定语言(DSL)编写的指令序列组成的简单文本文件我们认为,由于Dockerfiles类似于源代码,如果克隆的结构中存在错误,开发人员必须在所有克隆的指令中传播错误修复,使开发人员有必要第一手了解克隆的存在。因此,我们相信,鉴于这些人工制品的重要性,社区可以从这两项实证再搜索研究中受益。1.2问题陈述通过这篇论文,我们将研究代码之外的软件工件中的复制粘贴维护负担。 更具体地说,本文讨论的贡献是针对两种特定类型的工件:API文档和Dockerfiles(即部署文件的类型在本节中,我们仅介绍从API文档中收集的一个片段。虽然我们可能无差别地选择了我们正在研究的两种人工制品中的任何一种,但我们选择只呈现其中的一种,以便于理解我们的问题陈述。4第一章。引言图1.1展示了一个从Apache Commons中提取的真实API文档--用Java编写的选择项目这两种方法都有一个API文档,该文档是用名为JavaDoc的域特定语言编写的。在此摘录中,我们注意到这两个API文档的大部分是重复的(以红色突出显示)。1/**2*@paramtheefitt收集,mustnotbenull3* @param b第二个集合,必须不为null4* @return true,如果集合包含具有相同基数的相同元素。5*/6PUBLIC TT TTIC BOLEN 我的意思是,我的意思是,Collectiona,finalCollectionb){78RETURN TRUE;9 }1/**2* @param是第一个集合,不能为null3*@paramb第e秒d收集,mustnotbenull4*@PARAM EQUATOR THE EQUATOR USED F或R TETING EQUALTY5* @return true,如果集合包含具有相同基数的相同元素。6*/7PuBLIC static bolean 我的意思是,我的意思是,Collectiona,finalCollectionb,finalEQUATOREQUATOR){8.9RETURN (a)(b)(b)(c)(c)10)图1.1重复的文档以红色突出因此,我们想知道,如果我们只是幸运地遇到它,这样的场景是罕见的,或者如果它实际上是频繁的,开发人员很可能执行复制粘贴。这个问题把我们带到了我们在本文中研究的第一个研究问题:— RQ1:度假村开发人员经常复制粘贴吗?然后,当我们更接近此提取时,我们注意到底部方法的返回值是通过调用顶部方法(即委派)。当我们看起来更接近时,我们注意到两个方法都有公共的输入参数和返回类型。1.3. 方法学5这是因为底部将其输入参数(a和b)传递给上方法,并使用上方法的返回值作为其返回值。 由于这两种指标共享共同的输入参数(a和b),这导致它们也共享相应的文档,因此这些文档是重复的,如图1.1所示(红色突出显示)。 在这种情况下,由于方法委派,API文档被复制,我们不知道是否有其他隐藏的原因可能导致开发人员复制粘贴。 这就引出了我们在本文中研究的第二个研究问题:— RQ2:为什么开发人员不执行复制粘贴?最后,JavaDoc工具只提供了一种称为@InheritDoc的单一重用机制。此重用机制允许开发人员跨方法重用文档,但此机制仅限于覆盖方法。由于在图1.1中,我们只有一个减速场景,因此该机制不适用。如果没有其他文档工具提供的其他重用机制可以帮助开发人员避免这样的复制粘贴,我们会感到惊讶 这是我们在本文中研究的最后一个研究问题背后的原因:— RQ3:适当使用最先进的方法可以避免复制粘贴吗?通过我们的三个研究问题,我们希望让开发人员和研究人员更好地意识到他们的非代码软件工件中存在重复。 我们还致力于让研究社区更好地意识到可能导致开发人员停止复制粘贴的原因。最后,我们希望确定不同类型的再利用机制,这些机制可以帮助工具提供商更好地为他们的社区服务,以避免重复。因此,在本文中,对于API文档和Dockerfiles软件工件,我们将回答以下三个研究问题:— RQ1:度假村开发人员经常复制粘贴吗?— RQ2:为什么开发人员不执行复制粘贴?— RQ3:适当使用最先进的方法可以避免复制粘贴吗?1.3方法论在本文中,我们进行了两项实证研究。对于每项研究,我们回顾了两个知识来源:(1)一组Github 1存储库,对应于我们研究中将要分析的开源项目,以及(2)一组对调查的回应,该调查收集了专家对所研究工件中重复项的意见。 我们手动构建调查,并将其发送给我们通过电子邮件或社交媒体在线联系的开发专家1. https://github.com6第一章。引言媒体(例如LinkedIn、Reddit、Github)。 基于这两个知识来源,我们遵循基于三角测量的方法来交叉验证我们的结果[Seaman,1999; Woodet al. (1999年; Miller,2008年; Bratthall和Jørgensen,2002年)。 通过这种方法,我们希望增加我们对收集的结果的信心,因为它们是由两个不同的知识来源验证的。 这种方法还减少了我们的总体偏见,因为我们的知识来源--边缘有每一组单独的偏见,它们不会重叠。为了回答我们的第一个研究问题:RQ1:开发人员是否倾向于复制粘贴?首先,我们构建了一个工具,可以自动解析我们数据集合中的所有github存储库然后,我们应用我们的工具并识别Web应用程序中显示的所有重复项,以便于手动分析。然后,我们将这些结果与我们从调查中收集的答案进行交叉验证。然后,回答我们的第二个研究问题:RQ2:为什么开发人员不愿意执行复制粘贴?我们从所有已识别的重复样本中随机抽取一组样本,并请三位专家使用我们为重复分析开发的Web应用程序进行手动分析。为了进行这一分析,我们要求我们的专家寻找潜在的原因,解释为什么重复实际上存在,并标记每一个重复一致。在标记过程中,我们不允许专家之间进行讨论。因此,如果两个专家对重复背后的潜在原因意见不一,第三个专家必须决定哪一个更有可能。最后,为了回答我们的最后一个研究问题:RQ3:适当使用最先进的方法可以避免复制粘贴吗?首先,我们为我们正在研究的人工制品类型建立一个所有然后,我们手动查看列表中的每一个工具,并阅读所有用户指南,以查找它们提供的所有重用机制。然后,对于我们在RQ2中确定的每一个潜在原因,我们都要看看是否有任何重用机制可以用来避免它然后,我们将这些结果与我们从调查中收集的答案进行交叉验证。1.4贡献在我们的工作中,我们喜欢源代码以外的人工制品中的重复我们选择专注于两个主要工件:API文档和Dockerfiles。对于这两种人工制品,主要贡献可按以下方式汇总:— 我们表明,API文档和软件构建文件目前面临重复问题,并且这种重复很常见。— 我们确定了存在这种重复的原因。— 我们发现他们意识到这种重复,并经常面对2. https://github.com/jrfaller/diggit1.5. 论文大纲7— 我们发现,这两种软件工件都缺乏重复使用机制来处理重复的工件,而且一些开发人员甚至依赖于专门的工具来管理它们。这些贡献导致我们发表了两篇研究论文:— 重复使用文档:热还是不热?第16届软件重用国际会议(ICSR 2017)上的实证研究[Oumaziz et al. 2017年]。— 在第35届IEEE软件维护与演进国际会议(ICSME 2019)上处理Dockerfiles系列中的重复项:向专家学习[Oumaziz et al. (2019年)。1.5论文大纲本论文的其余部分组织如下。在第二章中,我们首先概述了软件工程中重复领域的最新技术水平然后,在第3章中,我们对两种编程语言(Java和Ruby)的API文档中的重复进行了实证研究。在第4章中,我们对Dockerfiles中的重复进行了实证研究最后,在第5章中,我们通过总结贡献和主要观点来结束本文。
下载后可阅读完整内容,剩余1页未读,立即下载
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)