Refaktoryzacja w projektowaniu opartym na domenie [zamknięte]

10

Właśnie zacząłem pracować nad projektem i używamy projektowania opartego na domenach (zgodnie z definicją Erica Evansa w opracowaniu opartym na domenach: rozwiązywanie problemów w sercu oprogramowania . Wierzę, że nasz projekt jest z pewnością kandydatem do tego projektu wzór, jak opisuje to Evans w swojej książce.

Walczę z pomysłem ciągłego refaktoryzacji.

Wiem, że refaktoryzacja jest koniecznością w każdym projekcie i nastąpi nieuchronnie wraz ze zmianami oprogramowania. Jednak z mojego doświadczenia wynika, że ​​refaktoryzacja zachodzi, gdy zmieniają się potrzeby zespołu programistów, a nie rozumienie zmian w domenie („refaktoryzacja do lepszego wglądu”, jak to nazywa Evans). Najbardziej martwię się przełomami w zrozumieniu modelu domeny. Rozumiem, że wprowadzam małe zmiany, ale co, jeśli konieczna jest duża zmiana w modelu?

Jaki jest skuteczny sposób przekonania siebie (i innych), że powinieneś refaktoryzować po uzyskaniu wyraźniejszego modelu domeny? W końcu refaktoryzacja w celu poprawy organizacji kodu lub wydajności może być całkowicie oddzielna od ekspresji pod względem wszechobecnego kodu języka. Czasami wydaje się, że po prostu nie ma czasu na refaktoryzację.

Na szczęście SCRUM nadaje się do refaktoryzacji. Iteracyjna natura SCRUM ułatwia zbudowanie małego elementu i jego zmianę. Ale z czasem ten kawałek będzie się powiększał, a co, jeśli dojdziecie do przełomu, gdy ten kawałek jest tak duży, że zmiana go będzie zbyt trudna?

Czy ktoś pracował nad projektem opartym na domenie? Jeśli tak, dobrze byłoby uzyskać wgląd w ten temat. Szczególnie chciałbym usłyszeć historie sukcesu, ponieważ DDD wydaje się bardzo trudne do zrobienia.

Dzięki!

Andrew Whitaker
źródło
Jeśli piszesz kod, który według ciebie nie będzie w stanie zmienić bez względu na rozmiar, przestań.
JeffO,
@Jeff: Nie chodzi o to, że nie możemy go zmienić, to kwestia czasu i zasobów potrzebnych do jego zmiany, w miarę dodawania kodu.
Andrew Whitaker,
2
Jeśli dodajesz kod, wiedząc, że istniejący kod wymaga refaktoryzacji, a nie robisz tego, ryzykujesz. To nie znaczy, że to nie zadziała.
JeffO,

Odpowiedzi:

9

Od dłuższego czasu jestem wielkim fanem DDD (z siatką testową i bez niej).

Cała koncepcja i cykl życia refaktoryzacji nie zmienia się, ponieważ teraz używasz nowej metodologii projektowania. Jeśli zajmie to dużo czasu, musi on czerpać proporcjonalne korzyści z projektu, aby uzyskać ten czas od zarządzania.

W odniesieniu do robienia tego: w jednym przypadku uczestniczyłem w 3- miesięcznym dużym refaktoryzacji z powodu „przełomu” w zrozumieniu modelu domeny. Wymagało to testów weryfikujących bieżące zachowanie, testów weryfikujących oczekiwane zachowanie i zmian w kodzie wywołującym. Korzyści były jednak znaczące i pozwoliły firmie zrobić o wiele więcej rzeczy, które trzeba było zrobić wcześniej, ale po prostu nie była w stanie. Zasadniczo refaktoryzacja była zasadniczo „cechą”.

Steven Evers
źródło
Cieszę się, że udało ci się stworzyć tak duży refaktor. Dobrze też słyszeć, że na początku musiałeś dokonać tak dużej zmiany. To jest rodzaj refaktora, o którym mówię. Miesiące długo z wielkim wpływem.
Andrew Whitaker,
Refaktoryzacja jako funkcja to ta, którą zapamiętam.
Filip Dupanović
5

Myślę, że refaktoryzacja w projektowaniu opartym na domenach wynika z potrzeby, a nie z „miłego” refaktora. Gdy tylko zidentyfikujesz niepoprawny model domeny, kod / system nie reprezentuje rzeczywistego problemu.

W tym przypadku niedawno pracowaliśmy nad zastosowaniem uzasadnionej złożoności domen. Był to system rozliczeń / umów i wprowadziliśmy nowy rodzaj stawki. Stosowaliśmy zwinny proces, a dokładniej 2-tygodniowe młyny.

Początkowo zidentyfikowaliśmy w modelu, że 2 stawki były całkowicie osobne i nie miały związku, z wyjątkiem umowy. Jednak po ukończeniu kolejnych opowieści doszliśmy do wniosku, że w rzeczywistości były takie same, zwłaszcza gdy zaczęliśmy owijać nową stawkę jako starą tylko po to, aby działała. To był pierwszy znak ostrzegawczy.

Krótko mówiąc, udało nam się wykonać 90% historii przy użyciu niewłaściwego modelu, ale doszliśmy do momentu, w którym w każdej części kodu albo pakowaliśmy nową stawkę jako starą, i / lub tworzenie jeśli newRate else oldRate KAŻDY gdzie. Waliliśmy głowami w przysłowiowy mur. Byliśmy w połowie tej części projektu i wiedzieliśmy, że czas na ukończenie będzie wykładniczy lub niewykonalny przy niewłaściwym modelu domeny. Więc ugryzliśmy kulę, podzieliliśmy opowieść na osiem innych opowieści i zreformowaliśmy Model Domeny.

Kiedy zakończyliśmy projekt, z perspektywy czasu wiedzieliśmy, że to była właściwa rzecz, i JEDYNA rzecz, aby zrobić to dobrze.

Zajęło to trochę czasu? Tak, ale gdybyśmy tego nie zrobili, zajęłoby to więcej czasu. Czy zrobiono to poprawnie DDD? Cóż, co zabawne, nie wiedzieliśmy wtedy o DDD, ale wkrótce potem wzięliśmy udział w warsztatach DDD Erica Evansa, a ja i moi koledzy mogliśmy tylko pokiwać głową. Myślę, że gdybyśmy znali DDD, znacznie wcześniej wybralibyśmy refaktor, oszczędzając w ten sposób więcej czasu.

SBasir
źródło
Świetna odpowiedź. Przechodzimy przez coś podobnego do tego co kilka miesięcy. Cieszę się, że nie jesteśmy sami!
Andrew Whitaker,
3

Jeśli zauważysz coś złego w modelu domeny, ważne jest, aby to poprawić. Z mojego doświadczenia wynika, że ​​trochę zaostrzyliśmy sposób, w jaki model domeny łączy się z różnymi podmiotami, gdy wdrożyliśmy niektóre z nich.

Wynikiem tego było to, że ludzie modelowali w sposób, w jaki nie było to zamierzone, i w ten sposób psuje inne części modelu, próbując „doprowadzić go do działania”.

Gdy tylko zorientujesz się, że coś jest nie tak z modelem domeny, zmień to jak najszybciej. Im więcej czasu zajmie zanim dokonamy refaktoryzacji, tym trudniej będzie zmienić użytkownika w stosunku do użytkowników, których modele mentalne są teraz dostosowane.

Morten
źródło
3

W przypadku niektórych fragmentów kodu ciągłe refaktoryzowanie to przesada. W przypadku innej części kodu (w DDD tzw. Core Domain ) jest koniecznością. Zrozumienie, że kod nie jest taki, jaki powinien być, nakłada na programistę dodatkowe obciążenie poznawcze (różnica między naszym rozumieniem domeny a obecną implementacją), które spowoduje, że dalsze zmiany będą trudniejsze i / lub droższe.

Pytanie brzmi: „czy ta ewolucja będzie potrzebna?”. W domenie podstawowej (obszarze, który robi różnicę biznesową) odpowiedź brzmi „tak!”. Ponieważ jest to mikstura domeny, którą firma jest bardziej zaniepokojona, i ta, która zrobi różnicę dla interesariuszy. To miejsce, w którym chcesz utrzymać swój kod w doskonałej formie, gotowy do wdrożenia kolejnego wymagania przy minimalnym wysiłku, ze względu na elastyczność modelu domeny.

Będzie to jednak kosztowne w przypadku zastosowania do całego kodu aplikacji. Obszary, które nie są istotne dla biznesu ( Wspieranie lub Generic Subdomeny w DDD slangu) może wymagać mniej wyrafinowane podejście niż jednym przeznaczonym dla rdzenia.

ZioBrando
źródło