Jakie narzędzia lub techniki są przydatne do opisania nieznanej bazy kodu? [Zamknięte]

9

Podczas ręcznego sprawdzania nieznanego kodu (w celu przejrzenia lub zmodyfikowania) wydaje mi się, że mam trzy opcje.

  • Odgórne odczytać kodu, wybierając każdy następny plik źródłowy tego, jak nazwa pliku fundamentalna wydaje. Zwykle czytam prawie wszystko. Niektóre pliki dwa razy.
  • Szerokość pierwszego odczytu , gdzie mogę znaleźć i przeczytać wszystkie metody wywołującego z minimalnym zrozumieniem. Następnie przeczytaj wszystkie funkcje wywoływane przez tę funkcję i tak dalej. Mój mentalny stos ma tendencję do przepełnienia, jeśli wykonam kilka głębokich połączeń.
  • Głębokość pierwszego odczytu , gdzie krok po kroku cały kod w debugger, niepewni, czy to zajmie 8 minut lub 8 godzin.

Po przeczytaniu wystarczającej ilości kodu, aby mieć dość solidne zrozumienie tego, co robi, często myślę, że przeczytałem 80% lub więcej bazy kodu, podczas gdy podstawowy kod to 20% lub mniej . Zmarnowałem dużo czasu.

Jakie narzędzia są przydatne, aby szybko poznać nieznany kod? Czy są jakieś narzędzia, które mogą dać „duży obraz” ścieżki krytycznego kodu i pozwolić mi przejść do szczegółów jednej części?

Drew Dormann
źródło
2
bez uchwycenia 80% procent nie można zrozumieć, dlaczego 20% jest podstawową częścią
maniak zapadkowy
@ratchetfreak Nie powiedziałbym tego w tak absolutnych kategoriach. Narzędzie może na przykład izolować kod, który jest zawsze wywoływany. Lub uruchamiaj tylko wiele poziomów w stosach.
Drew Dormann,

Odpowiedzi:

8

Oczywiście najlepszą rzeczą jest, aby ktoś, kto zna bazę kodu, przeprowadził cię przez nią. Jeśli nie jest to opcja, istnieje kilka narzędzi, które mogą ci pomóc.

  • VisualStudio może automatycznie wygenerować diagram klas UML podstawy kodu. Przynajmniej pokaże ci hierarchie klas.
  • Doxygen może być niezwykle pomocny. Nawet jeśli kod nie zawiera komentarzy w stylu doxygen, doxygen może nadal generować czytelną dokumentację, diagramy klas i wykresy wywołań, które mogą być bardzo pomocne w znalezieniu sposobu na obejrzenie nieznanej bazy kodu.

Ogólnie rzecz biorąc, chcesz także używać w pełni funkcjonalnego IDE, w którym możesz kliknąć prawym przyciskiem myszy cokolwiek i „przejść do definicji”. To pozwala zaoszczędzić dużo czasu w porównaniu z użyciem grep na wielu plikach w złożonej strukturze katalogów.

Kolejna ważna rzecz, w zależności od tego, jak długo będziesz musiał radzić sobie z kodem. Jeśli istnieją testy jednostkowe, przejrzyj je. Jeśli nie ma testów, zacznij je pisać. Stwórz hipotezę o tym, co robi dana klasa lub funkcja, i napisz test, aby ją przetestować. Wymaga to dużej dyscypliny, ale jest to świetny sposób na uzyskanie odpowiedzi na temat tego, co dzieje się w kodzie.

Dima
źródło
2
Dzięki @Dima. Doxygen doskonale radzi sobie z niektórymi z nich. (Nie chciałem sterować odpowiedziami, upuszczając jedno znane mi narzędzie). Wyrazy uznania dla wyrównanego komponentu „interakcji międzyludzkich”. :)
Drew Dormann,
3

To jest bardziej drastyczne podejście. Ta technika może być przydatna w przypadku projektu, który ma wiele klas, które nie są zorganizowane w znaczące przestrzenie nazw.

Celem tego ćwiczenia jest odkrycie relacji klasowej. Utwórz rzutowy klon projektu, a następnie spróbuj umieścić niektóre klasy w przestrzeniach nazw. Aby zaoszczędzić czas przy ponownych próbach, użyj narzędzi do przetwarzania plików Regex, aby zautomatyzować tę zmianę.

Spowoduje to wiele błędów kompilatora. Podczas naprawiania tych błędów lepiej zrozumiemy, w jaki sposób te klasy są od siebie zależne, i zdecydujemy, które klasy można umieścić w tej samej przestrzeni nazw.

Ta technika jest przydatna, ponieważ można ją zastosować nawet przy niewielkim zrozumieniu organizacji kodu projektu. W związku z tym istnieje ryzyko, że niektóre klasy mogą zostać zgubione przez tę technikę z powodu nieporozumień.

rwong
źródło
To sprytne. Czy zazwyczaj robisz to dla wielu klas, czy oszczędzasz na to, kiedy natrafisz na konkretną, niejasną dla ciebie klasę?
Drew Dormann,
@DrewDormann Nauczyłem się tej techniki od jednego z moich kolegów w obliczu setek zajęć, które nie zostały zgrupowane. Jest to pierwszy krok w kierunku „sortowania” plików projektu, zanim nastąpi refaktoryzacja. Innymi słowy, jest używany, gdy wszystko nadal jest bałaganem. (Żenujące, bałagan został napisany przez moje wcześniejsze ja). Sortując pliki projektu do przestrzeni nazw, ułatwia generowanie strony klasy Doxygen (poprzez wyświetlanie drzew przestrzeni nazw), a także przyspiesza rozumienie programisty.
rwong