2

更改已经在软件中使用了很长时间(10 年以上)并且被广泛使用的类的类层次结构有什么缺点吗?我有一个class A,它不继承任何东西。我想做的是让它继承自一个新的抽象基类,并将其当前方法中的 2 个更改为虚拟方法。我通常会这样做,但我的同事更不情愿,那么这可能会导致什么问题呢?谢谢

编辑:我想这样做的原因:

我们正在创建一个新模块,它可以将旧类 A 或新创建的类 B 作为“源”。所以我正在考虑创建一个抽象类 SourceofX,类 A 和 B 将从中继承。“多态性”只能由采用 SourceofX 对象的新类/方法使用。如果您有比这更好的想法,我会全力以赴

4

2 回答 2

2

更改遗留代码时总是存在风险。其中大部分是你无法预见的。

大多数情况下,原因是其他人完成的“hacky”错误修复并有机地成为软件的一部分。现在它已经稳定了,那些骇人听闻的修复可能会引入一些其他错误,并导致其他一些修复这些错误的骇客修复。该软件已有 10 年历史,因此我保证存在此类修复程序。

即使是对旧代码的最小更改,我个人也会非常谨慎。引入新的继承级别是不小的代码更改。所以,是的,这是非常危险的。

高级分析只会指出设计问题,但您会遇到仅在测试中出现的问题。如果那段特定的代码有所有者,去问问他。然后,再问他一次。打扰他,在你找到什么之前不要停下来。

我的建议是编写单元测试(如果你还没有它们,在这种情况下 - 完美),测试该类的 s&%t,孩子们......好吧,一切。

之后,再编写一些单元测试。多次运行测试。在多个平台上。晚上。在周三。

于 2012-09-27T14:15:23.413 回答
2

如果您真的认为新结构更好,那么我会同意 Luchian Grigore 所说的,但这不是唯一的选择。例如,您可以使用代理:

struct Base {
  virtual void doSomething() = 0;
};

void someFunction(Base &base)
{
  ...
  base.doSomething();
  ...
}

struct NewClass : Base {
  virtual void doSomething();
};

struct OldClassProxy : Base {
  OldClassProxy(OldClass &old) : old(old) { }

  virtual void doSomething()
  {
    old.doSomething();
  }

  OldClass &old;
};

现在您可以将新函数与旧类的实例一起使用,而无需修改旧类:

NewClass a;
OldClass b;
someFunction(a);
OldClassProxy b_proxy(b);
someFunction(b_proxy);

如果有很多地方需要代理,那么你可以编写一个重载:

void someFunction(OldClass &old_class)
{
  OldClassProxy proxy(old_class);
  someFunction(proxy);
}

这将让你这样做:

NewClass a;
OldClass b;
someFunction(a);
someFunction(b);
于 2012-09-27T14:32:09.120 回答