Подтвердить что ты не робот

Использует ли "ветки функций" совместимые с рефакторингом?

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

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

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

Если какой-либо рефакторинг был выполнен, слияние в "ветвях функций" становится намного сложнее, если не невозможно.

Должны ли мы просто отказаться от возможности рефакторинга?

См. также "Как вы справляетесь с напряжением между рефакторингом и необходимостью слияния?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Мне нравится этот провоцирующий тезис ( "отказ от рефакторинга" ), потому что он обогащает дискуссию:)

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

Из-за этого с проблемой refactoring vs. feature-branch существует много компромиссов. Поэтому я принимаю решение в каждом конкретном случае:

  • В ветвях функций я занимаюсь рефакторингом, если они готовят мою функцию, чтобы ее было проще реализовать. Я всегда стараюсь сосредоточиться только на этой функции. Филиалы должны по возможности отличаться от магистрали/магистрали.
  • Принимая это вспять, у меня иногда есть рефакторинг веток, где я делаю больше рефакторинга (возврат нескольких шагов очень прост, и я не отвлекаю своих коллег по магистралям). Конечно, я расскажу своей команде, что я делаю этот рефакторинг и пытаюсь планировать это во время цикла разработки (назовите это спринт, если хотите).
  • Если ваша упомянутая политика - большая вещь, я бы инкапсулировал усилия по рефакторингу внутри страны и добавил ее в оценку. На мой взгляд, клиенты в среднесрочной перспективе будут видеть более быстрый прогресс при улучшении качества кода. Скорее всего, не поймут рефакторинг (что имеет смысл, потому что это выходит за рамки их...), поэтому я скрываю это от них.
  • То, что я никогда не сделаю, - это рефакторинг на ветке релиза, целью которой является стабильность. Разрешены только исправления ошибок.

В качестве резюме я планировал бы мои рефакторинги в зависимости от кодолина:

  • feature-branch: только меньшие (если они "помогают" моей функции)
  • рефакторинг-ветвь: для больших, где цель рефакторинга не совсем понятна (я часто называю их "ребрафилтами" )
  • trunk/mainline: ОК, но мне нужно общаться с разработчиками в ветвях функций, чтобы не создавать кошмар интеграции.
  • релиз-ветка: никогда не

Ответ 3

Рефакторинг и слияние - это две комбинированные темы Пластиковый SCM. На самом деле есть две важные области для фокусировки: один имеет дело (во время слияния) с файлами, которые были перемещены или переименованы в ветку. Хорошая новость заключается в том, что все SCM нового поколения позволят вам сделать это правильно (Plastic, Git, Hg), в то время как старые просто проваливаются (SVN, Perforce и даже более старые).

Другая часть посвящена рефакторизуемому коду внутри одного и того же файла: вы знаете, вы перемещаете свой код, а другой разработчик модифицирует его параллельно. Это сложнейшая проблема, но мы фокусируемся на ней также на новом наборе инструментов merge/diff. Найдите xdiff info здесь и xmerge (скрещивание слияния) здесь. Хорошее обсуждение того, как найти здесь перемещенный код (по сравнению с "вне сравнения" ).

В то время как проблема с "слиянием каталогов" или слиянием структуры является основной (независимо от того, делает она это или нет), вторая проблема больше связана с инструментами (насколько хороши ваши трехсторонние слияния и инструменты для сравнения). У вас может быть Git и Hg бесплатно решить первую проблему (и даже Plastic SCM теперь тоже свободен).

Ответ 4

Отчасти проблема заключается в том, что большинство инструментов объединения слишком глупы, чтобы понимать любой рефакторинг. Простое переименование метода должно быть объединено как переименование метода, а не как редактирование в 101 строку кода. Поэтому, например, дополнительные вызовы метода в ветке afther должны выполняться автоматически.

В настоящее время есть несколько лучших инструментов слияния (например SemanticMerge), которые основаны на разборе языка, предназначенном для обработки кода, который имеет были перемещены и изменены. JetBrains (создание ReShaper) только что разместил blog.

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