参考此帖子
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库还是通过包装器使用所有内容? 请发表想法。
谢谢。
答案 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行为或您希望如何不同。
逐步进行。
写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专家淹没。