Utrzymuję starą bazę kodu napisaną w języku python. W szczególności istnieje złożony fragment kodu, który z modułu wywołuje inne funkcje z innych modułów, które wywołują inne funkcje i tak dalej. To nie jest OOP, tylko funkcje i moduły.
Próbowałem śledzić, gdzie zaczyna się i kończy przepływ za każdym razem, gdy wywołuję główną funkcję, ale czuję, że muszę to narysować, ponieważ gubię się w wywołaniach podrzędnych.
To, co mnie martwi, to to, że każda funkcja wywołuje wiele funkcji zewnętrznych w swoim ciele, aby zakończyć zadanie i zwrócić wartość wywołującemu.
Jak mogę to narysować? Czyli jaki rodzaj wykresu / grafiki byłby odpowiedni do udokumentowania tego rodzaju zachowania / kodu?
Nie sądzę więc, aby rysowanie diagramu UML, ani schematu blokowego było przydatne. Może wykres połączeń?
Odpowiedzi:
Myślę, że tutaj szukasz diagramu sekwencji . Umożliwiają one wizualizację kolejności, w której różne moduły wywołują się nawzajem za pomocą strzałek.
Konstruowanie jednego jest proste:
Przykład
Załóżmy, że mamy następujący kod, dla którego chcemy utworzyć diagram sekwencji:
Najpierw narysujemy punkt wejścia (
main
) łączący się z metodąlong_division
. Zauważ, że tworzy to pole w long_division, oznaczające zakres wywołania metody. W tym prostym przykładzie ramka będzie miała całą wysokość naszego schematu sekwencji, ponieważ jest to jedyna rzecz, którą można uruchomić.Teraz dzwonimy,
find_largest_fit
aby znaleźć największą wielokrotność, która mieści się w naszym numerze roboczym i zwraca go nam. Rysujemy linię odlong_division
dofind_largest_fit
z innym polem, aby zaznaczyć zakres wywołania funkcji. Zwróć uwagę, jak pole kończy się po zwróceniu mnożnika; to koniec zakresu funkcji!Powtórz kilka razy dla większej liczby, a twój wykres powinien wyglądać mniej więcej tak:
Notatki
Możesz wybrać, czy chcesz oznaczać połączenia przekazanymi nazwami zmiennych, czy ich wartości, jeśli chcesz udokumentować tylko jeden konkretny przypadek. Możesz także wyświetlić rekurencję z funkcją wywołującą samą siebie.
Ponadto możesz tutaj wyświetlać użytkowników, monitować ich i dość łatwo wprowadzać dane do systemu. To dość elastyczny system, który wydaje mi się przydatny!
źródło
Myślę, że wykres połączeń byłby najbardziej odpowiednią wizualizacją. Jeśli zdecydujesz się nie robić tego ręcznie, istnieje ładne małe narzędzie o nazwie,
pyan
które wykonuje analizę statyczną pliku Pythona i może wygenerować wizualizowany wykres wywołania za pomocą pliku kropki graphviz (który może być renderowany na obraz). Było kilka rozwidleń, ale najbardziej w pełni funkcjonalny wydaje się być https://github.com/davidfraser/pyan .Musisz tylko określić wszystkie pliki, które chcesz przetworzyć po uruchomieniu polecenia:
python ~/bin/pyan.py --dot a.py b.py c.py -n > pyan.dot; dot -Tpng -opyan.png pyan.dot
lub
python ~/bin/pyan.py --dot $(find . -name '*.py') -n > pyan.dot; dot -Tpng -opyan.png pyan.dot
Możesz uczynić wykres czystszym za pomocą „-n”, który usuwa linie pokazujące, gdzie zdefiniowano funkcję.
źródło