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 语义

java 语义_Java文件合并变得语义化相关推荐

  1. Java文件合并变得语义化

    与任何程序员交谈,并询问他应该如何进行合并:"它应该理解代码,对其进行解析,然后根据结构进行合并" –他很可能会说. 而这恰恰是SemanticMerge for Java所做的: ...

  2. java实现word文件合并

    java实现word文件合并 前言 一.Spire.Doc.jar 二.使用步骤 1.引入库 2.写接口 前言 本文使用了Free Spire.Office for Java这个工具,下面是官网地址 ...

  3. 文件上传java逻辑_Java 文件上传 实例

    import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public cl ...

  4. java 编辑excel文件合并单元格边框显示问题

    现象: 第12行 边框显示不完整. 解决方法: 误区以为不用设置跨掉的单元格 ,第9行是完整单元格,第11行是画了一个格子. 如图: 将单元格数量补全后 设置边框样式整个边框就完整了. 实现完整代码: ...

  5. java 文件目录_Java——文件及目录File操作

    packagefile;importjava.io.File;/*** 删除文件和目录 **/ public classDeleteFileUtil {/*** 删除文件,可以是文件或文件夹 * *@ ...

  6. java 状态机_Java 数据持久化系列之池化技术

    在上一篇文章<Java 数据持久化系列之JDBC>中,我们了解到使用 JDBC 创建 Connection 可以执行对应的SQL,但是创建 Connection 会消耗很多资源,所以 Ja ...

  7. java实现文件合并_Java实现文件分割和文件合并实例

    文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来). 找了好多博客,本来想转载一个来的 结果找不到了.很无奈. 只好自己贴代码上了. 当然我会尽力好好写注释的. 文件切割器: impo ...

  8. Java实现文件分割和文件合并实例

    文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来). 找了好多博客,本来想转载一个来的 结果找不到了.很无奈. 只好自己贴代码上了. 当然我会尽力好好写注释的. 文件切割器: impo ...

  9. Java合并流实现简单的文件合并示例

    合并流: SequenceInputStream:  表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,以此类推,知道到达包含的最 ...

最新文章

  1. 几个阿里, 美团,腾讯大佬的公众号!超级变态!
  2. Java Socket实战之五:使用加密协议传输对象
  3. 上班4年“武功”全废,想跳槽却被HR嘲讽,这位搞AI的硕士小哥心态崩了
  4. elasticsearch入门一
  5. 多进程同时写一个文件会怎样?分别用write和fwrite去观察现象
  6. gstreamer 获取帧数据_Android App卡顿率(顺滑度、顺滑度)并整理数据
  7. mac或linux下JDBC的简单实现,图文介绍(附测试源码)
  8. 暖通lisp快捷键_CAD 快捷键一览
  9. python nonlocal的用法_简谈Python3关键字nonlocal使用场景
  10. flash背景透明、置底、禁止放大 右键菜单
  11. 前端面试题vue-element汇总
  12. 【Java】浅谈Java的I/O体系
  13. 右击计算机管理出现乱码,win10系统右键菜单出现乱码的处理方案
  14. MySQL基础面试题总结
  15. WebS WebStorm WebStorm WebS官方版下载
  16. 微信小程序input详解
  17. PHP加密如何保护php源码不被破解不被轻易去授权
  18. react18的SSR
  19. 【毕业设计】大数据 电影数据分析与可视化系统 - python Django 大数据 可视化
  20. 【板栗糖GIS】工作疑难—win11如何解压z01分解卷压缩包

热门文章

  1. K8S Learning(2)——集群环境搭建
  2. Java web文件下载断点续传
  3. JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库
  4. Java虚拟机是如何执行线程同步的
  5. 好玩的Scratch
  6. ssm使用全注解实现增删改查案例——IEmpService
  7. c传给php数据解包,小程序源码提取工具,完美解包,一键提取小程序源代码工具_PHP源码...
  8. git 拉取gitlab代码
  9. 2015c语言9月答案,2015年9月计算机二级C语言预测题答案
  10. java反射机制的简单使用和优缺点