通过编写包装器,将RogueWave替换为标准库

时间:2018-12-11 05:15:04

标签: c++ stl std

参考此帖子

How do I abstract away from using RogueWave in legacy code?

新包装器将在标准库周围包装等效的RogueWave方法。像-

template<class T, class Container = std::deque<T> >
class my_stack
{
public:
    void push(const T& t)
    {
        m_stack.push(t);
    }
    // ... so on ...

protected:
    std::stack<T, Container> m_stack;
};

我们如何公开RogueWave中不存在的标准库方法。

包装程序是否是RogueWave :: stack和std :: stack方法的并集?还是我们公开底层的std :: stack对象供客户端直接调用std :: stack方法?客户端是直接使用std库还是通过包装器使用所有内容? 请发表想法。

谢谢。

2 个答案:

答案 0 :(得分:1)

有没有理由在没有包装的情况下不将RougeWave::stack替换为std::stack吗?

包装器方法需要维护包装器和容器类之间的接口。您需要正确处理右值引用之类的东西,但是除非您要添加重要的功能(并且使用std::stack似乎不太可能),否则从中获得的好处是有限的。

我看到您有protected:,所以可能是您在容器上使用继承。这也可能是一件好事。

std::stack现在是该语言的一部分,它的寿命比RogueWave这样的第三方库更长。

答案 1 :(得分:0)

我们即将结束一个较长的项目,以用旧代码包装和删除RW。我将以RWOrdered为例,将其替换为OOrdered。

如果您的代码中包含RW,则可能是遗留代码。如果您发现删除RW并非易事,则可能很大。您可能不再了解其设计的所有细节。更改其工作方式可能会造成很多麻烦。应避免RWOrdered和OOrdered之间的任何接口或行为差异。

如果用RW之类的东西替换RW,您将免去许可费,拥有所有代码,可以执行64位构建等。但是您所得到的任何东西都不会比RW好。您可能不希望将其用作将来所有容器的基础。

RW在当时是世界一流的代码。您将用家用软件替换它,即使您包装了世界一流的std容器也是如此。有时,std类的工作方式与RW类不同。您将必须解决RW已解决的问题。您还会发现std库解决了RW未解决的问题。

  • C ++模板容器是强类型的。 RW容器可以包含从RWCollectable继承的任何内容。也就是说,您可以混合使用类型。使OOrdered成为模板类可能不是您想要的。

  • std类在对等和对等之间进行了明确区分。 find()算法使用等于运算符==()来查找项目。 set <>通常由operator <()进行排序。设置时:: insert(a)使用基于此运算符的等价性来确定某项是否已在集合中。它查找a

在RW中,RWCollectable定义了isEqual(),compareTo()和hash()。也就是说,所有集合都可以使用等价和平等。有时,RW混合了平等和对等,特别是在嵌套嵌套的情况下。

您需要知道哪个RW函数做什么,以及哪个std库实体做什么。您需要选择完全匹配RW行为或您希望如何不同。

  • 这些示例很容易解决,但有些困难。序列化是我们的痛点。我们想使用增强序列化来替换SaveGuts()和RestoreGuts()。我们有嵌套容器,有时内部容器是由与外部容器不同的DLL分配的。这打破了提振。存在变通办法,但并非不重要。

逐步进行。

  • 写OCollectable,包装RWCollectable。

  • 写一个从OCollectable继承的类型,例如OWidget。 RW定义了实现某些基本功能(例如isA())的宏。使用宏。

  • 写OOrdered,包装RWOrdered。

  • 在代码中替换RWOrdered和Widget。如果它们的行为完全相同,则您的代码仍将起作用。

  • 展开宏

  • 将std :: vector添加到OOrdered。重写OOrdered成员函数。删除不使用的内容。

  • 重写小部件功能。

  • 公开包装的矢量的一种方法是添加getVector()函数。返回类型的typedef会有所帮助。

  • 另一种方法是添加函数以公开所需的矢量函数。

  • 测试,测试,测试


陷阱

  • 摆脱一些RW并不难。摆脱最后的痕迹更加困难。例如,您的OWidget从OCollectable继承,而OCollectable从RWCollectable继承。因此,您可以从OOrdered中取出小部件,然后将其传递给采用RWCollectable的方法。如果更改OCollectable使其不再继承,则不能再传递OWidget类。当一切都从OCollectable继承时,您必须等到项目结束才能删除RWCollectable。

  • 到完成时,您将以垂死的语言成为死图书馆中的专家。这听起来可能比您的职业生涯更好。不想自己研究的人需要这样的专家。另一方面,您还将了解一些专有的旧版代码。您可能更喜欢蒸汽机行业。

  • 同样,您将熟悉std库。有效的STL已过时,但仍然是一本好书。 RW没有任何等效项。很好它可以防止市场被RW专家淹没。