如何通过代码库的抽象分支以增量方式进行大规模更改 - Paul


团队经常使用版本控制分支进行大规模更改,以便他们可以继续开发功能并修复主线上的错误。
但是如果您的代码位于分支上,则它不能被集成的。
合并回主线肯定是痛苦的,痛苦的程度取决于你想要做出多大的改变,同时你在主线上做了多少工作。

这意味着推动您使用版本控制分支的力量越强,最终您必须合并时就越痛苦。如果您还使用分支作为功能,情况会变得更糟。
一般来说,将分支用于特性或大规模更改是一个坏主意,原因有几个,其中最重要的是它会阻止持续交付和重构:Martin Fowler 有关于为什么特性分支不好以及如何使用特性切换作为替代方法的优秀文章。

而抽象分支是一种在主线上逐步对应用程序进行大规模更改的模式。
Paul Hammant 在他关于这项技术的原始博客文章中提供的示例是从 Hibernate 迁移到 iBatis。

抽象分支涉及以增量方式对系统进行大规模更改,如下所示:

  1. 在需要更改的系统部分上创建抽象。
  2. 重构系统的其余部分以使用抽象层。
  3. 在新实现中创建新类,并根据需要让抽象层委托给旧类或新类。
  4. 删除旧的实现。
  5. 冲洗并重复前两个步骤,如果需要,同时运送您的系统。
  6. 一旦旧实现被完全替换,您可以根据需要移除抽象层。

Martin Fowler 指出这些步骤的变化是可能的:
“在最简单的情况下,您构建整个抽象层,重构所有内容以使用它,构建新的实现,然后轻按开关。但是有多种方法可以分解它。您可能不会构建整个抽象层,只是功能的一个子集,迁移它然后再做一大堆功能(提供新旧可以共存。)否则您可能会将一些调用代码转移到抽象上并实现两者在你移动其余部分之前的方法。”