Замените RogueWave на стандартную библиотеку, написав оболочку - PullRequest
0 голосов
/ 11 декабря 2018

Со ссылкой на этот пост

Как мне абстрагироваться от использования 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 напрямую или все через оболочку?Мысли, пожалуйста.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Мы приближаемся к концу длинного проекта по переносу и удалению RW в устаревшем коде.Я буду использовать RWOrdered в качестве примера, заменив его на OOrdered.

Если у вас есть код с RW, это, вероятно, устаревший код.Если вы обнаружите, что удаление RW не является тривиальным, оно, вероятно, большое.Вы, вероятно, больше не понимаете все детали его дизайна.Изменение того, как это работает, может вызвать много проблем.Следует избегать любых различий в интерфейсе или поведении между RWOrdered и OOrdered.

Если вы замените RW чем-то похожим на RW, вы избавитесь от лицензионных сборов, станете владельцем всего своего кода, сможете выполнять 64-битные сборки и т. Д. Но вы не получите ничего лучше, чем RW.Вы, вероятно, не хотите использовать его в качестве основы для всех будущих контейнеров.

RW был кодексом мирового класса в свое время.Вы заменяете его домашним программным обеспечением, даже если вы упаковываете стандартные контейнеры мирового класса.Иногда классы std работают иначе, чем классы RW.Вам придется решать проблемы, которые были решены RW.Вы также найдете, что библиотека std решает проблемы, которые RW не делал.

  • Шаблонные контейнеры C ++ строго типизированы.Контейнеры RW могут содержать все, что наследуется от RWCollectable.То есть вы можете смешивать типы.Делать OOrdered шаблонный класс может не то, что вам нужно.

  • Стандартные классы проводят четкое различие между эквивалентностью и равенством.Алгоритм find () использует равенство operator == () для поиска элемента.set <> сортируется, как правило, оператором <().Когда set :: insert (a) использует эквивалентность, основанную на этом операторе, чтобы определить, есть ли элемент уже в наборе.Он ищет элемент b, где a <b и b <a оба являются ложными.</p>

В RW RWCollectable определяет isEqual (), compareTo () и hash ().То есть эквивалентность и равенство доступны для всех коллекций.Иногда RW смешивает равенство и эквивалентность, особенно когда коллекции вложены.

Вам необходимо знать, какая функция RW делает, а также какая сущность библиотеки std делает.Вы должны выбрать точное соответствие поведения RW или то, как вы хотите отличаться.

  • Эти примеры легко решаются, но некоторые сложнее.Сериализация была для нас болезненной точкой.Мы хотели использовать сериализацию boost для замены SaveGuts () и RestoreGuts ().У нас есть вложенные контейнеры, где иногда внутренний контейнер выделяется другой DLL, чем внешний контейнер.Это ломает толчок.Обходы существуют, но они не тривиальны.

Сделайте это пошагово.

  • Записать OCollectable, который оборачивает RWCollectable.

  • Напишите тип, который наследуется от OCollectable, например OWidget.RW определяет макросы, которые реализуют некоторые базовые функции, такие как isA ().Используйте макросы.

  • Write OOrdered, который переносит RWOrdered.

  • Замените RWOrderd и Widget в вашем коде.Если они ведут себя точно так же, ваш код все равно будет работать.

  • Развернуть макросы

  • Добавить std :: vector в OOrdered.Переписать OOrdered функции-члены.Оставьте те, которые вы не используете.

  • Переписать функции виджета.

  • Один из способов представить обернутый вектор - добавить функцию getVector ().Typedef для возвращаемого типа поможет.

  • Другим способом является добавление функций, предоставляющих нужные вам векторные функции.

  • Тест, тест, тест


Gotchas

  • Избавиться от некоторых RW не так уж сложно.Избавиться от каждого последнего следа сложнее.Например, ваш OWidget наследуется от OCollectable, который наследуется от RWCollectable.Таким образом, вы можете взять виджет из вашего OOrdered и передать его методу, который принимает RWCollectable.Если вы измените OCollectable так, чтобы он больше не наследовал, вы больше не сможете передавать свой класс OWidget.Вам нужно подождать до конца вашего проекта, чтобы удалить RWCollectable, когда все наследуется от OCollectable.

  • К тому времени, как вы закончите, вы станете экспертом в мертвой библиотеке на умирающем языке.Это может быть лучше для вашей карьеры, чем кажется.Людям, которые сами не хотят копаться, нужны такие специалисты.С другой стороны, вы также много узнаете о каком-то частном унаследованном коде.Вы можете предпочесть карьеру в паровых двигателях.

  • Аналогично, вы будете знакомы с библиотекой std.Эффективный STL устарел, но все еще очень хорошая книга.Нет никакого эквивалента для RW.Это хорошо.Это предотвращает наводнение рынка экспертами по РАО.

0 голосов
/ 11 декабря 2018

Существует ли причина, по которой вы не заменяете RougeWave::stack на std::stack без обертки?

Подход обертки требует работы для поддержания интерфейса между вашей оберткой и классом контейнера.Вам нужно правильно подобрать ссылки на rvalue, но если вы не добавите значительную функциональность (и с std::stack, что кажется маловероятным), вы можете получить от этого ограниченную выгоду.

Я вижу, что у вас есть protected:, возможно, вы используете наследование в своих контейнерах.Это также может быть полезно удалить.

std::stack теперь является частью языка, он будет иметь более длительный срок службы, чем сторонние библиотеки, такие как RogueWave.

...