接口继承以拆分god对象

本文关键字:god 对象 拆分 继承 接口 | 更新日期: 2023-09-27 17:58:16

我在一个相当大的产品上工作。自从.Net 1.0还在开发中以来,它就一直在开发中,所以它有很多质量不好的代码,而且编写时没有考虑到单元测试。现在,我们正在努力提高质量,并为每个功能和错误修复实现测试。我们现在面临的最大问题之一是对地狱和上帝对象的依赖。有一个特别糟糕的神对象:Session。基本上,与程序当前会话相关的任何内容都在该对象中。还有其他一些神的物品。

无论如何,我们已经通过使用Resharper从中提取接口,使这个神对象"可模拟"。然而,这仍然使测试变得困难,因为大多数时候你必须查看你编写的代码,才能从100种不同的方法和特性中找出真正需要模拟的东西。

现在,仅仅拆分这个类是不可能的,因为实际上有数百甚至数千个对这个类的引用。

因为我有一个接口(几乎所有的代码都经过了重构以使用该接口),所以我有了一个有趣的想法。如果我让ISession接口从其他接口继承呢。

例如,如果我们有这样的东西:

interface IBar
{
  string Baz{get;set;}
}
interface IFoo
{
  string Biz{get;set;}
}
interface ISession: IFoo, IBar
{
}

这样,使用ISession的现有代码就不必更新,实际实现也不必更新。但是,在我们编写和重构的新代码中,我们可以使用更细粒度的IFoo或IBar接口,但可以传入ISession。

最终,我认为这可能会使最终分解实际的ISession和Session god接口/对象变得更容易

现在给你。这是一个测试这些神物并最终将其分解的好方法吗?这是一种记录在案的方法和/或设计模式吗?你做过这样的事吗?

接口继承以拆分god对象

从我的角度来看,这是一个好的、正确的方法。稍后,您可以将更具体的服务实例注入为IFoo/IBar,而不是ISession,我认为这是在进一步重构之前的一个很好的中间步骤,可以将类从一个god类提取到许多特定的服务。

我看到的一些专业人士:

第一阶段:提取接口

  • 超级(god)类类型由接口抽象
  • 由于依赖于负责单个功能的接口(服务),代码变得不那么耦合
  • 你有进一步的空间,在不进行大规模重构的情况下将一个god类拆分为许多服务,因为一切都依赖于接口API

第二阶段:将一个神类拆分为许多小服务,牢记单一责任原则

第三阶段:结构化现有的单元测试,使测试按服务类型分组,而不是全部围绕一个神类