代码之家  ›  专栏  ›  技术社区  ›  MatteS

以最简单、最快的方式从类中分离出所有依赖项

  •  11
  • MatteS  · 技术社区  · 15 年前

    在大多数情况下,静态调用要么通过包装静态依赖项来处理,要么如果它是StaticClass.Current.MethodCall()形式的单例模式(或类似模式),则通过其接口将该依赖项传递给构造函数。

    在大多数情况下,在构造函数中使用new关键字只是通过在构造函数中传递该接口来代替。

    在大多数情况下,在类的其他部分中使用new关键字,可以通过与上面相同的方法处理,也可以根据需要创建工厂,并在构造函数中传递工厂的接口。

    在我看来,所有这些步骤对许多开发人员来说都很常见,也是一个常见的问题,在我尝试将插件编写到Resharper或codelush之前,我必须问一下,因为可能有人已经尝试过了。。

    反思一下下面的答案:即使你可能不想一次分解所有的东西(一次单击“完全分解”可能会导致更多的问题,但仍然能够简单地分解出1个方法依赖项,或者1-2个依赖项,这将是很大的区别。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Steven    14 年前

    我不认为有任何工具可以为您实现自动化。使用遗留代码意味着——正如您所知——一次只需几步就可以更改代码。为了防止出错,这些步骤通常是故意的小。通常,您应该做的第一个更改是使代码可测试的更改。在编写测试之后,您可以修改代码的这一部分,从而修复bug或实现RFC。

    因为你应该采取一些小的步骤,我相信很难使用一个重构工具来神奇地让你所有的依赖性消失。对于遗留系统,您几乎不想立即进行大的更改,因为中断的风险太大(由于缺乏测试而无法发现)。然而,这并不意味着重构工具在这种情况下没有用处。相反地;他们帮了很多忙。

    如果你还没有,我建议你读迈克尔·费瑟的书 Working Effectively with Legacy Code

    祝你好运。

        2
  •  1
  •   Dan Bryant    15 年前

    当涉及到静态调用依赖项时,您可能需要签出 Moles . 它能够在运行时进行代码注入,用您自己的测试实现剔除任何静态或非虚拟方法调用。这对于测试不是使用可测试的依赖注入接口设计的遗留代码非常方便。