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



参考此后

如何从遗留代码中抽象出RogueWave?

新的包装器将在标准库中包装等效的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库还是通过包装器使用所有内容?请思考。

谢谢。

不使用包装器将RougeWave::stack替换为std::stack有什么原因吗?

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

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

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

我们即将结束一个在遗留代码中包装和删除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::insert(a)使用基于此运算符的等价来确定项是否已经在集合中。它查找项目b,其中a<b和b<a都是假的。

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

您需要知道哪个RW函数做什么,以及哪个std库实体做什么。您需要选择与RW行为完全匹配,或者选择不同的方式。

  • 这些例子很容易解决,但有些更难解决。序列化对我们来说是一个痛点。我们想用boost序列化来取代SaveGuts()和RestoreGuts(()。我们有嵌套容器,其中有时内部容器由与外部容器不同的DLL分配。这打破了助推。变通办法是存在的,但它们并非微不足道

循序渐进。

  • Write OCollectable,它封装RWCollectable。

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

  • 编写OOrdered,它封装RWOrdered。

  • 替换代码中的RWOrderd和Widget。如果它们的行为完全相同,那么您的代码仍然可以工作。

  • 展开宏

  • 在OOrdered中添加一个std::vector。重写OOrdered成员函数。放下你不用的。

  • 重写Widget函数。

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

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

  • 测试、测试、测试


Gotchas

  • 摆脱一些RW并不太难。清除最后的痕迹更难。例如,OWidget继承自OCollectable,后者继承自RWCollectable。因此,您可以从OOrdered中取出一个小部件,并将其交给一个使用RWCollectable的方法。如果您更改了OCollectal,使其不再继承,则不能再传入OWidget类。当所有内容都从OCollectable继承时,您必须等到项目结束才能删除RWCollectable。

  • 当你完成这项工作时,你将成为一个正在消亡的语言图书馆的专家。这对你的职业生涯可能比听起来更好。那些不想自己深入研究的人需要这样的专家。另一方面,您还将了解一些专有的遗留代码。你可能更喜欢蒸汽机行业。

  • 同样,您将熟悉std库。有效的STL已经过时了,但仍然是一本非常好的书。RW没有任何等价物。这很好。它避免了市场上充斥着RW专家。

最新更新