2016-03-24 6 views
4

У меня есть программный проект, который работает отлично. Теперь этот проект должен быть скорректирован для моделирования новой, но связанной с ней системы. Какие стратегии должны быть хорошо организованы для этих двух кодов? У них будет кодовая база, которая примерно на 90% одинакова, но есть много функций, которые нуждаются в небольших настройках.Элегантный способ обработки аналогичного кода

Я подумал следующее:

  1. Различные ветви в GIT-репозитории: совершенный контроль над двумя проектами, но общие изменения должны быть сделаны в каждой из ветвей отдельно.
  2. Моделирование различных программных режимов с помощью C++ pragmas (#ifdef Project1 ...): сохраняет локальные изменения, но делает код трудным для чтения.

Я не очень доволен этими решениями. Есть ли лучший подход?

+1

Альтернатива множеству '# ifdef's является швом времени ссылки. У вас есть .cpp, который вы компилируете и ссылаетесь на Windows, и другой, который вы компилируете и ссылаетесь на Linux, например. – Simple

+2

Если различия вписываются в четко определенные области, вы можете рассмотреть возможность определения интерфейса и использования классов, чтобы скрыть детали реализации - это немного похоже на драйверы, но концепция может применяться более широко. – user2867342

+1

Вы думали о перемещении всего распространенного кода в статическую библиотеку. И ваши приложения будут вызывать функции/создавать объекты с параметрами, которые делают разницу. – johngull

ответ

1

У нас такая же проблема, и вот как мы решим его:

  • У нас есть только одна ветвь на нашем мерзавца репо
  • Помимо общих файлов, мы имеем различные файлы в соответствии конфигурации: access_for_config1.cpp, access_for_config2 .cpp, ...
  • Мы используем шаблон проектирования как завод к абстрактной определенной части для общей части
  • для маленьких очень специфических деталей на общие файлы, у нас есть раздел #ifdef согласно конфигурации
  • У нас есть разные правила в нашем make-файле в соответствии с каждой конфигурацией: для конфигурации мы собираем общий файл + определенный файл и устанавливаем правильный флаг. Кроме того, используя eclipse в офисе, мы также определяем другую конфигурацию сборки, чтобы обеспечить правильное выделение.

Преимущество такого подхода заключается в том, чтобы общая часть всегда была синхронной, и мы правильно изолировали каждую конкретную деталь.

Но вы должны быть осторожны с не так много кода из каждой конфигурации. Например, с похожим (но не одинаковым) кодом в разных конкретных файлах, возможная ошибка может быть исправлена ​​только в одной конфигурации. Это может быть уменьшить путем определения некоторого куска кода в качестве общего шаблона или переосмысления дизайна поставить какую-то часть в общих

Надеется, что это ответ поможет вам

1

Каких стратегий существует, чтобы сохранить эти два кода хорошо организованы? Они будут иметь кодовую, что составляет около 90%, то же


Это не то, что вам нужно, но только убедитесь, что вы знаете об этом.

Submodulesпозволяют иностранным хранилищами быть встроены в выделенном подкаталоге дерева источника, всегда указывали на конкретное обязательство.


Различные ветви в GIT-репозитории: совершенный контроль над двумя проектами, но общие изменения должны быть сделаны в каждой из ветвей отдельно.

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

 Смежные вопросы

  • Нет связанных вопросов^_^