Pytanie Czy korzystanie z "gałęzi funkcjonalnych" jest kompatybilne z refaktoryzacją?


"gałęzie funkcji"  jest, gdy każda funkcja jest rozwijana we własnym oddziale i scalana z główną linią dopiero po przetestowaniu i jest gotowa do wysyłki. Pozwala to właścicielowi produktu wybrać funkcje, które trafiają do danej przesyłki, oraz funkcję "parkowania", która jest zapisana częściowo, jeśli pojawi się ważniejsza praca (np. Klient dzwoni do MD, aby złożyć skargę).

"refaktoryzacja" przekształca kod, aby ulepszyć jego projekt, aby obniżyć koszty zmiany. Nie robiąc tego ciągle masz tendencję do brzydszej bazy kodu, która jest trudniejsza do napisania testów.

W prawdziwym życiu zawsze byli klienci sprzedany nowe funkcje i ze względu na politykę wszyscy klienci muszą zobaczyć, że postępy są dokonywane na "ich" grupie funkcji. Tak więc bardzo rzadko zdarza się, że czas spędzony jest bez gałęzi, na których nie ma zbyt wielu niedokończonych elementów.

Jeśli dokonano jakiegokolwiek refaktoryzacji, połączenie w "oddziałach funkcjonalnych" staje się o wiele trudniejsze, jeśli nie niemożliwe.

Czy musimy po prostu zrezygnować z możliwości refaktoryzacji?

Zobacz też "Jak radzisz sobie z napięciami pomiędzy refaktoryzacją a koniecznością łączenia? "


21
2017-10-28 15:24


pochodzenie




Odpowiedzi:


Oddziały funkcji z pewnością znacznie utrudniają refaktoryzację. Ułatwiają one także ciągłą integrację i wdrażanie, ponieważ zwiększasz liczbę równoległych strumieni programistycznych, które należy zbudować i przetestowano. Eliminujesz także zasadę "ciągłej integracji" - wszyscy pracują nad tym samym kodem i "ciągle" integrują swoje zmiany z resztą zmian w zespole. Zwykle, gdy gałęzie funkcji są używane, gałąź funkcji nie jest ciągle budowana ani testowana, więc za pierwszym razem kod "gałęzi funkcyjnej" przechodzi przez proces budowania / testowania / wdrażania procesu produkcyjnego, kiedy jest "gotowy" i scalony do bagażnika. Może to wprowadzić wiele problemów na późnym i krytycznym etapie procesu rozwoju.

Mam kontrowersyjną opinię, że powinieneś unikać gałęzi funkcji przy (prawie) wszystkich kosztach. Koszt połączenia jest bardzo wysoki i (co być może ważniejsze) koszt alternatywny polegający na braku "ciągłej integracji" we wspólnej bazie kodów jest jeszcze wyższy.

Czy w twoim scenariuszu potrzebujesz oddzielnej gałęzi funkcji dla funkcji każdego klienta? Czy możesz zamiast tego rozwinąć te funkcje w bagażniku, ale pozostawić je wyłączone, aż będą gotowe ?. Ogólnie rzecz biorąc, myślę, że lepiej jest rozwijać "cechy" w ten sposób - sprawdź je w bagażniku, nawet jeśli nie są gotowe do produkcji, ale pozostaw je poza aplikacją, dopóki nie będą gotowe. Ta praktyka zachęca również do dbania o to, aby twoje komponenty były dobrze rozplanowane i chronione za dobrze zaprojektowanymi interfejsami. Podejście oparte na "gałęzi funkcji" daje wymówkę, by dokonać szerokich zmian w bazie kodu w celu zaimplementowania nowej funkcji.


12
2017-10-29 18:36



Panjandrum XP jest nieugięte w związku z posiadaniem tylko jednej kodeka. Nie jestem pewien, jak to możliwe, aby zdać sobie z tego sprawę w praktyce (myślę, że może ci się przydać bagażnik plus dział konserwacyjny dla każdego obsługiwanego wydania, co oznacza co najmniej dwie linki codelines), ale z pewnością zgadzają się z tobą. - Tom Anderson
Zdecydowanie jestem zwolenniczką oddziałów konserwacyjnych (mam tendencję do nazywania ich "gałęziami uwalniania"). Sądzę też, że istnieją pewne scenariusze, w których można uzasadnić gałąź funkcji. Przede wszystkim jestem przeciwnikiem "zawsze twórz gałęzie fabularne, aby menadżerowie mogli decydować o tym, które funkcje zostaną użyte w konkretnym wydaniu", ponieważ zbyt wiele fragmentów kodu kodują. Zaufaj mi, nie jestem fanboyem XP, ale myślę, że zasady kryjące się za pragnieniem posiadania jednej linii kodu są zdrowe. - Stuart Lange
Myślę, że zależy to również od narzędzi, od gałęzi i reintegracji to wysokie koszty. Subversion jest nieco denerwujący, podczas gdy git rozwiązuje go bardzo ładnie (branch / merge to core concept, niezwykle szybko). Kluczowe pytanie dotyczące rozgałęziania brzmi: "Czy potrzebuję izolacji, ile będą koszty reintegracji?". Myślę, że obie skrajności ("nigdy nie rozgałęziają się", "zawsze rozgałęziają się na każdą drobną zmianę") są złe. To naprawdę zależy ... - manuel aldana
Całkowicie nie zgadzam się z twoim "odważnym" stwierdzeniem. Domyślam się, że jesteś ograniczony jakoś przez twój zestaw narzędzi. Wypróbuj Git lub Mercurial lub Plastic SCM, a przekonasz się, że refaktoryzacja nie jest już tak trudna codicesoftware.blogspot.com/2010/08/... - pablo
Masz zdecydowanie rację, że łączenie jest nieco łatwiejsze w niektórych narzędziach (git, mercurial, accurev) niż w innych (svn). Jednak nawet jeśli łączenie było trywialnie łatwe (co nigdy nie będzie możliwe), nadal utrzymujesz równoległe linie kodu, dopóki nie nastąpi "duże scalenie". Z tym wiąże się koszt - twój zespół nie dzieli się i nie integruje tak szybko, jak gdyby działał na jednej linii kodu. Oddziały cech fundamentalnie łamią zasadę "ciągłej integracji", która ma wiele udowodnionych korzyści. - Stuart Lange


Podoba mi się ta prowokująca teza ("rezygnacja z refaktoryzacji"), bo wzbogaca dyskusję :)

Zgadzam się, że trzeba być bardzo ostrożnym przy większym refaktoryzacji, gdy ma się dużo równoległych kodów, ponieważ konflikty mogą znacznie zwiększyć integrację, a nawet powodować błędy regresji podczas łączenia.

Z tego powodu, z refaktoryzacją vs. problemem z gałęziami funkcyjnymi, istnieje wiele kompromisów. W związku z tym decyduję indywidualnie dla każdego przypadku:

  • W gałęziach obiektów dokonuję refaktoryzacji tylko wtedy, gdy moja funkcja jest łatwiejsza do wdrożenia. Zawsze staram się skupiać tylko na tej funkcji. Oddziały powinny różnić się od pnia / linii głównej co najmniej jak to możliwe.
  • Odwracając się, czasami mam nawet odnawianie refrakcji, gdzie robię większe refaktoryzacje (cofanie wielu kroków jest bardzo łatwe i nie rozpraszam moich kolegów z bagażnika). Oczywiście powiem swojemu zespołowi, że robię to refaktoryzując i staram się planować to zrobić podczas cyklu oczyszczania środowiska (nazwij to sprintem, jeśli chcesz).
  • Jeśli twoja wspominana polityka to wielka rzecz, to chciałbym wewnętrznie zamknąć wysiłki refaktoryzacji i dodać ją do oceny. Moim zdaniem klienci w średnim okresie będą widzieli szybszy postęp, jeśli mają lepszą jakość kodu. Najprawdopodobniej nie zrozumieją refaktoryzacji (co ma sens, ponieważ jest to poza ich zasięgiem ...), więc ukrywam to przed nimi
  • To, czego nigdy bym nie zrobił, to refaktoryzacja na oddziale prasowym, którego celem jest stabilność. Dozwolone są tylko poprawki błędów.

Jako podsumowanie planowałbym moje refaktoryzacje w zależności od kodeksu:

  • feature-branch: tylko mniejsze (jeśli "pomagają" mojej funkcji)
  • refaktoryzacja: dla większych, gdzie cel refaktoryzacji nie jest całkiem klarowny (często nazywam je "refarsingami")
  • trunk / mainline: OK, ale muszę komunikować się z programistami w gałęziach obiektów, aby nie stworzyć koszmaru integracji.
  • release-branch: nigdy

10
2017-10-29 18:21





Refaktoryzacja i łączenie to dwa połączone tematy Plastikowy SCM skupiony na. W rzeczywistości istnieją dwa ważne obszary, na których należy się skupić: jeden zajmuje się (podczas łączenia) z plikami, które zostały przeniesione lub zmieniono nazwę w oddziale. Dobrą wiadomością jest to, że wszystkie moduły SCM "nowej epoki" pozwolą ci zrobić to poprawnie (Plastic, Git, Hg), podczas gdy stare po prostu zawodzą (SVN, Perforce i jeszcze starsi).

Druga część dotyczy zreinstalowanego kodu w tym samym pliku: wiesz, przenosisz kod, a inny programista modyfikuje go równolegle. Jest to trudniejszy problem, ale skupiamy się również na nim za pomocą nowego zestawu narzędzi do scalania / porównywania. Znaleźć Informacje o xdiff tutaj i xmerge (łączenie krzyżowe) tutaj. Dobra dyskusja o tym, jak to zrobić znajdź przeniesiony kod tutaj (w porównaniu do "nieporównywalnej").

Podczas gdy "łączenie katalogów" lub łączenie struktur jest kwestią kluczową (niezależnie od tego, czy system to robi, czy nie), drugie jest bardziej problemem narzędziowym (jak dobre są twoje trójstronne narzędzia scalania i różnicowania). Możesz mieć Git i Hg za darmo, aby rozwiązać pierwszy problem (a nawet plastikowe SCM jest teraz za darmo).


5
2017-10-30 16:09



Czy narzędzia do scalania plastiku działają na drzewie analizy zamiast zwykłego tekstu? Jeśli tak, które języki są obsługiwane? - Ian Ringrose
Bieżące xmerge / xdiff bazują na wyszukiwaniu podobnych wzorów na tekście, dzięki czemu są niezależne od języka. Na marginesie mogę powiedzieć, że wkrótce rozpocznie się parsowanie (C #, Java, a następnie C i później C ++). - pablo


Częścią problemu jest to, że większość narzędzi scalania jest po prostu zbyt głupi, aby zrozumieć jakiekolwiek refaktoryzacje. Prosta zmiana nazwy metody powinna zostać scalona jako zmiana nazwy metody, a nie jako edycja 101 linii kodu. Dlatego na przykład dodatkowe wywołania metody w innej gałęzi powinny być automatycznie rozwiązywane.

Istnieją teraz lepsze narzędzia do scalania (na przykład SemanticMerge), które są oparte na analizie języka, zaprojektowanej do radzenia sobie z kodem, który został przeniesiony i zmodyfikowany. JetBrains (the create of ReShaper) właśnie opublikował blog na to.

Było dużo Badania na przestrzeni ostatnich lat niektóre produkty trafiają na rynek.


1
2017-07-16 09:05