Como usar doxygen para criar diagramas de classes UML a partir de fontes C ++


90

Tenho procurado algum material que descreva como gerar diagramas de classe simples com doxygen, mas não consegui encontrar um. Alguém pode ajudar?

Preciso criar diagramas conforme mostrado abaixo a partir de um conjunto de arquivos C ++. texto alternativo

Se houver ferramentas melhores para fazer isso com mais facilidade, entre em contato.


você conseguiu diagramas como este, incluindo informações sobre tipos de atributos e métodos?
Adrian

Respostas:


50

O Doxygen cria diagramas de herança, mas não acho que criará uma hierarquia de classes inteira. Ele permite que você use a ferramenta GraphViz. Se você usar a ferramenta de interface do Doxygen GUI, encontrará as opções relevantes em Step2: -> Wizard tab -> Diagrams. As opções de relação DOT estão na guia Especialista.


6
Você poderá navegar por toda a hierarquia, os limites estão no que é exibido em um diagrama. Existem alguns parâmetros que limitam o escopo do gráfico. DOT_GRAPH_NODES limita o número de entradas em uma única página e MAX_DOT_GRAPH_DEPTH restringe sua profundidade. Configurá-los com valores altos consome muito tempo para um projeto grande.
DanS de

Obrigado. Funcionou para mim Também substituí algumas opções em Expert-> Ponto
tsenapatia,

46

Citação desta postagem (escrita pelo próprio autor do 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

11
Isso não gerará um diagrama de classe completo (por exemplo, o relacionamento muitos-para-um entre a classe A e a classe B); apenas um diagrama de herança, ou seja, mostrando relacionamentos de superclasse / subclasse.
stepthom

39

Hmm, esta parece ser uma questão um pouco velha, mas como eu tenho mexido com a configuração do Doxygen nos últimos dias, enquanto minha cabeça ainda está cheia de informações atuais, vamos tentar -

Acho que as respostas anteriores quase acertaram:

A opção que falta é adicionar COLLABORATION_GRAPH = YESo Doxyfile. Suponho que você possa fazer a coisa equivalente em algum lugar na GUI do doxywizard (eu não uso doxywizard).

Portanto, como um exemplo mais completo, as opções típicas de "Doxyfile" relacionadas à saída UML que costumo usar são:

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

Essas configurações irão gerar diagramas de "herança" ( CLASS_GRAPH=YES) e "colaboração" ( COLLABORATION_GRAPH=YES).

Dependendo do seu destino para "implantação" da saída doxygen, a configuração DOT_IMAGE_FORMAT = svgtambém pode ser útil. Com a saída svg, os diagramas são "escaláveis" em vez da resolução fixa de formatos de bitmap como .png. Aparentemente, se estiver visualizando a saída em navegadores diferentes do IE, também INTERACTIVE_SVG = YEShaverá o que permitirá "zoom e panorâmica interativos" dos diagramas SVG gerados. Eu tentei isso há algum tempo, e a saída do svg era muito atraente visualmente, mas, na época, o suporte do navegador para o svg ainda era um pouco inconsistente, então espero que essa situação tenha melhorado recentemente.

Como outros comentários mencionaram, algumas dessas configurações ( DOT_GRAPH_MAX_NODESem particular) têm impactos potenciais no desempenho, então YMMV.

Eu tendo a odiar respostas no estilo "RTFM", então peço desculpas por esta frase, mas neste caso a documentação do Doxygen é realmente sua, então verifique os documentos do Doxygen nas configurações mencionadas acima - da última vez que olhei, você pode encontrar os detalhes em http://www.doxygen.nl/manual/config.html .


Boa resposta. Em sua resposta, você escreveu "CLASS _DIAGRAMS" em vez de "CLASS_GRAPH".
DavidS

Hmm, na verdade, agora que você toca no assunto, vejo que tenho CLASS_DIAGRAMS = YES e CLASS_GRAPH = YES. Depois de verificar a documentação do Doxygen 1.8.9.1, descobri que, na verdade, CLASS_GRAPH = YES substituirá CLASS_DIAGRAMS = YES para que as duas opções interajam, com CLASS_GRAPH = YES tendo precedência. Então, na verdade, para os propósitos da pergunta original, o que eu tenho vai funcionar, mas boa pegada!
user6092647

você também pode alterar OUTPUT_DIRECTORY e permitir pesquisa RECURSIVE
King's bobo

Você também pode precisar alterar o campo RECURSIVEpara SIM
pinguim pré

6

O Enterprise Architect construirá um diagrama UML a partir do código-fonte importado.


Votos positivos por também responder à pergunta "Se houver ferramentas melhores para fazer isso com mais facilidade, por favor me avise."
kaveish

5

Acho que você precisará editar o arquivo doxys e definir GENERATE_UML (algo assim) como verdadeiro. E você precisa ter o dot / graphviz instalado.


12
Você está falando sobre a opção UML_LOOK?
David Doria

@DavidDoria deve ser. Mas UML_LOOK não mostrará nenhum tipo de dados.
Ruud Verhoef

2

As 2 respostas mais votadas estão corretas. A partir de hoje, a única coisa que eu precisava mudar (das configurações padrão) era habilitar a geração usando o ponto em vez do gerador embutido.

Algumas notas importantes:

  • O Doxygen não irá gerar um diagrama completo real de todas as classes do projeto . Ele irá gerar uma imagem separada para cada hierarquia. Se você tiver várias hierarquias de classes não relacionadas, obterá várias imagens.
  • Todos esses diagramas podem ser encontrados em html/inherits.htmlou (na navegação do site) classes => hierarquia de classes => "Vá para a hierarquia de classes textuais".
  • Esta é uma questão de C ++, então vamos falar sobre modelos. Especialmente se você herdar de T.
    • Cada instanciação do modelo será corretamente considerada um tipo diferente pelo Doxygen. Os tipos que herdam de instanciações diferentes terão classes pai diferentes no diagrama.
    • Se um modelo de classe for fooherdado de Te o Tparâmetro de tipo de modelo tiver um padrão, esse padrão será assumido. Se houver um tipo barque herda de foo<U>onde Ufor diferente do padrão, barterá um foo<U>pai. foo<>e bar<U>não terá um pai comum.
    • Se houver vários modelos de classe que herdam de pelo menos um de seus parâmetros de modelo, o Doxygen assumirá um pai comum para esses modelos de classe, desde que os parâmetros de tipo de modelo tenham exatamente os mesmos nomes no código. Isso incentiva a consistência na nomenclatura.
    • CRTP e CRTP reverso simplesmente funcionam.
    • Árvores de herança recursiva de template não são expandidas. Qualquer variantinstanciação será exibida para herança variant<Ts...>.
    • Modelos de classe sem instanciações estão sendo desenhados. Eles terão uma <...>string em seu nome representando parâmetros de tipo e não-tipo que não possuem padrões.
    • As especializações completas e parciais do modelo de classe também estão sendo desenhadas. O Doxygen gera gráficos corretos se as especializações herdarem de tipos diferentes.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.