Мы приближаемся к концу длинного проекта по переносу и удалению 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.Это хорошо.Это предотвращает наводнение рынка экспертами по РАО.