什么是去耦合组件的最佳策略

在新公司的旧代码基础上遇到了问题。

基本上,他们有2个大型代码库/项目或组件,我会说组装A和组件B。而且,我们还进行了组装测试A和组装测试B。

我在这里遇到的问题是组装测试A使用来自组装测试B的某些类。组装测试B正在使用Assembly测试A中的某些类。但没有完成,组装测试A使用了Assembly B中的某些类。它确实令人讨厌。 , 我知道。这就是从技术上讲,这就是我们有2个单独的项目,但实际上我们将它们放在一个包中。然后,您可以想象,每次我们部署A时,我们都必须部署B。

我的任务是将这些组件解除或将它们分成2个单独的组件/项目,以便对将来的部署和测试以及其他任何东西都有益。

我遇到了一个缓慢的过程,但它可以确保我们仍然保证了功能。我的最初策略是,我将在测试组件A中慢慢删除组件B的依赖性,并通过测试组件A进行测试。这意味着我正在删除Assembly A中的组装B的依赖。 B,最后我们将有2个完成的单独的组件。

对我来说,我相信这不是一件容易的事,但我不介意为此而努力。但是,我需要您的意见或建议我的最初策略。我不想冒着在这种项目中间重新开始的风险。

那么,你们能给我关于该任务的任何诚实意见或建议吗?

我非常感谢。

谢谢

看答案

老实说,我发现描述有些混乱。因此,我会一点点一点。

基本上,他们有2个大型代码基础/项目或组件,我会说组装A和集会B。

<code>A</code>, <code>B</code>

另外,我们还进行了组装测试A和组装测试B。

我会假设 Test A 取决于 A 和 Test B 取决于 B:

<code>Test A</code> depends on <code>A</code>,<code>Test B</code> depends on <code>B</code>

测试A使用来自组装测试B的某些类

<code>Test A</code> depends on <code>A</code>,<code>Test B</code> depends on <code>B</code>, <code>Test A</code> depends on <code>Test B</code>

测试B正在使用装配测试中的一些类

<code>Test A</code> depends on <code>A</code>,<code>Test B</code> depends on <code>B</code>, <code>Test A</code> depends on <code>Test B</code>, <code>Test B</code> depends on <code>Test A</code>

测试A使用汇编B中的某些类

<code>Test A</code> depends on <code>A</code>,<code>Test B</code> depends on <code>B</code>, <code>Test A</code> depends on <code>Test B</code>, <code>Test B</code> depends on <code>Test A</code>, <code>Test A</code> depends on <code>B</code>


好的,我可以推理该图:

  • A 和 B 是水槽(如果愿意的话,叶子)。从理论上讲,您可以分开部署它们。我猜你部署了 Test A 和 A 和 Test B 和 B 这引起了问题。快速修复:请勿部署测试。
  • 有一个周期: Test A - &gt; Test B - &gt; Test A

最初我对 Test A - &gt; Test B - &gt; BTest A - &gt; B,我正在划清率,这与这种情况无关。


循环依赖性 Test A - &gt; Test B - &gt; Test A 是主要问题。如何解决它是一个经济问题。

我在评论中说,您可以允许代码重复,以后您必须重构。 那只是想到的第一件事。 这样做会增加技术债务,但允许您在更少的时间内对分离进行存档。如果您需要分开项目 马上,我会说你这样做。如果有时间,您可能会更务实。

要修复循环依赖性,您需要了解 Test A 不需要 Test B, 反而 Test A 只需要一个 子集 的 Test B。相似地 Test B 只需要一个 子集 的 Test A.

此外,我们可以说 Test A 和 Test B 需要这个 子集。借钱 布拉德利·乌夫纳的评论 我会打电话 TestCommon.

您可能首先创建一个空 TestCommon 组装,将依赖项添加到两者 Test A 和 Test B 并开始在那里移动代码。最终您将能够从中删除依赖项 Test A 至 Test B 并来自 Test B 至 Test A。在内部有循环依赖性的可能性继续存在 TestCommon (没有详细的依赖图,我无法分辨)。无论如何,提取 TestCommon 将导致代码更容易维护和重复使用。


提取 TestCommon 将导致这一点:

<code>Test A</code> depends on <code>Test B</code>, <code>Test B</code> depends on <code>Test A</code>

为此:

<code>Test A</code> depends on <code>Test B</code>, <code>Test B</code> depends on <code>Test A</code>

完整图:

<code>Test A</code> depends on <code>A</code>, <code>Test B</code> depends on <code>B</code>, <code>Test A</code> depends on <code>B</code>, <code>Test A</code> depends on <code>TestCommon</code>, <code>Test B</code> depends on <code>TestCommon</code>

这是 更好的。现在您可以部署 Test B 和 B (和 TestCommon)没有重大问题。但是,您仍然需要部署 B 和 Test A 因为它直接引用它。

有一个链接来自 Test A 至 B。我会假设有更多细微差别的情况,这就是 Test A 用途 B (我将稍后探索其他案例)。遵循我们提取的相同方法 TestCommon 我们需要介绍另一个集会。我会称呼它 Utility (我不知道那里有什么,只是 Test A 需要它),并可以让您摆脱困境:

<code>Test A</code> depends on <code>B</code>, <code>Test B</code> depends on <code>B</code>

为此:

<code>Test B</code> depend on <code>B</code>, <code>Test B</code> depends on  <code>Utility</code>, <code>Test A</code> depends on <code>Utility</code>, <code>B</code> depends on <code>Utility</code>


在这一点上,我们已经成功地将项目分开了。我们可以在全图中看到可以部署 Test A 和 A 没有 Test B 和 B,反之亦然。

完整图:

<code>Test A</code> depends on <code>A</code>, <code>Test B</code> depends on <code>B</code>, <code>Test B</code> depends on <code>Utility</code>, <code>Test A</code> depends on <code>Utility</code>, <code>B</code> depends on <code>Utility</code>, <code>Test A</code> depends on <code>TestCommon</code>, <code>Test B</code> depends on <code>Test Common</code>

部署一个:

<code>Test A</code> depends on <code>A</code>, <code>Test A</code> depends on <code>Utility</code>, <code>Test A</code> depends on <code>TestCommon</code>

部署b:

<code>Test B</code> depends on <code>B</code>, <code>Test B</code> depends on <code>Utility</code>, <code>B</code> depends on <code>Utility</code>, <code>Test B</code> depends on <code>TestCommon</code>


什么是 Utility?

记住这一点 Utility 最初是 B。这是 B 我们需要做 Test A 工作。尽管我对 Utility。但是,我知道我不知道的...

答:我不知道是否 Test A 使用或测试 Utility,我认为它使用它。

B.我不知道是否 Test B 使用或测试 Utility

C.我不知道是否 B 是否需要 Utility

让我们探索可能的情况:

  1. Test A 用途 UtilityTest B 用途 UtilityB 需要 Utility

    Utility 必须是每个人都用来使事情变得更轻松的一些适用性代码。缺陷 Utility 在两个项目中都将是一个缺陷。在新的 Test Utility.

  2. Test A 用途 UtilityTest B 用途 UtilityB 不需要 Utility

    Utility 仅需要测试。将其合并成 TestCommon.

  3. Test A 用途 UtilityTest B 测试 UtilityB 需要 Utility

    这是所有案件的细微差别...

    B 和 Test A 仍然都需要此代码...此代码为两个主人服务 Test A 和 B。这没错。您可以保持原样。

    将来有一种风险,您可能想引入更改 Utility 对于其中一个项目,但这种变化在另一个项目中引入了一个错误。

    现在的测试 Utility 在 Test B,人们从事的人 A 可能不必担心。因此分开 Test Utility 从 Test B 是个好主意。

    如果将来, Test A 和 B 不同的是,他们需要两种不同的解决方案(在这一点上,您可以将它们合并到各自的项目中)。

  4. Test A 用途 UtilityTest B 测试 UtilityB 不需要 Utility

    删除依赖性 B 有 Utility 并将测试分开 Utility 从 Test B 进入新 Test Utility.

  5. Test A 测试UtilityTest B 用途 UtilityB 需要 Utility

    Test A 不应从中测试代码 B。将该代码迁移到 Test B 并从中删除依赖关系 Test A 至 Utility。您现在可以合并 Utility 回到 B.

  6. Test A 测试 UtilityTest B 用途 UtilityB 不需要 Utility

    删除依赖性 B 有 Utility 并将测试分开 Utility 从 Test A 进入新 Test Utility.

  7. Test A 测试 UtilityTest B 测试UtilityB 需要 Utility

    测试 Utility 分为两分。提取它们并将它们放入新的 Test Utility.

  8. Test A 测试 UtilityTest B 测试 UtilityB 不需要 Utility

    Utility 不使用。您可以将其及其测试删除。

未经允许不得转载:迪欧吧_技术交流_资源分享_热点资讯_免费VPS空间 » 什么是去耦合组件的最佳策略