Zawsze miałem problem znaleźć się w kodzie czy to moim czy „obcym”. Jeżeli chodzi o swój kod to z czasem wiedza o nim nie co się zamazuje. Kod  w ciągu swojego życia ma tendencje do rozrastania się i gmatwania.

Jestem w trakcie czytania książki Michael Feathers „Praca z zastanym kodem najlepsze techniki”.  Jedną z poznanych technik było rozrysowanie klasy i jej zależności lub metody i jej zależności. Przedstawione było to za pomocą prostego grafu. Ja postanowiłem to trochę rozszerzyć i dodać nie co z modelu C4.

Problem

Mam aplikację pisaną w starej technologi WebForms z opasłymi klasami. Aplikację tą pisaliśmy klika lat temu, nie zwracaliśmy uwagi na jakość kodu. Z czasem jednak przejąłem ją w pełni, a kod stawał się coraz bardziej zagmatwany. System wielokrotnie był rozszerzany o nowe funkcjonalności, z czasem powodując coraz większy chaos w kodzie. Pojawiły się kilkutysięcznki w których wszystko jest zależne od wszystkiego. Refaktoryzacja czegoś takiego nie jest prosta. Wiem bo próbowałem wielokrotnie, co nie raz kończyło się wprowadzeniem większego chaosu.

Dla mnie największym problemem okazało się brak ogólnego widoku na kod. Nie potrafię spojrzeć z góry, na wszystko i zobaczyć jak to wygląda. Dostrzec potencjalne punkty zmiany, niepotrzebne fragmenty, zbyt skomplikowaną logikę.

Rozwiązanie

Nie jestem odkrywcą, moje rozwiązanie nie jest czymś nowatorskim. Po prostu jest potrzebą chwili i sumą pewnych doświadczeń.

Wykorzystam miro i karteczki z ES (event stromingu), z event stormingiem nie ma to nic wspólnego.

Cel

Celem jest zaprezentowanie klasy w łatwy do przedstawienia i w konsekwencji zrozumienia sposób. Bez kodu, za pomocą kolorowych karteczek.

Opis

Stworzyłem legendę i podzieliłem klasę, która opisuje na części. Na początku skupiłem się na:

  • Interfejsy,
  • klasy z których dziedziczę,
  • konkretne instancje klasy (obiekty),
  • właściwości prywatne i publiczne

Opisywana klasa nie jest zbyt duża ma kilka powyższych punktów, sądzę że taki model można by rozbudowywać jeżeli było by dużo interfejsów czy konkretnych obiektów. Skupić tylko na nich i w kolejnych krokach je przedstawiać.  Na razie są to próby więc zapewne będzie się to jeszcze zmieniać.  Warto dodać, że ja to robię do kodu legacy więc będą tam występować przeróżne nie zbyt dobre praktyki. Po za tym to test pewnej koncepcji, słuszność rozwiązani wyjdzie w „praniu”

Pierwsza aktualizacja

Polega na rozdzieleniu  tej legendy na pół, dosłownie. Widzę że w przykładowej klasie mam bardzo dużo zdarzeń i właściwości. Jeżeli razem to wszystko poskładam to obraz całości będzie mocna zagmatwany. Tak więc rozdzieliłem to tak jak w modelu C4, można by się pokusić o jakieś porównanie co na pewno uczynię.

Powyżej globalne spojrzenie na klasę. Poniżej metody i zdarzenia tejże klasy.

Ogólny pogląd na dwa powyższe kroki

Kolejny krok

Co może być kolejnym krokiem? W moim przypadku  może to być pogrupowanie zdarzeń (bo jest ich dużo) według  kontrolki, której dotyczą. Może będzie bardziej czytelne.

Druga aktualizacja

Być może lepiej będzie zdarzenia  dać do osobnego obrazka

Zdarzenia

Postanowiłem zdarzenia przedstawić w nie co bardziej przystępnej formie

Pogląd ogólny

Wnioski – końcowe

Jestem programistą (nie da się ukryć, chyba), jestem leniwy (zobowiązuje). Wypadało by napisać aplikacje, która w „magiczny” sposób wygeneruje mi zestaw takich bloków.

Do czego mi to jest potrzebne?

Tak jak wspominałem we wstępie mam aplikacje której trudno się rozeznać. Muszę z nią pracować, modyfikować, rozszerzać funkcjonalności. Idzie to ciężko, nie jest to łatwe. Owszem nowe funkcjonalności robię inaczej za pomocą interfejsów, odwrócenia zależności, nawet testy mam. Ale zawsze jest te ale pozostają części aplikacji nie zmienione od lat i nie dlatego że tam nie nowych funkcjonalności ale dlatego, że były napisane w sposób utrudniający rozszerzenie i modyfikacje.

Samo stworzenie tych powyższych schematów dało mi wiedzę o miejscach które mogę poddać refaktoryzacji i uproszczeniu. O rzeczach, które mogę usunąć bo śmiecą w kodzie. A jeżeli napisał bym taką aplikacje, która umożliwi mi wygenerowanie za każdym razem takiego schematu, było by to na pewno pomocne i zmniejszyło by ilość błędów pojawiających się przy tworzeniu (ręcznie) czegoś takiego.Ostatnią zaletą jest dokumentacja kodu.

Nie pisałem jeszcze takiej aplikacji, a to może być ciekawe doświadczenie, warto spróbować.

 

Kategorie: Inne