改变遗留代码的类层次结构

时间:2012-09-27 14:03:58

标签: c++ refactoring

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

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

我们正在创建一个新模块,可以将旧类A或新创建的类B作为“源”。 所以我正在考虑创建一个类A和B将继承的抽象类SourceofX。 “多态”只会被采用SourceofX对象的新类/方法使用。 如果你有比这更好的想法,我都是耳朵

2 个答案:

答案 0 :(得分:2)

更改旧代码时总是存在风险。大多数你无法预见。

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

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

高级别分析只会指出设计问题,但您只会遇到只会出现问题的问题。如果该特定代码有一个所有者,请去问他。然后,再问他一次。给他带来麻烦,不要停下来,直到你找到了什么。

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

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

答案 1 :(得分: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);