java 语义_Java文件合并变得语义化

java 语义

与任何程序员交谈,并询问他应该如何进行合并:“它应该理解代码,对其进行解析,然后根据结构进行合并” –他很可能会说。

而这恰恰是SemanticMerge for Java所做的:它解析要合并的文件(加上祖先或“文件在更改之前的状态”)并根据该信息进行操作。

为什么所有关于合并的嗡嗡声?

开发软件是一个协作过程。 如果您在团队中工作,迟早会有两个开发人员修改同一个文件。 每当发生这种情况

您必须合并。 实际上,合并并不仅限于创建分支(很多人会说),而是合并到处理相同文件的开发人员,即使他们在同一分支上进行合并(如果两个人在同一分支,同一文件上工作)他们将必须在签到时合并-或在Git行话中“提交”。

在合并方面,新一代的分布式版本控制系统(DVCS)比上一代做得更好。 这就是为什么许多人从SVN,CVS和较早的替代产品跳入Git的原因。

下一步不仅是在如何处理文件方面的更好算法,下一步是创建一种更好的机制来合并“文件内部”,这正是SemanticMerge的全部意义所在。

SemanticMerge旨在降低保持代码干净的成本

在开发合并工具时,我们始终牢记两个图形:1981年的Barry Bohem的更改成本和20年后的Kent Beck的相同图形:

时间贝克

一代又一代的开发人员被教导“波西姆原理”:“进行生产变更,与分析阶段引入的相同变更相比,这将花费您一笔巨款”。

然后,贝克提出了类似的建议:“保持代码干净,更改成本将保持不变”,这是敏捷方法背后的基石。

而这恰恰是SemanticMerge背后的口头禅:保持代码干净。 为什么? 因为它有回报。

通常,您会看到需要重新布置的类:“放下这两个私有方法,将公共构造函数上移,将私有字段移到底部……”但是您不这样做的原因是,也许有人触摸该文件,合并将变得地狱。 这正是SemanticMerge所解决的问题:它“知道”您移动了一个方法,因此不会被它所愚弄。

语义合并

现在让我们研究一个典型的语义合并案例。 假设您有一个带有几种方法的类。 第一个开发人员将其中一个方法移动到类中的其他位置,并且还修改了该方法。 同时,第二个开发人员在原始位置修改了该方法。

查看下图:

语义合并

常规的基于文本的合并工具将无法处理这种情况,但是SemanticMerge能够识别该方法发生了什么并提出以下合并情况:

语义合并无为

如您所见,它标识方法“ onBuildHeaders”已被并行修改(检查打印方法名称的栏两边的“ c”图标)并已移至其中一个贡献者(选中“ m”图标)。

现在,进行合并的开发人员可以在“ onBuildHeaders”方法上运行“合并”,该方法将仅合并冲突的方法,并保留新位置。

SemanticMerge如何工作?

您可能会猜到,SemanticMerge首先解析所涉及的3个文件的代码(原始文件加上两个贡献者),然后计算每个文件的结构:这是树的代码表示形式。

完成此操作后,SemanticMerge开始使用3棵树:首先计算一个贡献者与原始版本之间的差异,然后与另一个贡献者重复该过程。

第三步是合并计算本身:它将遍历两对差异并检查它们是否碰撞。 如果它们这样做,则存在合并冲突。 如果相同的方法已被移动或修改两次,以此类推,则可能发生这种情况。 计算稍微复杂一点,因为不仅必须在冲突相同方法时还要计算冲突,而且还必须在其容器中存在冲突时计算冲突(例如,在父类之间进行“有区别的”重命名等)。

还值得补充的是,为了在重命名方法(或字段,属性等)时跟踪它们,SemanticMerge计算“相似性索引”以查看方法主体之间的接近程度以及匹配度何时良好,它假定它是相同的元素。

一些数字

我们重新运行了约4万个合并,下载了将近500个开源项目。 这意味着我们拉出存储库,找到所有合并,然后通过SemanticMerge工具再次运行它们。

这样做,我们发现了以下数字:

  • 当前的合并中有23%是“语义”的,这意味着它们具有的内容不是“变-变”冲突。 它可以是代码移动,在同一位置添加多个方法,移动和更改方法等等。
  • 在这4万次合并中,我们发现1.54%的合并从手动变为全自动。 这不是一个很大的数字,这意味着一旦团队开始使用SemanticMerge,它就会增长。 (这些数字是使用与当前语言无关的合并工具重新运行合并的结果,因此开发人员倾向于避免对文件进行复杂的更改)。
  • 在通过SemanticMerge和传统的基于文本的合并工具运行代码时,我们计算了合并冲突中涉及的行数,我们发现,使用SemanticMerge,冲突中涉及的代码行减少了97%……这意味着工作量减少了去做!!

数字语义

免费开源

在测试SemanticMerge时,我们提取了约500个长期运行,狂热的开放源代码存储库,然后我们“重放”了所有合并。 在列表中,有像hibernate,openjdk,apache-lucene,jbos,monodevelop,mono,monomac,monogame,nhibernate之类的存储库,这确实很有帮助。

因此,我们决定免费为对开源项目做出贡献的开发人员免费使用SemanticMerge,因为我们相信可以回馈。 您可以在这里查看 !

参考:我们的JCG合作伙伴 Pablo Santos在SemanticMerge博客上对Java文件合并进行了语义化 。

翻译自: https://www.javacodegeeks.com/2013/06/java-file-merging-goes-semantic.html

java 语义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Pulsar:分布式发布订阅消息系统

Apache Pulsar是一个开源的分布式pub-sub消息传递系统,最初由Yahoo创建,并且是Apache Software Foundation的一部分 。 Pulsar是用于服务器到服务器消息传递的多租户高性能解决方案。 脉冲星的主要功能包括[4]: 对Pulsar实例中的多个集群的…

迟来总比没有好:SSE或服务器发送的事件现在已在JAX-RS中

服务器发送的事件 (或简称为SSE )是非常有用的协议,它允许服务器通过HTTP将数据推送到客户端。 这是我们的网络浏览器支持的年龄,但令人惊讶的是, JAX-RS规范在很长一段时间内都忽略了这一点。 尽管Jersey提供了适用于…

java 面向对象继承的思想_Java面向对象思想

Java类的定义:成员变量会默认初始化,局部变量不会默认初始化。如何在内存中区分类和对象:♦类是静态的概念,代码区♦对象是new出来的,位于堆内存,类的每一个成员变量在不同的对象中都有不同的值(除了静态变…

java 垃圾回收手动回收_Java垃圾回收(4)

java 垃圾回收手动回收G1:垃圾优先 G1收集器是热点JVM中要实现的最新收集器。 自Java 7 Update 4以来,它一直是受支持的收集器。OracleGC团队也公开表示,他们对低暂停GC的希望是完全实现的G1。 这篇文章来自我之前的垃圾收集博客文章&#xf…

使用正确的垃圾收集器将Java内存使用量降至最低

大小对于软件至关重要。 很明显,与大型整体方法相比,在微服务体系结构中使用小型组件具有更多优势。 最新的Java版本的Jigsaw可帮助分解旧应用程序或从头开始构建新的云原生应用程序。 这种方法减少了磁盘空间,构建时间和启动时间。 但是&am…

java 鼠标画多个圆形_点击鼠标不同的建(左、中、右)画一个不同颜色的圆

[java]代码库import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JFrame;public class T1 extends JFrame{int x;int y;Color c;public T1(){this.setSize(600,400);this.setDefaultCl…

通过粘性仙人掌基元进行延迟加载和缓存

您显然知道什么是延迟加载 ,对吗? 而且您无疑知道缓存 。 据我所知,Java中没有一种优雅的方法来实现它们中的任何一个。 这是我在Cactoos原语的帮助下为自己找到的。 Matteo Garrone的《 Reality(2012)》 假设我们需…

java语言编程基础_java语言编程基础

java语言基本要素高级语言如c、c#、java等都有一些共同性的东西:关键字、标识符、运算符、注释、数据类型、常量和变量、语句、函数、数组。高级语言在这些要素上大同小异。Java关键字:一些有特定含义,有专门用途的字符串(keyword)。Java中关…

junit mockito_JUnit和Mockito合作

junit mockito这次,我想对测试框架Mockito进行概述。 毫无疑问,这是用于测试Java代码的最受欢迎的工具之一。 我已经对Mockito的竞争对手EasyMock进行了概述。 这篇文章将基于有关EasyMock的示例应用程序。 我的意思是代表咖啡机功能的类。 使用Mockito…

debian10树莓派4安装mysql_树莓派4上如何安装 Raspbian Buster

随着 Raspberry Pi 4 主板的问世,了解如何使用Raspbian Buster设置您的操作系统。你的新Pi 4到了邮箱,你已经设置了办公桌,您已准备好安装操作系统。对于初学者来说,Raspbian为Pi制造商提供了出色的桌面体验。最重要的是&#xff…

借助财务客户评估解决方案在云中构建AppDev

现代JBoss BRMS时代最古老的业务逻辑演示是2012年6月发布的“ 客户评估”示例 。 那时,JBoss BRMS包含规则,事件和流程。 该项目提供了一个完整安装和配置的环境,用于展示该项目和所有可用的BPM组件。 它包括一个带有单元测试的JBoss Develo…

jvm 性能_JVM性能魔术

jvm 性能HotSpot是我们众所周知和喜爱的JVM,是Java和Scala汁流淌的大脑。 多年来,许多工程师对其进行了改进和调整,并且每次迭代时,其代码执行的速度和效率都接近于本机编译代码。 JIT(“及时”)编译器是…

Hollowjars,部署扫描程序以及Wildfly群体为何很棒

在上一篇文章中,我描述了如何使用OpenLiberty和maven作为独立服务器或maven构建的一部分来启动服务器,以及如何创建fatjar包。 在这篇文章中,我正在研究如何使用Wildfly群。 我仍在尝试使MicroProfile在Wildfly full上运行,因此&…

Java调用跟踪系统_Tracer:在分布式系统中的调用跟踪和日志相关

Tracer: Distributed system tracingTracer noun, /ˈtɹeɪsɚ/: A round of ammunition that contains a flammable substance that produces a visible trail when fired in the dark.Tracer is a library that manages custom trace identifiers and carries them through …

java测试netty_《Netty官方文档》基准测试

原文链接 译者:lijunshuNetty有一个模块叫’netty-microbench’,我们可以用他来执行一系列的微型基准测试。Netty-microbench是基于OpenJDK JMH构件的(HotSpot的推荐基准测试方案)。当你开始netty基准测试时,你不需要额外的依赖。运行基准测…

java描边_shape描边设置是否显示四周描边

android:width"1pt"/>android:topRightRadius"30pt"android:bottomRightRadius"30pt" />效果图如下:这里设置了左边描边不显示设置虚线:android:shape"line">android:dashGap"3pt"android:d…

java 垃圾回收手动回收_Java垃圾回收(2)

java 垃圾回收手动回收并行清理 今天,我们介绍了并行GC的工作原理。 具体来说,这是在Eden上运行并行Scavenge收集器,在Tenured一代上运行Parallel Mark and Sweep收集器的组合。 您可以通过传递-XX: UseParallelOldGC来获得此选项…

OpenHub框架进行的异步通信

在本系列的前一部分中,我们介绍了OpenHub框架 。 这部分显示了框架最强大的功能之一- 异步消息传递模型 。 当源系统无法等待目标系统的响应时,将使用系统之间的异步通信。 有以下几个原因: 源系统必须尽可能地响应 ,并且不受外…

工厂设计模式和策略设计模式_设计模式:策略

工厂设计模式和策略设计模式这次我想谈谈策略设计模式 。 通过这种方式,我开始撰写有关行为设计模式的文章。 这种模式表示对象之间的某些交互模式,以使代码更灵活且组织得更好。此方法的最本质点是对象之间的松散耦合。 当您的应用程序中有多个实现目的…

如何将不带web.xml的Spring应用程序部署到Tomcat

介绍 由于Servlet 3规范不再需要web.xml来配置Web应用程序,因此已通过使用注释代替。 在本文中,我们将研究如何在不使用web.xml情况下将简单的基于Spring的应用程序部署到Tomcat 8.5。*。 创建一个空的应用程序 使用以下命令使用maven webapp原型创建一…