Jak używać doxygen do tworzenia diagramów klas UML ze źródła C ++

90

Szukałem materiału opisującego, jak generować proste diagramy klas za pomocą doxygen, ale nie mogłem go znaleźć. Czy ktoś może pomóc?

Muszę utworzyć diagramy, jak pokazano poniżej, z zestawu plików C ++. tekst alternatywny

Jeśli istnieją lepsze narzędzia do łatwiejszego osiągnięcia tego, daj mi znać.

devnull
źródło
czy osiągnąłeś takie diagramy, w tym informacje o typach atrybutów i metod?
IzZy

Odpowiedzi:

50

Doxygen tworzy diagramy dziedziczenia, ale nie sądzę, aby stworzył całą hierarchię klas. Pozwala na użycie narzędzia GraphViz. Jeśli używasz narzędzia frontendu Doxygen GUI, odpowiednie opcje znajdziesz w Step2: -> Wizard tab -> Diagrams. Opcje relacji DOT znajdują się na karcie Ekspert.

DPD
źródło
6
Będziesz mógł poruszać się po całej hierarchii, ograniczenia dotyczą tego, co jest wyświetlane na diagramie. Istnieje kilka parametrów, które ograniczają zakres wykresu. DOT_GRAPH_NODES ogranicza liczbę wpisów na jednej stronie, a MAX_DOT_GRAPH_DEPTH ogranicza, jak głęboko sięga. Ustawienie ich na duże wartości powoduje, że jest to bardzo czasochłonne w przypadku dużego projektu.
DanS,
Dzięki. U mnie to zadziałało. Ominąłem również kilka opcji w Expert-> Dot
tsenapathy
46

Cytat z tego posta (napisany przez samego autora doxygen):

run doxygen -g and change the following options of the generated Doxyfile:

    EXTRACT_ALL            = YES
    HAVE_DOT               = YES
    UML_LOOK               = YES

run doxygen again
średni
źródło
11
Nie spowoduje to wygenerowania pełnego diagramu klas (np. Relacji wiele do jednego między klasą A i klasą B); tylko diagram dziedziczenia, tj. pokazujący relacje nadklasy / podklasy.
stepthom
39

Hmm, wydaje się, że to trochę stare pytanie, ale odkąd majstrowałem przy konfiguracji Doxygen w ciągu ostatnich kilku dni, podczas gdy moja głowa wciąż jest pełna aktualnych informacji, spróbujmy tego -

Myślę, że poprzednie odpowiedzi prawie to mają:

Brakującą opcją jest dodanie COLLABORATION_GRAPH = YESpliku Doxyfile. Zakładam, że możesz zrobić równoważną rzecz gdzieś w doxywizard GUI (nie używam doxywizard).

Tak więc, jako bardziej kompletny przykład, typowe opcje „Doxyfile” związane z danymi wyjściowymi UML, których zwykle używam, to:

EXTRACT_ALL          = YES
CLASS_DIAGRAMS      = YES
HIDE_UNDOC_RELATIONS = NO
HAVE_DOT             = YES
CLASS_GRAPH          = YES
COLLABORATION_GRAPH  = YES
UML_LOOK             = YES
UML_LIMIT_NUM_FIELDS = 50
TEMPLATE_RELATIONS   = YES
DOT_GRAPH_MAX_NODES  = 100
MAX_DOT_GRAPH_DEPTH  = 0
DOT_TRANSPARENT      = YES

Te ustawienia wygenerują zarówno diagramy „dziedziczenia” ( CLASS_GRAPH=YES), jak i „współpracy” ( COLLABORATION_GRAPH=YES).

W zależności od celu "rozmieszczenia" wyjścia doxygen, ustawienie DOT_IMAGE_FORMAT = svgmoże być również przydatne. W przypadku wyjścia svg diagramy są „skalowalne” zamiast stałej rozdzielczości w formatach bitmap, takich jak .png. Najwyraźniej, jeśli przeglądasz wynik w przeglądarkach innych niż IE, istnieje również INTERACTIVE_SVG = YESmożliwość „interaktywnego powiększania i przesuwania” wygenerowanych diagramów svg. Próbowałem tego jakiś czas temu, a wyjście svg było bardzo atrakcyjne wizualnie, ale w tamtym czasie obsługa przeglądarki svg była nadal nieco niespójna, więc mam nadzieję, że sytuacja mogła się ostatnio poprawić.

Jak wspomniały inne komentarze, niektóre z tych ustawień ( DOT_GRAPH_MAX_NODESw szczególności) mają potencjalny wpływ na wydajność, więc YMMV.

Zwykle nienawidzę odpowiedzi w stylu "RTFM", więc przepraszam za to zdanie, ale w tym przypadku dokumentacja Doxygena naprawdę jest twoim przyjacielem, więc sprawdź dokumentację Doxygen dotyczącą wyżej wymienionych ustawień - ostatnim razem możesz znaleźć szczegóły na http://www.doxygen.nl/manual/config.html .

user6092647
źródło
Dobra odpowiedź. W swojej odpowiedzi napisałeś „CLASS _DIAGRAMS” zamiast „CLASS_GRAPH”.
DavidS,
Hmm, właściwie, teraz to poruszysz, widzę, że mam zarówno CLASS_DIAGRAMS = YES, jak i CLASS_GRAPH = YES. Po sprawdzeniu dokumentacji dla Doxygen 1.8.9.1 stwierdziłem, że w rzeczywistości CLASS_GRAPH = YES nadpisuje CLASS_DIAGRAMS = YES, więc te dwie opcje współdziałają, z CLASS_GRAPH = YES ma pierwszeństwo. Więc właściwie, dla celów pierwotnego pytania, co mam, będzie działać, niemniej jednak dobry połów!
user6092647
możesz także zmienić OUTPUT_DIRECTORY i zezwolić na wyszukiwanie RECURSIVE
King's błazen
Konieczna może być również zmiana pola RECURSIVEna TAK
prehistoryczny
6

Enterprise Architect zbuduje diagram UML z importowanego kodu źródłowego.

zooropa
źródło
Głosowano za odpowiedzią również na pytanie „Jeśli są lepsze narzędzia do łatwiejszego osiągnięcia tego, daj mi znać”.
kaveish
5

Myślę, że będziesz musiał wyedytować plik doxys i ustawić GENERATE_UML (coś w tym rodzaju) na true. I musisz mieć zainstalowany dot / graphviz.

fzhou
źródło
12
Czy mówisz o opcji UML_LOOK?
David Doria
@DavidDoria musi być. Ale UML_LOOK nie pokaże żadnych typów danych.
Ruud Verhoef
2

2 najwyżej ocenione odpowiedzi są poprawne. Na dzień dzisiejszy jedyną rzeczą, jaką musiałem zmienić (z ustawień domyślnych), było włączenie generowania za pomocą kropki zamiast wbudowanego generatora.

Kilka ważnych uwag:

  • Doxygen nie wygeneruje rzeczywistego pełnego diagramu wszystkich klas w projekcie . Wygeneruje osobny obraz dla każdej hierarchii. Jeśli masz wiele niepowiązanych hierarchii klas, otrzymasz wiele obrazów.
  • Wszystkie te diagramy można znaleźć w html/inherits.htmlklasach lub (z poziomu nawigacji strony) => hierarchia klas => "Przejdź do tekstowej hierarchii klas".
  • To jest pytanie C ++, więc porozmawiajmy o szablonach. Zwłaszcza jeśli odziedziczysz po T.
    • Każda instancja szablonu będzie poprawnie traktowana jako inny typ przez Doxygen. Typy dziedziczące z różnych instancji będą miały na diagramie różne klasy nadrzędne.
    • Jeśli szablon klasy foodziedziczy po, Ta Tparametr typu szablonu ma wartość domyślną, zostanie przyjęta taka wartość domyślna. Jeśli istnieje typ, barktóry dziedziczy, foo<U>skąd Ujest inny niż domyślny, barbędzie miał foo<U>rodzica. foo<>i bar<U>nie będzie mieć wspólnego rodzica.
    • Jeśli istnieje wiele szablonów klas, które dziedziczą po co najmniej jednym z parametrów szablonu, Doxygen przyjmie wspólnego rodzica dla tych szablonów klas, o ile parametry typu szablonu mają dokładnie takie same nazwy w kodzie. To zachęca do spójności w nazewnictwie.
    • CRTP i odwrotny CRTP po prostu działają.
    • Rekurencyjne drzewa dziedziczenia szablonów nie są rozwijane. Wszelkie variantinstancje będą wyświetlane do dziedziczenia variant<Ts...>.
    • Rysowane są szablony klas bez instancji. Będą miały <...>w swojej nazwie ciąg reprezentujący parametry typu i inne niż typowe, które nie mają wartości domyślnych.
    • Rysowane są również szablony zajęć pełne i częściowe specjalizacje. Doxygen generuje prawidłowe wykresy, jeśli specjalizacje dziedziczą po różnych typach.
Xeverous
źródło