วิธีใช้ doxygen เพื่อสร้างไดอะแกรมคลาส UML จากซอร์ส C ++


94

ฉันค้นหาเนื้อหาบางอย่างที่อธิบายวิธีการสร้างไดอะแกรมคลาสง่ายๆด้วย doxygen แต่ไม่พบ ใครสามารถช่วย?

ฉันต้องการสร้างไดอะแกรมดังที่แสดงด้านล่างจากชุดไฟล์ C ++ ข้อความแสดงแทน

หากมีเครื่องมือที่ดีกว่าเพื่อให้ทำได้ง่ายขึ้นโปรดแจ้งให้เราทราบ


คุณได้ไดอะแกรมเช่นนี้รวมถึงข้อมูลเกี่ยวกับแอตทริบิวต์และประเภทวิธีการหรือไม่
IzZy

คำตอบ:


53

Doxygen สร้างแผนภาพการสืบทอด แต่ฉันไม่คิดว่ามันจะสร้างชั้นเรียนทั้งหมด อนุญาตให้คุณใช้เครื่องมือ GraphViz หากคุณใช้เครื่องมือส่วนหน้าของ Doxygen GUI คุณจะพบตัวเลือกที่เกี่ยวข้องในStep2: -> Wizard tab -> Diagrams. ตัวเลือกความสัมพันธ์ DOT อยู่ภายใต้แท็บผู้เชี่ยวชาญ


6
คุณจะสามารถนำทางได้ทั้งลำดับชั้นขีด จำกัด อยู่ที่สิ่งที่แสดงบนไดอะแกรม มีพารามิเตอร์สองสามตัวที่ จำกัด ขอบเขตของกราฟ DOT_GRAPH_NODES จำกัด จำนวนรายการในหน้าเดียวและ MAX_DOT_GRAPH_DEPTH จะ จำกัด ความลึกของข้อมูล การตั้งค่าเหล่านี้เป็นค่าขนาดใหญ่ทำให้โครงการขนาดใหญ่ใช้เวลานานมาก
DanS

ขอบคุณ. มันได้ผลสำหรับฉัน ฉันได้ลบล้างตัวเลือกบางอย่างใน Expert-> Dot
tsenapathy

46

อ้างจากโพสต์นี้ (เขียนโดยผู้เขียน 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
สิ่งนี้จะไม่สร้างแผนภาพคลาสแบบเต็ม (เช่นความสัมพันธ์แบบกลุ่มต่อกลุ่มระหว่างคลาส A และคลาส B) แผนภาพการสืบทอดเท่านั้นกล่าวคือแสดงความสัมพันธ์ระดับซุปเปอร์คลาส / คลาสย่อย
stepthom

44

อืมดูเหมือนจะเป็นคำถามเก่า ๆ แต่เนื่องจากฉันยุ่งเกี่ยวกับการกำหนดค่า Doxygen เมื่อไม่กี่วันที่ผ่านมาในขณะที่หัวของฉันยังคงเต็มไปด้วยข้อมูลปัจจุบันเรามาดูกันดีกว่า -

ฉันคิดว่าคำตอบก่อนหน้านี้เกือบจะมี:

ตัวเลือกที่ขาดหายไปคือการเพิ่มCOLLABORATION_GRAPH = YESใน Doxyfile ฉันคิดว่าคุณสามารถทำสิ่งที่เทียบเท่าได้ที่ไหนสักแห่งใน doxywizard GUI (ฉันไม่ได้ใช้ doxywizard)

ดังนั้นเพื่อเป็นตัวอย่างที่สมบูรณ์ยิ่งขึ้นตัวเลือก "Doxyfile" ทั่วไปที่เกี่ยวข้องกับเอาต์พุต UML ที่ฉันมักจะใช้คือ:

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

การตั้งค่าเหล่านี้จะสร้างทั้งไดอะแกรม"การสืบทอด" ( CLASS_GRAPH=YES) และ "การทำงานร่วมกัน" ( COLLABORATION_GRAPH=YES)

ขึ้นอยู่กับเป้าหมายของคุณสำหรับ "การปรับใช้" ของเอาต์พุต doxygen การตั้งค่าDOT_IMAGE_FORMAT = svgอาจใช้งานได้เช่นกัน ด้วยเอาต์พุต svg ไดอะแกรมจะ "ปรับขนาดได้" แทนที่จะเป็นความละเอียดคงที่ของรูปแบบบิตแมปเช่น. png เห็นได้ชัดว่าหากดูผลลัพธ์ในเบราว์เซอร์อื่นที่ไม่ใช่ IE INTERACTIVE_SVG = YESจะมี "การซูมและการแพนแบบโต้ตอบ" ของไดอะแกรม svg ที่สร้างขึ้นด้วย ฉันได้ลองทำสิ่งนี้เมื่อไม่นานมานี้และเอาต์พุต svg นั้นดึงดูดสายตามาก แต่ในขณะนั้นการรองรับเบราว์เซอร์สำหรับ svg ยังไม่สอดคล้องกันเล็กน้อยดังนั้นหวังว่าสถานการณ์จะดีขึ้นในเร็ว ๆ นี้

ดังที่ความคิดเห็นอื่น ๆ ได้กล่าวไว้การตั้งค่าบางอย่าง ( DOT_GRAPH_MAX_NODESโดยเฉพาะ) เหล่านี้อาจส่งผลกระทบต่อประสิทธิภาพดังนั้น YMMV

ฉันมักจะเกลียดคำตอบสไตล์ "RTFM" ดังนั้นขอโทษสำหรับประโยคนี้ แต่ในกรณีนี้เอกสาร Doxygen เป็นเพื่อนของคุณจริงๆดังนั้นโปรดตรวจสอบเอกสาร Doxygen ในการตั้งค่าที่กล่าวถึงข้างต้น - ครั้งสุดท้ายที่ฉันดูคุณสามารถดูรายละเอียดได้ที่http://www.doxygen.nl/manual/config.html


คำตอบที่ดี. ในคำตอบของคุณคุณเขียนว่า "CLASS _DIAGRAMS" แทนถ้า "CLASS_GRAPH"
DavidS

อืมตอนนี้คุณนำมันขึ้นมาฉันเห็นว่าฉันมีทั้ง CLASS_DIAGRAMS = YES และ CLASS_GRAPH = YES หลังจากตรวจสอบเอกสารสำหรับ Doxygen 1.8.9.1 ฉันพบว่าจริงๆแล้ว CLASS_GRAPH = YES จะแทนที่ CLASS_DIAGRAMS = YES เพื่อให้ตัวเลือกทั้งสองโต้ตอบกันโดยมี CLASS_GRAPH = YES นำหน้า ดังนั้นสำหรับจุดประสงค์ของคำถามเดิมสิ่งที่ฉันมีจะได้ผลอย่างไรก็ตามการจับที่ดี!
user6092647

คุณยังสามารถเปลี่ยน OUTPUT_DIRECTORY และอนุญาตการค้นหา RECURSIVE
King's

คุณอาจต้องเปลี่ยนไฟล์ที่RECURSIVEยื่นเป็น YES
เพนกวินยุคก่อนประวัติศาสตร์

6

Enterprise Architect จะสร้างแผนภาพ UML จากซอร์สโค้ดที่นำเข้า


ได้รับการโหวตให้ตอบคำถาม "หากมีเครื่องมือที่ดีกว่านี้เพื่อให้บรรลุผลได้ง่ายขึ้นโปรดแจ้งให้เราทราบ"
kaveish

5

ฉันคิดว่าคุณจะต้องแก้ไขไฟล์ doxys และตั้งค่า GENERATE_UML (อะไรทำนองนั้น) เป็น true และคุณต้องติดตั้ง dot / graphviz


12
คุณกำลังพูดถึงตัวเลือก UML_LOOK หรือไม่?
David Doria

@DavidDoria ต้อง. แต่ UML_LOOK จะไม่แสดงประเภทข้อมูลใด ๆ
Ruud Verhoef

2

คำตอบที่ได้รับการโหวตสูงสุด 2 คำตอบถูกต้อง ณ วันนี้สิ่งเดียวที่ฉันต้องเปลี่ยน (จากการตั้งค่าเริ่มต้น) คือเปิดใช้งานการสร้างโดยใช้จุดแทนตัวสร้างในตัว

หมายเหตุสำคัญบางประการ:

  • Doxygen จะไม่สร้างแผนภาพจริงเต็มรูปแบบของการเรียนทั้งหมดในโครงการ มันจะสร้างภาพแยกกันสำหรับแต่ละลำดับชั้น หากคุณมีลำดับชั้นหลายชั้นที่ไม่เกี่ยวข้องกันคุณจะได้ภาพหลายภาพ
  • ไดอะแกรมทั้งหมดนี้สามารถพบได้ในhtml/inherits.htmlหรือ (จากการนำทางเว็บไซต์) คลาส => ลำดับชั้นของคลาส => "ไปที่ลำดับชั้นคลาสแบบข้อความ"
  • นี่คือคำถาม C ++ ดังนั้นเรามาพูดถึงเทมเพลตกันดีกว่า Tโดยเฉพาะอย่างยิ่งถ้าคุณได้รับมรดกจาก
    • การสร้างอินสแตนซ์เทมเพลตแต่ละแบบจะถือว่าเป็นประเภทที่แตกต่างกันอย่างถูกต้องโดย Doxygen ประเภทที่สืบทอดมาจากอินสแตนซ์ต่างๆจะมีคลาสพาเรนต์ที่แตกต่างกันบนไดอะแกรม
    • หากเทมเพลตคลาสfooสืบทอดมาจากTและTพารามิเตอร์ชนิดเทมเพลตมีค่าดีฟอลต์จะถือว่าค่าดีฟอลต์ดังกล่าว หากมีชนิดbarซึ่งสืบทอดมาจากfoo<U>ที่Uแตกต่างจากการเริ่มต้นที่barจะมีfoo<U>ผู้ปกครอง foo<>และbar<U>จะไม่มีพ่อแม่ร่วมกัน
    • หากมีเทมเพลตหลายคลาสที่สืบทอดมาจากพารามิเตอร์เทมเพลตอย่างน้อยหนึ่งพารามิเตอร์ Doxygen จะถือว่าเป็นพาเรนต์ทั่วไปสำหรับเทมเพลตคลาสเหล่านี้ตราบใดที่พารามิเตอร์ประเภทเทมเพลตมีชื่อเดียวกันทุกประการในโค้ด สิ่งนี้กระตุ้นให้เกิดความสม่ำเสมอในการตั้งชื่อ
    • CRTP และย้อนกลับ CRTP ก็ใช้งานได้
    • แผนผังการสืบทอดเทมเพลตแบบเรียกซ้ำจะไม่ขยาย ใด ๆvariantinstantiation variant<Ts...>จะปรากฏแก่สืบทอดมาจาก
    • เทมเพลตคลาสที่ไม่มีการสร้างอินสแตนซ์กำลังถูกดึงออกมา พวกเขาจะมี<...>สตริงในชื่อที่แสดงถึงพารามิเตอร์ประเภทและชนิดที่ไม่ใช่ประเภทซึ่งไม่มีค่าเริ่มต้น
    • นอกจากนี้ยังมีการดึงความเชี่ยวชาญเฉพาะด้านของเทมเพลตคลาสแบบเต็มและบางส่วน Doxygen สร้างกราฟที่ถูกต้องหากความเชี่ยวชาญพิเศษสืบทอดมาจากประเภทต่างๆ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.