Cara menggunakan doxygen untuk membuat diagram kelas UML dari sumber C ++


90

Saya telah mencari beberapa materi yang menjelaskan cara membuat diagram kelas sederhana dengan doxygen, tetapi tidak dapat menemukannya. Ada yang bisa membantu?

Saya perlu membuat diagram seperti yang ditunjukkan di bawah ini dari satu set file C ++. teks alt

Jika ada alat yang lebih baik untuk melakukannya dengan lebih mudah, beri tahu saya.


apakah Anda mencapai diagram seperti ini termasuk info tentang atribut dan tipe metode?
IzZy

Jawaban:


50

Doxygen membuat diagram pewarisan tetapi saya tidak berpikir itu akan membuat seluruh hierachy kelas. Itu memungkinkan Anda untuk menggunakan alat GraphViz. Jika Anda menggunakan alat frontend Doxygen GUI, Anda akan menemukan opsi yang relevan di Step2: -> Wizard tab -> Diagrams. Opsi relasi DOT ada di bawah Tab Pakar.


6
Anda akan dapat menavigasi seluruh hierarki, batasannya ada pada apa yang ditampilkan pada diagram. Ada beberapa parameter yang membatasi cakupan grafik. DOT_GRAPH_NODES membatasi jumlah entri pada satu halaman dan MAX_DOT_GRAPH_DEPTH membatasi seberapa dalam. Menyetelnya ke nilai besar membuatnya sangat memakan waktu untuk proyek besar.
DanS

Terima kasih. Itu berhasil untuk saya. Saya juga telah mengganti beberapa opsi di Expert-> Dot
tsenapathy

46

Kutipan dari posting ini (ditulis oleh penulis doxygen sendiri):

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
Ini tidak akan menghasilkan diagram kelas penuh (misalnya, hubungan banyak-ke-satu antara kelas A dan kelas B); hanya diagram pewarisan, yaitu, menunjukkan hubungan superclass / subclass.
Stepthom

39

Hmm, ini sepertinya pertanyaan lama, tapi karena saya telah mengotak-atik konfigurasi Doxygen beberapa hari terakhir, sementara kepala saya masih penuh dengan info saat ini, mari kita coba -

Saya pikir jawaban sebelumnya hampir memilikinya:

Opsi yang hilang adalah menambahkan COLLABORATION_GRAPH = YESDoxyfile. Saya berasumsi Anda dapat melakukan hal yang setara di suatu tempat di doxywizard GUI (Saya tidak menggunakan doxywizard).

Jadi, sebagai contoh yang lebih lengkap, opsi "Doxyfile" umum yang terkait dengan keluaran UML yang cenderung saya gunakan adalah:

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

Pengaturan ini akan menghasilkan diagram "warisan" ( CLASS_GRAPH=YES) dan "kolaborasi" ( COLLABORATION_GRAPH=YES).

Bergantung pada target Anda untuk "penyebaran" keluaran doxygen, pengaturan DOT_IMAGE_FORMAT = svgmungkin juga berguna. Dengan keluaran svg, diagramnya "dapat diskalakan" daripada resolusi tetap dari format bitmap seperti .png. Rupanya, jika melihat output di browser selain IE, ada juga INTERACTIVE_SVG = YESyang akan memungkinkan "zoom dan panning interaktif" dari diagram svg yang dihasilkan. Saya sudah mencobanya beberapa waktu lalu, dan keluaran svg sangat menarik secara visual, tetapi pada saat itu, dukungan browser untuk svg masih agak tidak konsisten, jadi semoga situasi tersebut mungkin membaik belakangan ini.

Seperti yang telah disebutkan oleh komentar lain, beberapa pengaturan ini ( DOT_GRAPH_MAX_NODESkhususnya) memang memiliki potensi dampak kinerja, jadi YMMV.

Saya cenderung membenci jawaban bergaya "RTFM", jadi mohon maaf atas kalimat ini, tetapi dalam hal ini dokumentasi Doxygen benar-benar adalah teman Anda, jadi periksa dokumen Doxygen pada pengaturan yang disebutkan di atas- terakhir kali saya melihat Anda dapat menemukan detailnya di http://www.doxygen.nl/manual/config.html .


Jawaban yang bagus. Dalam jawaban Anda, Anda menulis "CLASS _DIAGRAMS", bukan "CLASS_GRAPH".
DavidS

Hmm, sebenarnya, sekarang Anda mengungkitnya, saya melihat saya memiliki CLASS_DIAGRAMS = YES dan CLASS_GRAPH = YES. Setelah memeriksa dokumen untuk Doxygen 1.8.9.1 saya menemukan bahwa sebenarnya CLASS_GRAPH = YES akan menimpa CLASS_DIAGRAMS = YES sehingga dua opsi berinteraksi, dengan CLASS_GRAPH = YES diutamakan. Jadi, sebenarnya, untuk tujuan pertanyaan awal apa yang saya miliki akan berhasil, tetapi tangkapan yang bagus!
pengguna6092647

Anda juga dapat mengubah OUTPUT_DIRECTORY dan mengizinkan pencarian RECURSIVE
King's jester

Anda mungkin juga perlu mengubah file RECURSIVEmenjadi YA
prehistoricpenguin

6

Arsitek Perusahaan akan membangun diagram UML dari kode sumber yang diimpor.


Suka karena juga menjawab pertanyaan "Jika ada alat yang lebih baik untuk melakukan ini dengan lebih mudah, beri tahu saya."
kaveish

5

Saya pikir Anda perlu mengedit file doxys dan mengatur GENERATE_UML (sesuatu seperti itu) menjadi true. Dan Anda harus sudah menginstal dot / graphviz.


12
Apakah Anda berbicara tentang opsi UML_LOOK?
David Doria

@Doria harus. Tetapi UML_LOOK tidak akan menampilkan tipe data apa pun.
Ruud Verhoef

2

2 jawaban positif tertinggi benar. Untuk hari ini, satu-satunya hal yang perlu saya ubah (dari pengaturan default) adalah mengaktifkan pembuatan menggunakan titik, bukan generator bawaan .

Beberapa catatan penting:

  • Doxygen tidak akan menghasilkan diagram lengkap sebenarnya dari semua kelas dalam proyek . Ini akan menghasilkan gambar terpisah untuk setiap hierarki. Jika Anda memiliki beberapa hierarki kelas yang tidak terkait, Anda akan mendapatkan banyak gambar.
  • Semua diagram ini dapat ditemukan di html/inherits.htmlatau (dari navigasi situs web) kelas => hierarki kelas => "Pergi ke hierarki kelas tekstual".
  • Ini adalah pertanyaan C ++, jadi mari kita bicara tentang template. Apalagi jika Anda mewarisi T.
    • Setiap contoh template akan dianggap sebagai tipe yang berbeda oleh Doxygen. Jenis yang mewarisi dari instan yang berbeda akan memiliki kelas induk yang berbeda pada diagram.
    • Jika template kelas foodiwarisi dari Tdan Tparameter jenis template memiliki default, default seperti itu akan dianggap. Jika ada tipe baryang mewarisi dari foo<U>mana Uberbeda dari default, barakan memiliki foo<U>induk. foo<>dan bar<U>tidak akan memiliki orang tua yang sama.
    • Jika ada beberapa template kelas yang mewarisi dari setidaknya satu parameter template-nya, Doxygen akan mengasumsikan induk yang sama untuk template kelas ini selama parameter jenis template memiliki nama yang persis sama di kode. Ini mendorong konsistensi dalam penamaan.
    • CRTP dan CRTP terbalik hanya berfungsi.
    • Pohon pewarisan template rekursif tidak diperluas. Setiap variantInstansiasi akan ditampilkan untuk mewarisi dari variant<Ts...>.
    • Template kelas tanpa instance sedang digambar. Mereka akan memiliki <...>string dalam namanya yang mewakili parameter tipe dan non-tipe yang tidak memiliki default.
    • Template kelas spesialisasi penuh dan sebagian juga sedang digambar. Doxygen menghasilkan grafik yang benar jika spesialisasi diturunkan dari jenis yang berbeda.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.