C ++ kaynağından UML sınıf diyagramları oluşturmak için doxygen nasıl kullanılır


94

Doxygen ile basit sınıf diyagramlarının nasıl oluşturulacağını açıklayan bazı materyaller arıyordum, ancak bulamadım. Biri yardım edebilir mi?

Aşağıda gösterildiği gibi bir dizi C ++ dosyasından diyagramlar oluşturmam gerekiyor. alternatif metin

Bunu daha kolay başarmak için daha iyi araçlar varsa lütfen bana bildirin.


öznitelik ve yöntem türleri hakkında bilgi içeren bunun gibi diyagramlar elde ettiniz mi?
IzZy

Yanıtlar:


53

Doxygen, kalıtım diyagramları oluşturur, ancak bunun bütün bir sınıf hiyerarşisi yaratacağını düşünmüyorum. GraphViz aracını kullanmanıza izin veriyor. Doxygen GUI ön uç aracını kullanırsanız, ilgili seçenekleri içinde bulabilirsiniz Step2: -> Wizard tab -> Diagrams. DOT ilişkisi seçenekleri Uzman Sekmesinin altındadır.


6
Tüm hiyerarşide gezinebileceksiniz, sınırlar bir diyagramda gösterilenlerle ilgilidir. Grafiğin kapsamını sınırlayan birkaç parametre vardır. DOT_GRAPH_NODES, tek bir sayfadaki giriş sayısını sınırlar ve MAX_DOT_GRAPH_DEPTH ne kadar derinleşeceğini kısıtlar. Bunları büyük değerlere ayarlamak, büyük bir proje için çok zaman alıcı hale getirir.
DanS

Teşekkürler. Benim için çalıştı. Ayrıca
Uzman-

46

Bu gönderiden alıntı (doxygen'in yazarı tarafından yazılmıştır):

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
Bu tam bir sınıf diyagramı oluşturmaz (örneğin, A sınıfı ve B sınıfı arasındaki çoka bir ilişki); yalnızca bir kalıtım diyagramı, yani üst sınıf / alt sınıf ilişkilerini gösterir.
stepthom

44

Hmm, bu biraz eski bir soru gibi görünüyor, ancak son birkaç gündür Doxygen konfigürasyonuyla uğraştığım için, kafam hala güncel bilgilerle doluyken, ona bir göz atalım -

Sanırım önceki cevaplarda neredeyse var:

Eksik seçenek COLLABORATION_GRAPH = YESDoxyfile'a eklemektir. Doxywizard GUI'de bir yerde eşdeğer bir şeyi yapabileceğinizi varsayıyorum (doxywizard kullanmıyorum).

Bu nedenle, daha eksiksiz bir örnek olarak, UML çıktısıyla ilgili, kullanma eğiliminde olduğum tipik "Doxyfile" seçenekleri şunlardır:

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

Bu ayarlar hem "devralma" ( CLASS_GRAPH=YES) hem de "işbirliği" ( COLLABORATION_GRAPH=YES) diyagramları oluşturacaktır.

Oksijen çıkışının "yerleştirilmesi" hedefinize bağlı olarak, DOT_IMAGE_FORMAT = svg da yararlı olabilir. Svg çıktısı ile diyagramlar, .png gibi bitmap formatlarının sabit çözünürlüğü yerine "ölçeklenebilir" dir. Görünüşe göre, çıktıyı IE dışındaki tarayıcılarda görüntülüyorsanız INTERACTIVE_SVG = YES, oluşturulan svg diyagramlarının "etkileşimli yakınlaştırmasına ve kaydırmasına" izin veren de vardır. Bunu bir süre önce denedim ve svg çıktısı görsel olarak çok çekiciydi, ancak o zamanlar svg için tarayıcı desteği hala biraz tutarsızdı, bu yüzden umarım bu durum son zamanlarda iyileşmiş olabilir.

Diğer yorumların da belirttiği gibi, bu ayarlardan bazıları (DOT_GRAPH_MAX_NODES özellikle) potansiyel performans etkileri vardır, yani YMMV.

"RTFM" tarzı cevaplardan nefret etme eğilimindeyim, bu yüzden bu cümle için özür dilerim, ancak bu durumda Doxygen belgeleri gerçekten senin arkadaşın, bu yüzden yukarıda belirtilen ayarlarla ilgili Doxygen belgelerine göz at - en son baktığımda ayrıntıları şurada bulabilirsin http://www.doxygen.nl/manual/config.html .


İyi cevap. Cevabınızda "CLASS_GRAPH" ise "CLASS _DIAGRAMS" yazdınız.
Davids

Hmm, aslında, şimdi onu açıyorsun, görüyorum ki hem CLASS_DIAGRAMS = YES hem de CLASS_GRAPH = EVET var. Doxygen 1.8.9.1 için dokümanları kontrol ettikten sonra, CLASS_GRAPH = YES'in CLASS_DIAGRAMS = YES'i geçersiz kıldığını ve böylece CLASS_GRAPH = YES öncelikli olacak şekilde iki seçeneğin etkileşime gireceğini buldum. Öyleyse, aslında, ilk sorunun amaçları doğrultusunda, sahip olduğum şey işe yarayacak, yine de iyi bir yakalama!
user6092647

ayrıca OUTPUT_DIRECTORY'i değiştirebilir ve RECURSIVE aramasına izin verebilirsiniz
King's jester

Dosyayı RECURSIVEEVET olarak da değiştirmeniz gerekebilir
prehistoricpenguin

6

Enterprise Architect, içe aktarılan kaynak koddan bir UML diyagramı oluşturacaktır.


"Bunu daha kolay başarmak için daha iyi araçlar varsa, lütfen bana bildirin" sorusunu da yanıtladığı için oy verildi.
kaveish

5

Doxys dosyasını düzenlemeniz ve GENERATE_UML'yi (bunun gibi bir şey) true olarak ayarlamanız gerekeceğini düşünüyorum. Ve dot / graphviz'in kurulu olması gerekir.


12
UML_LOOK seçeneğinden mi bahsediyorsunuz?
David Doria

@DavidDoria olmalı. Ancak UML_LOOK herhangi bir veri türünü göstermeyecektir.
Ruud Verhoef

2

En yüksek oy alan 2 cevap doğrudur. Bugün itibariyle, (varsayılan ayarlardan) değiştirmem gereken tek şey , yerleşik jeneratör yerine nokta kullanarak üretimi etkinleştirmekti .

Bazı önemli notlar:

  • Doxygen, projedeki tüm sınıfların gerçek bir tam diyagramını oluşturmayacaktır . Her hiyerarşi için ayrı bir görüntü oluşturacaktır. Birden fazla, ilgisiz sınıf hiyerarşiniz varsa, birden çok görüntü elde edersiniz.
  • Tüm bu diyagramlar, html/inherits.htmlsınıflar => sınıf hiyerarşisi => "Metinsel sınıf hiyerarşisine git" veya (web sitesi navigasyonundan) bulunabilir.
  • Bu bir C ++ sorusu, bu yüzden şablonlar hakkında konuşalım. Özellikle miras alırsanız T.
    • Her şablon somutlaştırması, Doxygen tarafından doğru şekilde farklı bir tür olarak kabul edilecektir. Farklı anlıklardan miras alan türler, diyagram üzerinde farklı ebeveyn sınıflarına sahip olacaktır.
    • Bir sınıf şablonu fooöğesinden miras alıyorsa Tve Tşablon türü parametresinin bir varsayılanı varsa, bu tür bir varsayılan kabul edilecektir. Varsayılandan farklı olduğu yerden bardevralan bir tür varsa , bir ebeveyni olacaktır . vefoo<U>Ubarfoo<U>foo<>bar<U> ortak bir ebeveyni olmayacak.
    • Şablon parametrelerinden en az birinden devralan birden fazla sınıf şablonu varsa, şablon türü parametreleri kodda tam olarak aynı adlara sahip olduğu sürece Doxygen bu sınıf şablonları için ortak bir üst öğe varsayacaktır. Bu, isimlendirmede tutarlılığı teşvik eder.
    • CRTP ve ters CRTP sadece çalışır.
    • Özyinelemeli şablon miras ağaçları genişletilmez. Herhangi bir variantörnekleme, miras almak için görüntülenecektir variant<Ts...>.
    • Örneği olmayan sınıf şablonları çiziliyor. Sahip olacaklar<...> tür ve tür olmayan parametreleri temsil eden, varsayılanları olmayan dizeye sahip olacaklardır.
    • Sınıf şablonu tam ve kısmi uzmanlıklar da çiziliyor. Uzmanlıklar farklı türlerden miras alıyorsa, Doxygen doğru grafikler üretir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.