Условная компиляция и ветвление кода - PullRequest
1 голос
/ 19 июня 2009

У нас есть проект, который необходимо построить как для .Net 1.1, так и для 2.0 из-за проблем совместимости серверов (рабочие серверы Windows Server 2000 и Windows Server 2003). Я ищу помощь в принятии решения между условной компиляцией или переходом кода в системе контроля версий. Есть плюсы и минусы для каждого. Заранее спасибо.

Ответы [ 6 ]

9 голосов
/ 19 июня 2009

Одна вещь, которая повлияет на мое решение, это знание того, как долго я ожидал, что решение 1.1 выживет и какова его цель. Если бы решение находилось в режиме обслуживания и не добавляло слишком много новых функций, я бы выбрал отдельное решение для филиала. Затем я бы тщательно перенес необходимые изменения между двумя ветвями.

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

5 голосов
/ 19 июня 2009

У вас есть несколько вариантов:

  • Запишите наименьший общий знаменатель, т.е. 1.1. Это должно нормально работать на .NET 2.0
  • Создайте устаревшую ветку в SVN / CVS для 1.1 и поддерживайте ее отдельно.
  • Использовать условную компиляцию
  • Изолировать функциональность, характерную для каждой версии, в отдельных сборках и поставлять соответствующую сборку с каждой версией
  • Серьезно рассмотрите возможность обновления серверов до последней версии. Ранее я занимал эту должность, и я провел анализ затрат и выгод для руководства и показал, что создание двойных версий обходится дороже, чем обновление.
2 голосов
/ 19 июня 2009

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

1 голос
/ 19 июня 2009

Условная компиляция только доставит вам неприятности. Условная компиляция засоряет ваш код макросами #IFDEF. Он подсказывает программисту форсировать абстракции там, где их нет. Скажем, вы хотели создать универсальный класс, а теперь вы хотите сделать его совместимым с .NET 1, чтобы у вас были ifdef для всех операций приведения. Пуля, которую нужно укусить, - это исправление проблем в двух ветках, если они возникнут, надеюсь, вы не напишите слишком много ошибок:)

Ветвление позволяет вам использовать совместно используемые текстовые файлы программы .CS из двух разных решений, ориентированных на разные платформы, в случае, если нет разницы между .NET 1 и 2.

0 голосов
/ 19 июня 2009

Ветвление обычно является кошмаром (дублирование усилий и проблемы слияния имеются в большом количестве). ИМХО, его следует использовать только для тупиковой ветви, которую вы никогда не планируете синхронизировать с основной веткой (т. Е. Вы не собираетесь вносить много изменений в старую ветку, возможно, только самые важные исправления ошибок из основной филиал).

Условная компиляция позволяет вам видеть различия "бок о бок" в коде, и сразу становится очевидно, что когда вы начинаете что-то менять внутри #if, вам также необходимо учитывать раздел #else.

0 голосов
/ 19 июня 2009

Обязательно используйте условную компиляцию поверх ветвления (и выделите ее как можно лучше в конкретные модули).

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

Я предпочитаю использовать абстрактный базовый класс (ABC), который определяет интерфейс и производные классы, специфичные для платформы, в сочетании с фабричным объектом / методом и условной компиляцией всего файла, чтобы обойти эти вопросы (у меня есть Библиотека GUI, которая работает на Win32 и X11, реализована таким образом).

Бесплатное ветвление никогда не бывает хорошим!

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