Cách sử dụng doxygen để tạo sơ đồ lớp UML từ nguồn C ++


90

Tôi đã tìm kiếm một số tài liệu mô tả cách tạo sơ đồ lớp đơn giản bằng doxygen, nhưng không thể tìm thấy. Ai có thể giúp đỡ?

Tôi cần tạo sơ đồ như hình dưới đây từ một tập hợp các tệp C ++. văn bản thay thế

Nếu có công cụ tốt hơn để đạt được điều này dễ dàng hơn, vui lòng cho tôi biết.


bạn có đạt được các sơ đồ như thế này bao gồm thông tin về các loại thuộc tính và phương thức không?
Adrian

Câu trả lời:


50

Doxygen tạo sơ đồ kế thừa nhưng tôi không nghĩ rằng nó sẽ tạo ra toàn bộ hệ thống phân cấp lớp. Nó cho phép bạn sử dụng công cụ GraphViz. Nếu bạn sử dụng công cụ giao diện người dùng Doxygen GUI, bạn sẽ tìm thấy các tùy chọn có liên quan Step2: -> Wizard tab -> Diagrams. Các tùy chọn quan hệ DOT nằm trong Tab Chuyên gia.


6
Bạn sẽ có thể điều hướng toàn bộ hệ thống phân cấp, giới hạn đối với những gì được hiển thị trên sơ đồ. Có một số tham số giới hạn phạm vi của biểu đồ. DOT_GRAPH_NODES giới hạn số lượng mục nhập trên một trang và MAX_DOT_GRAPH_DEPTH giới hạn độ sâu của trang. Việc đặt các giá trị này thành các giá trị lớn làm cho một dự án lớn rất mất thời gian.
DanS

Cảm ơn. Nó đã làm việc cho tôi. Tôi cũng đã ghi đè một số tùy chọn trong Expert-> Dot
tsenapathy

46

Trích dẫn từ bài đăng này (nó được viết bởi chính tác giả của 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
Điều này sẽ không tạo ra một sơ đồ lớp đầy đủ (ví dụ: mối quan hệ nhiều-một giữa lớp A và lớp B); chỉ một sơ đồ kế thừa, tức là, hiển thị các mối quan hệ lớp cha / lớp con.
stepthom

39

Hmm, đây có vẻ là một câu hỏi hơi cũ, nhưng vì tôi đã gặp rắc rối với cấu hình Doxygen vài ngày gần đây, trong khi đầu của tôi vẫn chứa đầy thông tin hiện tại, hãy tìm hiểu kỹ -

Tôi nghĩ rằng các câu trả lời trước hầu như có nó:

Tùy chọn còn thiếu là thêm COLLABORATION_GRAPH = YESDoxyfile. Tôi giả sử bạn có thể làm điều tương tự ở đâu đó trong GUI doxywizard (tôi không sử dụng doxywizard).

Vì vậy, như một ví dụ đầy đủ hơn, các tùy chọn "Doxyfile" điển hình liên quan đến đầu ra UML mà tôi có xu hướng sử dụng là:

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

Các cài đặt này sẽ tạo ra cả sơ đồ "kế thừa" ( CLASS_GRAPH=YES) và "cộng tác" ( COLLABORATION_GRAPH=YES).

Tùy thuộc vào mục tiêu của bạn để "triển khai" đầu ra doxygen, cài đặt DOT_IMAGE_FORMAT = svgcũng có thể được sử dụng. Với đầu ra svg, các sơ đồ có thể "mở rộng" thay vì độ phân giải cố định của các định dạng bitmap như .png. Rõ ràng, nếu xem kết quả đầu ra trong các trình duyệt khác ngoài IE, nó cũng INTERACTIVE_SVG = YESsẽ cho phép "phóng to và xoay tương tác" các biểu đồ svg được tạo. Tôi đã thử điều này một thời gian trước và đầu ra svg rất hấp dẫn trực quan, nhưng tại thời điểm đó, hỗ trợ của trình duyệt cho svg vẫn còn một chút không nhất quán, vì vậy hy vọng tình trạng đó có thể được cải thiện gần đây.

Như các nhận xét khác đã đề cập, một số cài đặt này ( DOT_GRAPH_MAX_NODESđặc biệt) có tác động tiềm tàng đến hiệu suất, vì vậy YMMV.

Tôi có xu hướng ghét câu trả lời kiểu "RTFM", vì vậy xin lỗi vì câu này, nhưng trong trường hợp này, tài liệu Doxygen thực sự là bạn của bạn, vì vậy hãy xem tài liệu Doxygen về cài đặt được đề cập ở trên - lần trước tôi đã xem xét, bạn có thể tìm thấy chi tiết tại http://www.doxygen.nl/manual/config.html .


Câu trả lời tốt. Trong câu trả lời của mình, bạn đã viết "CLASS _DIAGRAMS" thay vì "CLASS_GRAPH".
DavidS

Hmm, thực ra, bây giờ bạn đưa nó lên, tôi thấy tôi có cả CLASS_DIAGRAMS = YES và CLASS_GRAPH = YES. Sau khi kiểm tra các tài liệu cho Doxygen 1.8.9.1, tôi thấy rằng thực sự CLASS_GRAPH = YES sẽ ghi đè CLASS_DIAGRAMS = YES để hai tùy chọn tương tác với nhau, CLASS_GRAPH = YES được ưu tiên hơn. Vì vậy, trên thực tế, với mục đích của câu hỏi ban đầu, những gì tôi có sẽ hoạt động, tuy nhiên, bắt tốt!
user6092647

bạn cũng có thể thay đổi OUTPUT_DIRECTORY và cho phép tìm kiếm RECURSIVE
King's jester

Bạn cũng có thể cần phải thay đổi RECURSIVEhồ sơ thành CÓ
prehistoricpenguin

6

Enterprise Architect sẽ xây dựng một sơ đồ UML từ mã nguồn đã nhập.


Được ủng hộ vì cũng trả lời câu hỏi "Nếu có công cụ tốt hơn để đạt được điều này dễ dàng hơn, vui lòng cho tôi biết."
kaveish

5

Tôi nghĩ bạn sẽ cần chỉnh sửa tệp doxys và đặt GENERATE_UML (tương tự như vậy) thành true. Và bạn cần phải cài đặt dot / graphviz.


12
Bạn đang nói về tùy chọn UML_LOOK?
David Doria

@DavidDoria phải là. Nhưng UML_LOOK sẽ không hiển thị bất kỳ kiểu dữ liệu nào.
Ruud Verhoef

2

2 câu trả lời được ủng hộ cao nhất là đúng. Cho đến hôm nay, điều duy nhất tôi cần thay đổi (từ cài đặt mặc định) là bật tạo bằng dấu chấm thay vì trình tạo tích hợp.

Một số lưu ý quan trọng:

  • Doxygen sẽ không tạo ra một sơ đồ đầy đủ thực tế của tất cả các lớp trong dự án . Nó sẽ tạo một hình ảnh riêng biệt cho mỗi hệ thống phân cấp. Nếu bạn có nhiều phân cấp lớp không liên quan, bạn sẽ nhận được nhiều hình ảnh.
  • Tất cả các sơ đồ này có thể được tìm thấy trong html/inherits.htmlhoặc (từ điều hướng trang web) các lớp => phân cấp lớp => "Chuyển đến hệ thống phân cấp lớp văn bản".
  • Đây là một câu hỏi C ++, vì vậy hãy nói về các mẫu. Đặc biệt nếu bạn thừa kế từ T.
    • Mỗi phiên bản mẫu sẽ được Doxygen coi là một kiểu khác nhau một cách chính xác. Các kiểu kế thừa từ các phiên bản khác nhau sẽ có các lớp cha khác nhau trên sơ đồ.
    • Nếu mẫu lớp fookế thừa từ TTtham số kiểu mẫu có giá trị mặc định, thì giá trị mặc định đó sẽ được giả định. Nếu có một kiểu barkế thừa từ foo<U>đâu Ukhác với kiểu mặc định, barsẽ có một kiểu foo<U>mẹ. foo<>bar<U>sẽ không có cha mẹ chung.
    • Nếu có nhiều mẫu lớp kế thừa từ ít nhất một trong các tham số mẫu của chúng, Doxygen sẽ giả định là mẫu cha chung cho các mẫu lớp này miễn là các tham số kiểu mẫu có tên chính xác trong mã. Điều này khuyến khích sự nhất quán trong cách đặt tên.
    • CRTP và CRTP đảo ngược chỉ hoạt động.
    • Cây kế thừa mẫu đệ quy không được mở rộng. Mọi variantkhởi tạo sẽ được hiển thị để kế thừa từ đó variant<Ts...>.
    • Các mẫu lớp không có phần thuyết minh đang được vẽ. Chúng sẽ có một <...>chuỗi trong tên biểu thị các tham số kiểu và không phải kiểu không có giá trị mặc định.
    • Mẫu lớp học đầy đủ và một phần chuyên môn cũng đang được vẽ. Doxygen tạo ra các đồ thị chính xác nếu các chuyên ngành kế thừa từ các kiểu khác nhau.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.