Миграция кода C ++ из конструкций в классы
-
03-10-2019 - |
Вопрос
Я мигрирую несколько C ++ из структур к классам.
Я использовал структуры в основном для оптимизации битовых полей, которые мне больше не нужны (я больше беспокоюсь о скорости, чем экономия пространства).
- Каковы общие руководящие принципы для выполнения этой миграции? Я все еще на этапе планирования, так как это очень большой ход, влияющий на большую часть кода. Я хочу спланировать все первым, прежде чем делать это. Каковы все необходимые вещи, которые я должен помнить?
Решение
Я не могу назвать все Основные вещи, но я могу назвать один: инкапсуляция.
Единственная техническая разница в C ++ между структурой и классом является доступом по умолчанию. В структуре все публично по умолчанию; В классе все частное. Я предполагаю, что вы говорите о структурах стручка здесь, где все публично.
Что я бы сделал, это это:
- Изменить
struct
ключевое слово вclass
и посмотрите, где вызов кода разрывается. Это даст вам подсказку о том, какие части типа используются где. - Из этого определите, какие элементы типа должны быть публичными, которые должны быть частными.
- Вспомогательные функции Accessior для публичных частей и измените требующий код вызова для их использования.
- Переместите код, который нуждается в доступе к частным частям в сам класс.
Другие советы
При обновлении устаревшего кодовой базы из C до C ++, мой опыт существует очень мало значений и совершенно слишком много усилий, участвующих в фактическом риверификации вашего приложения для преобразования структур к традиционным объектам C ++. Потому что не ошибиться, это то, что вы закончите делать. Это не кажется, что это на самом деле, но в конечном итоге вы будете реализовать, вы перепроектируете приложение.
Вы не говорите достаточно о том, что являются вашими целями, поэтому, возможно, это ваша цель, но если вы просто пытаетесь преобразовать в C ++, поэтому новый код в вашем приложении может быть C ++, просто переименуйте файлы, добавить кучу отлитых где неявные преобразования из пустоты * были ранее, и двигаться дальше с вашей жизнью.
Нет значимой разницы между структурами и классами в C ++ (они отличаются только видимостью по умолчанию). Я не удосужился перенести структуры в классы, если только вы также не собираетесь добавить значимое поведение.
Первый, Я присоединяюсь к другим и говорю, что перемещение всего кода из структур к классам, не может быть лучшим ходом. Если бы вы делали это хорошо (то есть больше, чем просто изменение struct X {
с участием class X { public:
) это означает перепроектирование приложения (более или менее полного перезаписи).
Это включает в себя введение новых ошибок, новых циклов разработки, дополнительные тестирования, изменение документации и тд.
Второй, Учитывая, что у вас могут быть достоверные причины для этого (для меня «просто для удовольствия» и «чтобы увидеть, смогу ли я сделать это», могут быть достоверными причинами в некоторых ситуациях: D) Вот мои ответы на ваши вопросы:
1. What are the general guidelines for doing this migration?
2. What are all the essential things I should keep in mind?
Руководящие принципы и вещи, чтобы иметь в виду:
Работа в очень маленьких итерациях, и убедитесь, что приложение функционально между итерациями. Если у вас определены тесты подразделений, вы можете пройти через них проход (выберите одну единицу, перенаправить следующую набор шагов (см. Ниже), а затем адаптируйте и запустите тесты.
Выберите одну область вашего кода и закончите его.
Попробуйте выполнить эти шаги для каждого изменения:
- Анализировать функциональность и редизайн
- Создайте новую реализацию параллельно со старым
- Переключитесь в новую реализацию везде старый используется
- Проверьте, что приложение по-прежнему работает
- Удалить старый код
- Проверьте, что приложение по-прежнему работает
Если вы не делаете это в данный момент, Начните использовать развлекательное программное обеспечение для управления источником. Отказ Ничего менее нерезая это. Я рекомендую Mercurial, но я понимаю Git имеет одинаковые функции. Вы можете поблагодарить меня позже: O).
Выполнить изменения транзакции (Начните с одной области и закончите его, не добавляя изменений из других областей, в то время как изменения в первую очередь на полпути). Если вы используете ветвящий источник-контроль и несколько разработчиков, вы можете получить одно изменение / область на разработчик за раз, затем централизовать изменения.
Преимущества методологии рефакторизации:
Приложение остается функциональным, если вы решили на полпути, что усилия не стоит (или если руководство решает усилия, не стоит того)
Стабильность приложения остается управляемыми путем изменений
Если вы устанавливаете некоторые вехи, это должно быть вполне управляется.
Удачи!