134 votes

Comment utiliser doxygen pour créer des diagrammes de classes UML à partir d'une source C++ ?

J'ai cherché un document décrivant comment générer des diagrammes de classes simples avec doxygen, mais je n'en ai pas trouvé. Quelqu'un peut-il m'aider ?

Je dois créer des diagrammes tels que ceux présentés ci-dessous à partir d'un ensemble de fichiers C++. alt text

S'il existe de meilleurs outils pour faciliter cette tâche, n'hésitez pas à m'en faire part.

0 votes

Avez-vous réalisé des diagrammes de ce type incluant des informations sur les types d'attributs et de méthodes ?

87voto

user6092647 Points 581

Hmm, cela semble être une question un peu ancienne, mais comme j'ai travaillé sur la configuration de Doxygen ces derniers jours, alors que ma tête est encore pleine d'informations actuelles, essayons d'y répondre

Je pense que les réponses précédentes sont presque complètes :

L'option manquante consiste à ajouter COLLABORATION_GRAPH = YES dans le fichier Doxy. Je suppose que vous pouvez faire l'équivalent quelque part dans l'interface graphique de doxywizard (je n'utilise pas doxywizard).

Ainsi, pour donner un exemple plus complet, les options typiques de "Doxyfile" relatives à la sortie UML que j'ai tendance à utiliser sont les suivantes :

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

Ces paramètres génèrent à la fois un "héritage" ( CLASS_GRAPH=YES ) et "collaboration" ( COLLABORATION_GRAPH=YES ).

En fonction de votre objectif de "déploiement" de la sortie de doxygen, la définition de DOT_IMAGE_FORMAT = svg peut également s'avérer utile. Avec la sortie svg, les diagrammes sont "modulables" au lieu de la résolution fixe des formats bitmap tels que .png. Apparemment, si l'on visualise la sortie dans des navigateurs autres que IE, il y a également INTERACTIVE_SVG = YES qui permettra d'effectuer des "zooms et des panoramiques interactifs" sur les diagrammes svg générés. J'ai essayé cela il y a quelque temps, et la sortie svg était très attrayante visuellement, mais à l'époque, la prise en charge des svg par les navigateurs était encore un peu incohérente, alors j'espère que la situation s'est améliorée dernièrement.

Comme d'autres commentaires l'ont mentionné, certains de ces paramètres ( DOT_GRAPH_MAX_NODES en particulier) ont un impact potentiel sur les performances, donc YMMV.

J'ai tendance à détester les réponses de type "RTFM", donc je m'excuse pour cette phrase, mais dans ce cas, la documentation de Doxygen est vraiment votre amie, donc consultez la documentation de Doxygen sur les paramètres mentionnés ci-dessus - la dernière fois que j'ai regardé, vous pouvez trouver les détails à l'adresse suivante http://www.doxygen.nl/manual/config.html .

60voto

DPD Points 638

Doxygen crée des diagrammes d'héritage mais je ne pense pas qu'il puisse créer une hiérarchie de classes complète. Il vous permet d'utiliser l'outil GraphViz. Si vous utilisez l'outil frontal de l'interface graphique de Doxygen, vous trouverez les options pertinentes dans Step2: -> Wizard tab -> Diagrams . Les options de relation DOT se trouvent sous l'onglet Expert.

6 votes

Vous pourrez naviguer dans l'ensemble de la hiérarchie, les limites se situant au niveau de l'affichage sur un diagramme. Il existe quelques paramètres qui limitent la portée du graphique. DOT_GRAPH_NODES limite le nombre d'entrées sur une seule page et MAX_DOT_GRAPH_DEPTH limite la profondeur du graphique. En fixant ces paramètres à des valeurs élevées, le programme prend beaucoup de temps pour un projet de grande envergure.

0 votes

Merci. Cela a fonctionné pour moi. J'ai également remplacé quelques options dans Expert->Dot

50voto

average Points 1142

Citation de ce poste (il est écrit par l'auteur de doxygen lui-même) :

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

    EXTRACT_ALL            = YES
    HAVE_DOT               = YES
    UML_LOOK               = YES

run doxygen again

16 votes

Cela ne génère pas un diagramme de classes complet (par exemple, la relation de type "un pour un" entre la classe A et la classe B), mais seulement un diagramme d'héritage, c'est-à-dire montrant les relations entre les superclasses et les sous-classes.

7voto

zooropa Points 1602

Enterprise Architect construira un diagramme UML à partir du code source importé.

0 votes

Upvoted for also answering the question "If there are better tools to achieve this easier, please let me know" (S'il y a de meilleurs outils pour réaliser cela plus facilement, merci de me le faire savoir).

6voto

Xeverous Points 174

Les 2 réponses les plus votées sont correctes. A partir d'aujourd'hui, la seule chose que j'ai dû modifier (par rapport aux paramètres par défaut) a été d'activer la génération à l'aide de points au lieu du générateur intégré.

Quelques remarques importantes :

  • Doxygen ne génère pas un diagramme complet de toutes les classes du projet. . Il génère une image distincte pour chaque hiérarchie. Si vous avez plusieurs hiérarchies de classes sans lien entre elles, vous obtiendrez plusieurs images.
  • Tous ces diagrammes se trouvent dans html/inherits.html ou (à partir de la navigation du site web) classes => hiérarchie des classes => "Aller à la hiérarchie textuelle des classes".
  • Il s'agit d'une question sur le C++, donc parlons des modèles. Surtout si vous héritez de T .
    • Chaque instanciation de modèle sera correctement considérée comme un type différent par Doxygen. Les types qui héritent de différentes instanciations auront des classes parentes différentes sur le diagramme.
    • Si un modèle de classe foo hérite de T et le T a une valeur par défaut, cette valeur sera prise en compte. S'il existe un type bar qui hérite de foo<U>U est différente de la valeur par défaut, bar aura une foo<U> parent. foo<> y bar<U> n'auront pas de parent commun.
    • S'il y a plusieurs modèles de classe qui héritent d'au moins un de leurs paramètres de modèle, Doxygen supposera un parent commun pour ces modèles de classe tant que les paramètres de type de modèle ont exactement les mêmes noms dans le code. Cela incite à la cohérence dans le nommage.
    • Le CRTP et le CRTP inversé fonctionnent parfaitement.
    • Les arbres d'héritage récursifs des modèles ne sont pas développés. Tout variant sera affichée comme héritant de variant<Ts...> .
    • Les modèles de classe sans instanciation sont dessinés. Ils auront un <...> dans leur nom, représentant les paramètres de type et de non-type qui n'ont pas de valeur par défaut.
    • Les spécialisations complètes et partielles des modèles de classe sont également en cours d'élaboration. Doxygen génère des graphes corrects si les spécialisations héritent de types différents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X