sirena 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/build_deploy.yml +59 -0
- data/.github/workflows/links.yml +85 -0
- data/.github/workflows/rake.yml +15 -0
- data/.github/workflows/release.yml +27 -0
- data/.gitignore +68 -0
- data/.rspec +3 -0
- data/.rubocop.yml +14 -0
- data/.rubocop_todo.yml +70 -0
- data/ARCHITECTURE.md +744 -0
- data/Gemfile +12 -0
- data/LICENSE +25 -0
- data/README.adoc +357 -0
- data/Rakefile +11 -0
- data/docs/.gitignore +1 -0
- data/docs/Gemfile +13 -0
- data/docs/_config.yml +182 -0
- data/docs/_diagram_types/architecture-diagram.adoc +314 -0
- data/docs/_diagram_types/block-diagram.adoc +345 -0
- data/docs/_diagram_types/c4-diagram.adoc +559 -0
- data/docs/_diagram_types/class-diagram.adoc +816 -0
- data/docs/_diagram_types/er-diagram.adoc +719 -0
- data/docs/_diagram_types/error-diagram.adoc +114 -0
- data/docs/_diagram_types/examples/flowchart-examples.adoc +29 -0
- data/docs/_diagram_types/flowchart.adoc +488 -0
- data/docs/_diagram_types/gantt-chart.adoc +502 -0
- data/docs/_diagram_types/git-graph.adoc +600 -0
- data/docs/_diagram_types/index.adoc +192 -0
- data/docs/_diagram_types/info-diagram.adoc +103 -0
- data/docs/_diagram_types/kanban-diagram.adoc +262 -0
- data/docs/_diagram_types/mindmap.adoc +603 -0
- data/docs/_diagram_types/packet-diagram.adoc +378 -0
- data/docs/_diagram_types/pie-chart.adoc +335 -0
- data/docs/_diagram_types/quadrant-chart.adoc +406 -0
- data/docs/_diagram_types/radar-chart.adoc +528 -0
- data/docs/_diagram_types/requirement-diagram.adoc +416 -0
- data/docs/_diagram_types/sankey-diagram.adoc +357 -0
- data/docs/_diagram_types/sequence-diagram.adoc +664 -0
- data/docs/_diagram_types/state-diagram.adoc +658 -0
- data/docs/_diagram_types/timeline.adoc +352 -0
- data/docs/_diagram_types/treemap-diagram.adoc +462 -0
- data/docs/_diagram_types/user-journey.adoc +602 -0
- data/docs/_features/index.adoc +129 -0
- data/docs/_guides/cli-reference.adoc +203 -0
- data/docs/_guides/index.adoc +56 -0
- data/docs/_guides/installation.adoc +100 -0
- data/docs/_guides/quick-start.adoc +132 -0
- data/docs/_pages/comparison.adoc +441 -0
- data/docs/_pages/compatibility.adoc +300 -0
- data/docs/_pages/index.adoc +39 -0
- data/docs/_references/index.adoc +103 -0
- data/docs/_tutorials/index.adoc +57 -0
- data/docs/index.adoc +166 -0
- data/docs/lychee.toml +54 -0
- data/examples/.gitignore +10 -0
- data/examples/README.adoc +196 -0
- data/examples/README.md +64 -0
- data/examples/architecture/01-basic-services.mmd +9 -0
- data/examples/architecture/01-basic-services.svg +37 -0
- data/examples/architecture/02-service-groups.mmd +16 -0
- data/examples/architecture/02-service-groups.svg +55 -0
- data/examples/architecture/README.adoc +79 -0
- data/examples/block/01-basic-blocks.mmd +13 -0
- data/examples/block/01-basic-blocks.svg +44 -0
- data/examples/block/02-block-shapes.mmd +13 -0
- data/examples/block/02-block-shapes.svg +47 -0
- data/examples/block/README.adoc +85 -0
- data/examples/c4/01-context-diagram.mmd +10 -0
- data/examples/c4/01-context-diagram.svg +45 -0
- data/examples/c4/02-container-diagram.mmd +24 -0
- data/examples/c4/02-container-diagram.svg +105 -0
- data/examples/c4/README.adoc +92 -0
- data/examples/class_diagram/01-basic-classes.mmd +61 -0
- data/examples/class_diagram/01-basic-classes.svg +117 -0
- data/examples/class_diagram/02-relationships.mmd +61 -0
- data/examples/class_diagram/02-relationships.svg +129 -0
- data/examples/class_diagram/README.adoc +93 -0
- data/examples/er_diagram/01-basic-entities.mmd +64 -0
- data/examples/er_diagram/01-basic-entities.svg +5 -0
- data/examples/er_diagram/02-cardinality.mmd +57 -0
- data/examples/er_diagram/02-cardinality.svg +125 -0
- data/examples/er_diagram/README.adoc +88 -0
- data/examples/error/01-basic-error.mmd +1 -0
- data/examples/error/01-basic-error.svg +13 -0
- data/examples/error/02-error-display.mmd +1 -0
- data/examples/error/02-error-display.svg +13 -0
- data/examples/error/README.adoc +71 -0
- data/examples/error_message_example.svg +13 -0
- data/examples/flowchart/00-original.mmd +13 -0
- data/examples/flowchart/00-original.svg +5 -0
- data/examples/flowchart/01-basic-flow.mmd +7 -0
- data/examples/flowchart/01-basic-flow.svg +52 -0
- data/examples/flowchart/01-basic-flow.yml +13 -0
- data/examples/flowchart/02*.svg +87 -0
- data/examples/flowchart/02-node-shapes.mmd +9 -0
- data/examples/flowchart/02-node-shapes.svg +33 -0
- data/examples/flowchart/03-edge-types.mmd +7 -0
- data/examples/flowchart/03-edge-types.svg +53 -0
- data/examples/flowchart/04-subgraphs.mmd +9 -0
- data/examples/flowchart/04-subgraphs.svg +33 -0
- data/examples/flowchart/05-styling.mmd +9 -0
- data/examples/flowchart/05-styling.svg +33 -0
- data/examples/flowchart/06-complex-flow.mmd +8 -0
- data/examples/flowchart/06-complex-flow.svg +59 -0
- data/examples/flowchart/README.adoc +167 -0
- data/examples/gantt/01-simple-timeline.* +14 -0
- data/examples/gantt/01-simple-timeline.mmd +6 -0
- data/examples/gantt/01-simple-timeline.svg +26 -0
- data/examples/gantt/02-task-dependencies.mmd +6 -0
- data/examples/gantt/02-task-dependencies.svg +26 -0
- data/examples/gantt/README.adoc +86 -0
- data/examples/git_graph/01-linear-history.mmd +12 -0
- data/examples/git_graph/01-linear-history.svg +26 -0
- data/examples/git_graph/02-branching.mmd +12 -0
- data/examples/git_graph/02-branching.svg +26 -0
- data/examples/git_graph/README.adoc +73 -0
- data/examples/info/02-showinfo.mmd +1 -0
- data/examples/info/02-showinfo.svg +10 -0
- data/examples/info/README.adoc +58 -0
- data/examples/info_showinfo_example.svg +10 -0
- data/examples/kanban/01-simple-board.mmd +8 -0
- data/examples/kanban/01-simple-board.svg +43 -0
- data/examples/kanban/02-workflow.mmd +8 -0
- data/examples/kanban/02-workflow.svg +43 -0
- data/examples/kanban/README.adoc +79 -0
- data/examples/mindmap/01-simple-tree.mmd +19 -0
- data/examples/mindmap/01-simple-tree.svg +61 -0
- data/examples/mindmap/02-knowledge-map.mmd +19 -0
- data/examples/mindmap/02-knowledge-map.svg +61 -0
- data/examples/mindmap/README.adoc +77 -0
- data/examples/packet/01-basic-packet.* +17 -0
- data/examples/packet/01-basic-packet.mmd +4 -0
- data/examples/packet/01-basic-packet.svg +82 -0
- data/examples/packet/README.adoc +58 -0
- data/examples/pie/01-simple-chart.mmd +5 -0
- data/examples/pie/01-simple-chart.svg +17 -0
- data/examples/pie/02-labeled-slices.mmd +6 -0
- data/examples/pie/02-labeled-slices.svg +19 -0
- data/examples/pie/README.adoc +75 -0
- data/examples/quadrant/01-basic-quadrant.mmd +13 -0
- data/examples/quadrant/01-basic-quadrant.svg +33 -0
- data/examples/quadrant/02-positioned-items.mmd +14 -0
- data/examples/quadrant/02-positioned-items.svg +35 -0
- data/examples/quadrant/README.adoc +84 -0
- data/examples/radar/01-simple-radar.* +5 -0
- data/examples/radar/01-simple-radar.mmd +3 -0
- data/examples/radar/01-simple-radar.svg +25 -0
- data/examples/radar/02-multiple-curves.mmd +4 -0
- data/examples/radar/02-multiple-curves.svg +43 -0
- data/examples/radar/README.adoc +75 -0
- data/examples/requirement/01-basic-requirements.mmd +23 -0
- data/examples/requirement/01-basic-requirements.svg +49 -0
- data/examples/requirement/02-risk-levels.mmd +23 -0
- data/examples/requirement/02-risk-levels.svg +49 -0
- data/examples/requirement/README.adoc +85 -0
- data/examples/sankey/01-simple-flow.mmd +7 -0
- data/examples/sankey/01-simple-flow.svg +34 -0
- data/examples/sankey/02-multi-stage.mmd +11 -0
- data/examples/sankey/02-multi-stage.svg +44 -0
- data/examples/sankey/README.adoc +74 -0
- data/examples/sequence/01-basic-sequence.mmd +27 -0
- data/examples/sequence/01-basic-sequence.svg +5 -0
- data/examples/sequence/02-activations.mmd +17 -0
- data/examples/sequence/02-activations.svg +78 -0
- data/examples/sequence/README.adoc +86 -0
- data/examples/state_diagram/01-simple-states.mmd +29 -0
- data/examples/state_diagram/01-simple-states.svg +5 -0
- data/examples/state_diagram/02-composite.mmd +19 -0
- data/examples/state_diagram/02-composite.svg +81 -0
- data/examples/state_diagram/README.adoc +90 -0
- data/examples/timeline/01-simple-timeline.mmd +11 -0
- data/examples/timeline/01-simple-timeline.svg +36 -0
- data/examples/timeline/02-periods.mmd +15 -0
- data/examples/timeline/02-periods.svg +47 -0
- data/examples/timeline/README.adoc +78 -0
- data/examples/treemap/01-basic-treemap.mmd +12 -0
- data/examples/treemap/01-basic-treemap.svg +59 -0
- data/examples/treemap/README.adoc +59 -0
- data/examples/user_journey/01-simple-journey.mmd +23 -0
- data/examples/user_journey/01-simple-journey.svg +5 -0
- data/examples/user_journey/02-multi-actor.mmd +18 -0
- data/examples/user_journey/02-multi-actor.svg +129 -0
- data/examples/user_journey/README.adoc +81 -0
- data/examples/xychart/01-line-chart.mmd +5 -0
- data/examples/xychart/01-line-chart.svg +43 -0
- data/examples/xychart/02-bar-chart.mmd +7 -0
- data/examples/xychart/02-bar-chart.svg +48 -0
- data/examples/xychart/README.adoc +80 -0
- data/exe/sirena +7 -0
- data/lib/sirena/cli.rb +138 -0
- data/lib/sirena/commands/batch.rb +117 -0
- data/lib/sirena/commands/render.rb +80 -0
- data/lib/sirena/commands/types.rb +29 -0
- data/lib/sirena/commands/version.rb +24 -0
- data/lib/sirena/diagram/architecture.rb +46 -0
- data/lib/sirena/diagram/base.rb +61 -0
- data/lib/sirena/diagram/block.rb +81 -0
- data/lib/sirena/diagram/c4.rb +328 -0
- data/lib/sirena/diagram/class_diagram.rb +385 -0
- data/lib/sirena/diagram/er_diagram.rb +238 -0
- data/lib/sirena/diagram/error.rb +38 -0
- data/lib/sirena/diagram/flowchart.rb +160 -0
- data/lib/sirena/diagram/gantt.rb +71 -0
- data/lib/sirena/diagram/git_graph.rb +36 -0
- data/lib/sirena/diagram/info.rb +38 -0
- data/lib/sirena/diagram/kanban.rb +178 -0
- data/lib/sirena/diagram/mindmap.rb +54 -0
- data/lib/sirena/diagram/packet.rb +79 -0
- data/lib/sirena/diagram/pie.rb +115 -0
- data/lib/sirena/diagram/quadrant.rb +138 -0
- data/lib/sirena/diagram/radar.rb +52 -0
- data/lib/sirena/diagram/requirement.rb +133 -0
- data/lib/sirena/diagram/sankey.rb +217 -0
- data/lib/sirena/diagram/sequence.rb +242 -0
- data/lib/sirena/diagram/state_diagram.rb +237 -0
- data/lib/sirena/diagram/timeline.rb +171 -0
- data/lib/sirena/diagram/treemap.rb +84 -0
- data/lib/sirena/diagram/user_journey.rb +149 -0
- data/lib/sirena/diagram/xy_chart.rb +76 -0
- data/lib/sirena/diagram.rb +8 -0
- data/lib/sirena/diagram_registry.rb +101 -0
- data/lib/sirena/engine.rb +292 -0
- data/lib/sirena/parser/architecture.rb +41 -0
- data/lib/sirena/parser/base.rb +41 -0
- data/lib/sirena/parser/block.rb +72 -0
- data/lib/sirena/parser/c4.rb +53 -0
- data/lib/sirena/parser/class_diagram.rb +63 -0
- data/lib/sirena/parser/er_diagram.rb +40 -0
- data/lib/sirena/parser/error.rb +49 -0
- data/lib/sirena/parser/flowchart.rb +71 -0
- data/lib/sirena/parser/gantt.rb +60 -0
- data/lib/sirena/parser/git_graph.rb +95 -0
- data/lib/sirena/parser/grammars/architecture.rb +145 -0
- data/lib/sirena/parser/grammars/block.rb +190 -0
- data/lib/sirena/parser/grammars/c4.rb +226 -0
- data/lib/sirena/parser/grammars/class_diagram.rb +284 -0
- data/lib/sirena/parser/grammars/common.rb +84 -0
- data/lib/sirena/parser/grammars/er_diagram.rb +114 -0
- data/lib/sirena/parser/grammars/error.rb +40 -0
- data/lib/sirena/parser/grammars/flowchart.rb +298 -0
- data/lib/sirena/parser/grammars/gantt.rb +252 -0
- data/lib/sirena/parser/grammars/git_graph.rb +167 -0
- data/lib/sirena/parser/grammars/info.rb +58 -0
- data/lib/sirena/parser/grammars/kanban.rb +83 -0
- data/lib/sirena/parser/grammars/mindmap.rb +115 -0
- data/lib/sirena/parser/grammars/packet.rb +73 -0
- data/lib/sirena/parser/grammars/pie.rb +128 -0
- data/lib/sirena/parser/grammars/quadrant.rb +199 -0
- data/lib/sirena/parser/grammars/radar.rb +150 -0
- data/lib/sirena/parser/grammars/requirement.rb +188 -0
- data/lib/sirena/parser/grammars/sankey.rb +104 -0
- data/lib/sirena/parser/grammars/sequence.rb +247 -0
- data/lib/sirena/parser/grammars/state_diagram.rb +172 -0
- data/lib/sirena/parser/grammars/timeline.rb +142 -0
- data/lib/sirena/parser/grammars/treemap.rb +120 -0
- data/lib/sirena/parser/grammars/xy_chart.rb +120 -0
- data/lib/sirena/parser/info.rb +49 -0
- data/lib/sirena/parser/kanban.rb +97 -0
- data/lib/sirena/parser/mindmap.rb +106 -0
- data/lib/sirena/parser/packet.rb +76 -0
- data/lib/sirena/parser/pie.rb +49 -0
- data/lib/sirena/parser/quadrant.rb +57 -0
- data/lib/sirena/parser/radar.rb +104 -0
- data/lib/sirena/parser/requirement.rb +70 -0
- data/lib/sirena/parser/sankey.rb +64 -0
- data/lib/sirena/parser/sequence.rb +51 -0
- data/lib/sirena/parser/state_diagram.rb +69 -0
- data/lib/sirena/parser/timeline.rb +57 -0
- data/lib/sirena/parser/transforms/architecture.rb +97 -0
- data/lib/sirena/parser/transforms/block.rb +254 -0
- data/lib/sirena/parser/transforms/c4.rb +347 -0
- data/lib/sirena/parser/transforms/class_diagram.rb +352 -0
- data/lib/sirena/parser/transforms/er_diagram.rb +169 -0
- data/lib/sirena/parser/transforms/error.rb +58 -0
- data/lib/sirena/parser/transforms/flowchart.rb +293 -0
- data/lib/sirena/parser/transforms/gantt.rb +215 -0
- data/lib/sirena/parser/transforms/git_graph.rb +160 -0
- data/lib/sirena/parser/transforms/info.rb +58 -0
- data/lib/sirena/parser/transforms/kanban.rb +176 -0
- data/lib/sirena/parser/transforms/mindmap.rb +227 -0
- data/lib/sirena/parser/transforms/packet.rb +63 -0
- data/lib/sirena/parser/transforms/pie.rb +143 -0
- data/lib/sirena/parser/transforms/quadrant.rb +177 -0
- data/lib/sirena/parser/transforms/radar.rb +126 -0
- data/lib/sirena/parser/transforms/requirement.rb +272 -0
- data/lib/sirena/parser/transforms/sankey.rb +122 -0
- data/lib/sirena/parser/transforms/sequence.rb +342 -0
- data/lib/sirena/parser/transforms/state_diagram.rb +292 -0
- data/lib/sirena/parser/transforms/timeline.rb +177 -0
- data/lib/sirena/parser/transforms/treemap.rb +81 -0
- data/lib/sirena/parser/transforms/xy_chart.rb +132 -0
- data/lib/sirena/parser/treemap.rb +98 -0
- data/lib/sirena/parser/user_journey.rb +120 -0
- data/lib/sirena/parser/xy_chart.rb +114 -0
- data/lib/sirena/parser.rb +8 -0
- data/lib/sirena/renderer/architecture.rb +251 -0
- data/lib/sirena/renderer/base.rb +251 -0
- data/lib/sirena/renderer/block.rb +286 -0
- data/lib/sirena/renderer/c4.rb +490 -0
- data/lib/sirena/renderer/class_diagram.rb +499 -0
- data/lib/sirena/renderer/er_diagram.rb +417 -0
- data/lib/sirena/renderer/error.rb +131 -0
- data/lib/sirena/renderer/flowchart.rb +301 -0
- data/lib/sirena/renderer/gantt.rb +331 -0
- data/lib/sirena/renderer/git_graph.rb +368 -0
- data/lib/sirena/renderer/info.rb +93 -0
- data/lib/sirena/renderer/kanban.rb +295 -0
- data/lib/sirena/renderer/mindmap.rb +396 -0
- data/lib/sirena/renderer/packet.rb +239 -0
- data/lib/sirena/renderer/pie.rb +235 -0
- data/lib/sirena/renderer/quadrant.rb +292 -0
- data/lib/sirena/renderer/radar.rb +323 -0
- data/lib/sirena/renderer/requirement.rb +371 -0
- data/lib/sirena/renderer/sankey.rb +255 -0
- data/lib/sirena/renderer/sequence.rb +424 -0
- data/lib/sirena/renderer/state_diagram.rb +328 -0
- data/lib/sirena/renderer/timeline.rb +304 -0
- data/lib/sirena/renderer/treemap.rb +152 -0
- data/lib/sirena/renderer/user_journey.rb +331 -0
- data/lib/sirena/renderer/xy_chart.rb +452 -0
- data/lib/sirena/renderer.rb +8 -0
- data/lib/sirena/svg/circle.rb +41 -0
- data/lib/sirena/svg/document.rb +103 -0
- data/lib/sirena/svg/element.rb +65 -0
- data/lib/sirena/svg/ellipse.rb +33 -0
- data/lib/sirena/svg/group.rb +71 -0
- data/lib/sirena/svg/line.rb +49 -0
- data/lib/sirena/svg/path.rb +76 -0
- data/lib/sirena/svg/polygon.rb +43 -0
- data/lib/sirena/svg/polyline.rb +35 -0
- data/lib/sirena/svg/rect.rb +57 -0
- data/lib/sirena/svg/style.rb +44 -0
- data/lib/sirena/svg/text.rb +72 -0
- data/lib/sirena/svg.rb +19 -0
- data/lib/sirena/text_measurement.rb +71 -0
- data/lib/sirena/theme/builtin/dark.yml +70 -0
- data/lib/sirena/theme/builtin/default.yml +80 -0
- data/lib/sirena/theme/builtin/high_contrast.yml +70 -0
- data/lib/sirena/theme/builtin/light.yml +70 -0
- data/lib/sirena/theme/color_palette.rb +48 -0
- data/lib/sirena/theme/effect_styles.rb +28 -0
- data/lib/sirena/theme/registry.rb +41 -0
- data/lib/sirena/theme/shape_styles.rb +28 -0
- data/lib/sirena/theme/spacing_config.rb +24 -0
- data/lib/sirena/theme/typography.rb +30 -0
- data/lib/sirena/theme.rb +69 -0
- data/lib/sirena/transform/architecture.rb +273 -0
- data/lib/sirena/transform/base.rb +199 -0
- data/lib/sirena/transform/block.rb +215 -0
- data/lib/sirena/transform/c4.rb +288 -0
- data/lib/sirena/transform/class_diagram.rb +296 -0
- data/lib/sirena/transform/er_diagram.rb +204 -0
- data/lib/sirena/transform/error.rb +39 -0
- data/lib/sirena/transform/flowchart.rb +161 -0
- data/lib/sirena/transform/gantt.rb +253 -0
- data/lib/sirena/transform/git_graph.rb +283 -0
- data/lib/sirena/transform/info.rb +39 -0
- data/lib/sirena/transform/kanban.rb +180 -0
- data/lib/sirena/transform/mindmap.rb +251 -0
- data/lib/sirena/transform/packet.rb +185 -0
- data/lib/sirena/transform/pie.rb +62 -0
- data/lib/sirena/transform/quadrant.rb +167 -0
- data/lib/sirena/transform/radar.rb +227 -0
- data/lib/sirena/transform/requirement.rb +233 -0
- data/lib/sirena/transform/sankey.rb +212 -0
- data/lib/sirena/transform/sequence.rb +143 -0
- data/lib/sirena/transform/state_diagram.rb +228 -0
- data/lib/sirena/transform/timeline.rb +139 -0
- data/lib/sirena/transform/treemap.rb +120 -0
- data/lib/sirena/transform/user_journey.rb +207 -0
- data/lib/sirena/transform/xy_chart.rb +273 -0
- data/lib/sirena/transform.rb +8 -0
- data/lib/sirena/version.rb +5 -0
- data/lib/sirena.rb +328 -0
- data/lib/tasks/benchmark.rake +532 -0
- data/lib/tasks/examples.rake +468 -0
- data/lib/tasks/generate_mermaid_fixtures.rake +363 -0
- data/lib/tasks/mermaid_fixtures.rake +46 -0
- data/scripts/extract_mermaid_tests.rb +493 -0
- data/scripts/rename_to_sirena.rb +73 -0
- data/sirena.gemspec +47 -0
- metadata +529 -0
|
@@ -0,0 +1,816 @@
|
|
|
1
|
+
= Class diagrams
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
== Overview
|
|
6
|
+
|
|
7
|
+
Class diagrams in Sirena represent the structure of object-oriented systems by showing classes, their attributes, methods, and the relationships between them. They are fundamental for documenting software architecture and design patterns.
|
|
8
|
+
|
|
9
|
+
Class diagrams are useful for:
|
|
10
|
+
|
|
11
|
+
* Documenting object-oriented system architecture
|
|
12
|
+
* Showing inheritance hierarchies
|
|
13
|
+
* Illustrating design patterns
|
|
14
|
+
* Mapping domain models
|
|
15
|
+
* Visualizing database schemas as objects
|
|
16
|
+
* Planning software structure before implementation
|
|
17
|
+
|
|
18
|
+
== Syntax specification
|
|
19
|
+
|
|
20
|
+
=== Diagram declaration
|
|
21
|
+
|
|
22
|
+
Class diagrams are declared using the `classDiagram` keyword:
|
|
23
|
+
|
|
24
|
+
[source,mermaid]
|
|
25
|
+
----
|
|
26
|
+
classDiagram
|
|
27
|
+
<diagram-content>
|
|
28
|
+
----
|
|
29
|
+
|
|
30
|
+
=== Class definition
|
|
31
|
+
|
|
32
|
+
Classes can be defined in two ways:
|
|
33
|
+
|
|
34
|
+
==== Inline definition
|
|
35
|
+
|
|
36
|
+
[source,mermaid]
|
|
37
|
+
----
|
|
38
|
+
classDiagram
|
|
39
|
+
class ClassName
|
|
40
|
+
----
|
|
41
|
+
|
|
42
|
+
==== Block definition
|
|
43
|
+
|
|
44
|
+
[source,mermaid]
|
|
45
|
+
----
|
|
46
|
+
classDiagram
|
|
47
|
+
class ClassName {
|
|
48
|
+
+Type attributeName
|
|
49
|
+
+returnType methodName()
|
|
50
|
+
}
|
|
51
|
+
----
|
|
52
|
+
|
|
53
|
+
=== Attributes
|
|
54
|
+
|
|
55
|
+
Attributes (fields) are defined with visibility, type, and name:
|
|
56
|
+
|
|
57
|
+
[source,mermaid]
|
|
58
|
+
----
|
|
59
|
+
class ClassName {
|
|
60
|
+
+public attribute
|
|
61
|
+
-private attribute
|
|
62
|
+
#protected attribute
|
|
63
|
+
~package attribute
|
|
64
|
+
}
|
|
65
|
+
----
|
|
66
|
+
|
|
67
|
+
Visibility modifiers:
|
|
68
|
+
|
|
69
|
+
[cols="1,2,3"]
|
|
70
|
+
|===
|
|
71
|
+
|Symbol |Visibility |Description
|
|
72
|
+
|
|
73
|
+
|`+`
|
|
74
|
+
|Public
|
|
75
|
+
|Accessible from anywhere
|
|
76
|
+
|
|
77
|
+
|`-`
|
|
78
|
+
|Private
|
|
79
|
+
|Accessible only within the class
|
|
80
|
+
|
|
81
|
+
|`#`
|
|
82
|
+
|Protected
|
|
83
|
+
|Accessible within the class and subclasses
|
|
84
|
+
|
|
85
|
+
|`~`
|
|
86
|
+
|Package/Internal
|
|
87
|
+
|Accessible within the same package
|
|
88
|
+
|===
|
|
89
|
+
|
|
90
|
+
Full attribute syntax:
|
|
91
|
+
|
|
92
|
+
[source,mermaid]
|
|
93
|
+
----
|
|
94
|
+
visibility type name
|
|
95
|
+
----
|
|
96
|
+
|
|
97
|
+
Example:
|
|
98
|
+
|
|
99
|
+
[source,mermaid]
|
|
100
|
+
----
|
|
101
|
+
class Animal {
|
|
102
|
+
+String name
|
|
103
|
+
-int age
|
|
104
|
+
#bool isAlive
|
|
105
|
+
}
|
|
106
|
+
----
|
|
107
|
+
|
|
108
|
+
=== Methods
|
|
109
|
+
|
|
110
|
+
Methods are defined similarly to attributes but with parentheses:
|
|
111
|
+
|
|
112
|
+
[source,mermaid]
|
|
113
|
+
----
|
|
114
|
+
class ClassName {
|
|
115
|
+
+returnType methodName()
|
|
116
|
+
+returnType methodName(paramType param)
|
|
117
|
+
}
|
|
118
|
+
----
|
|
119
|
+
|
|
120
|
+
Examples:
|
|
121
|
+
|
|
122
|
+
[source,mermaid]
|
|
123
|
+
----
|
|
124
|
+
class Animal {
|
|
125
|
+
+void makeSound()
|
|
126
|
+
+void eat(Food food)
|
|
127
|
+
+String getName()
|
|
128
|
+
}
|
|
129
|
+
----
|
|
130
|
+
|
|
131
|
+
=== Relationships
|
|
132
|
+
|
|
133
|
+
Class diagrams support various relationship types:
|
|
134
|
+
|
|
135
|
+
[cols="2,2,3"]
|
|
136
|
+
|===
|
|
137
|
+
|Syntax |Relationship |Description
|
|
138
|
+
|
|
139
|
+
|`ClassA <\|-- ClassB`
|
|
140
|
+
|Inheritance
|
|
141
|
+
|ClassB inherits from ClassA
|
|
142
|
+
|
|
143
|
+
|`ClassA *-- ClassB`
|
|
144
|
+
|Composition
|
|
145
|
+
|ClassA is composed of ClassB (strong ownership)
|
|
146
|
+
|
|
147
|
+
|`ClassA o-- ClassB`
|
|
148
|
+
|Aggregation
|
|
149
|
+
|ClassA contains ClassB (weak ownership)
|
|
150
|
+
|
|
151
|
+
|`ClassA --> ClassB`
|
|
152
|
+
|Association
|
|
153
|
+
|ClassA is associated with ClassB
|
|
154
|
+
|
|
155
|
+
|`ClassA -- ClassB`
|
|
156
|
+
|Link (solid)
|
|
157
|
+
|General connection between classes
|
|
158
|
+
|
|
159
|
+
|`ClassA ..> ClassB`
|
|
160
|
+
|Dependency
|
|
161
|
+
|ClassA depends on ClassB
|
|
162
|
+
|
|
163
|
+
|`ClassA ..\|> ClassB`
|
|
164
|
+
|Realization
|
|
165
|
+
|ClassA realizes interface ClassB
|
|
166
|
+
|
|
167
|
+
|`ClassA ..* ClassB`
|
|
168
|
+
|Composition (dotted)
|
|
169
|
+
|Alternative composition syntax
|
|
170
|
+
|===
|
|
171
|
+
|
|
172
|
+
==== Relationship labels
|
|
173
|
+
|
|
174
|
+
Relationships can have labels:
|
|
175
|
+
|
|
176
|
+
[source,mermaid]
|
|
177
|
+
----
|
|
178
|
+
ClassA "1" --> "many" ClassB : contains
|
|
179
|
+
----
|
|
180
|
+
|
|
181
|
+
==== Bidirectional associations
|
|
182
|
+
|
|
183
|
+
Arrows can point in both directions:
|
|
184
|
+
|
|
185
|
+
[source,mermaid]
|
|
186
|
+
----
|
|
187
|
+
ClassA <-- ClassB
|
|
188
|
+
ClassA <--> ClassB
|
|
189
|
+
----
|
|
190
|
+
|
|
191
|
+
=== Cardinality
|
|
192
|
+
|
|
193
|
+
Relationships can specify cardinality (multiplicity):
|
|
194
|
+
|
|
195
|
+
[source,mermaid]
|
|
196
|
+
----
|
|
197
|
+
ClassA "1" --> "*" ClassB
|
|
198
|
+
ClassA "1..*" --> "0..1" ClassB
|
|
199
|
+
----
|
|
200
|
+
|
|
201
|
+
Common cardinality notations:
|
|
202
|
+
|
|
203
|
+
* `1` - Exactly one
|
|
204
|
+
* `0..1` - Zero or one
|
|
205
|
+
* `*` or `0..*` - Zero or more
|
|
206
|
+
* `1..*` - One or more
|
|
207
|
+
* `n` - Exactly n (specific number)
|
|
208
|
+
* `n..m` - Between n and m
|
|
209
|
+
|
|
210
|
+
=== Generics
|
|
211
|
+
|
|
212
|
+
Generic types can be specified using tilde notation:
|
|
213
|
+
|
|
214
|
+
[source,mermaid]
|
|
215
|
+
----
|
|
216
|
+
class List~T~ {
|
|
217
|
+
+T get(int index)
|
|
218
|
+
+void add(T item)
|
|
219
|
+
}
|
|
220
|
+
----
|
|
221
|
+
|
|
222
|
+
=== Abstract classes and interfaces
|
|
223
|
+
|
|
224
|
+
==== Abstract classes
|
|
225
|
+
|
|
226
|
+
Abstract classes are indicated with `<<abstract>>` stereotype or italics:
|
|
227
|
+
|
|
228
|
+
[source,mermaid]
|
|
229
|
+
----
|
|
230
|
+
class AbstractClass {
|
|
231
|
+
<<abstract>>
|
|
232
|
+
+abstractMethod()*
|
|
233
|
+
}
|
|
234
|
+
----
|
|
235
|
+
|
|
236
|
+
==== Interfaces
|
|
237
|
+
|
|
238
|
+
Interfaces are indicated with `<<interface>>` stereotype:
|
|
239
|
+
|
|
240
|
+
[source,mermaid]
|
|
241
|
+
----
|
|
242
|
+
class IInterface {
|
|
243
|
+
<<interface>>
|
|
244
|
+
+method()
|
|
245
|
+
}
|
|
246
|
+
----
|
|
247
|
+
|
|
248
|
+
=== Stereotypes
|
|
249
|
+
|
|
250
|
+
Stereotypes provide additional classification:
|
|
251
|
+
|
|
252
|
+
[source,mermaid]
|
|
253
|
+
----
|
|
254
|
+
class ClassName {
|
|
255
|
+
<<stereotype>>
|
|
256
|
+
}
|
|
257
|
+
----
|
|
258
|
+
|
|
259
|
+
Common stereotypes:
|
|
260
|
+
|
|
261
|
+
* `<<interface>>`
|
|
262
|
+
* `<<abstract>>`
|
|
263
|
+
* `<<service>>`
|
|
264
|
+
* `<<enumeration>>`
|
|
265
|
+
|
|
266
|
+
=== Annotations
|
|
267
|
+
|
|
268
|
+
Annotations can be added to classes:
|
|
269
|
+
|
|
270
|
+
[source,mermaid]
|
|
271
|
+
----
|
|
272
|
+
class ClassName {
|
|
273
|
+
<<annotation>>
|
|
274
|
+
+method()
|
|
275
|
+
}
|
|
276
|
+
----
|
|
277
|
+
|
|
278
|
+
== Examples
|
|
279
|
+
|
|
280
|
+
=== Basic class
|
|
281
|
+
|
|
282
|
+
.Simple class definition
|
|
283
|
+
[example]
|
|
284
|
+
====
|
|
285
|
+
[source,mermaid]
|
|
286
|
+
----
|
|
287
|
+
classDiagram
|
|
288
|
+
class Animal {
|
|
289
|
+
+String name
|
|
290
|
+
+int age
|
|
291
|
+
+makeSound() void
|
|
292
|
+
}
|
|
293
|
+
----
|
|
294
|
+
|
|
295
|
+
This creates a simple class with attributes and a method.
|
|
296
|
+
====
|
|
297
|
+
|
|
298
|
+
=== Inheritance hierarchy
|
|
299
|
+
|
|
300
|
+
.Class inheritance
|
|
301
|
+
[example]
|
|
302
|
+
====
|
|
303
|
+
[source,mermaid]
|
|
304
|
+
----
|
|
305
|
+
classDiagram
|
|
306
|
+
class Animal {
|
|
307
|
+
+String name
|
|
308
|
+
+int age
|
|
309
|
+
+String species
|
|
310
|
+
+makeSound() void
|
|
311
|
+
+eat(food Food) void
|
|
312
|
+
+sleep() void
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
class Mammal {
|
|
316
|
+
+String furColor
|
|
317
|
+
+bool warmBlooded
|
|
318
|
+
+giveBirth() void
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
class Bird {
|
|
322
|
+
+bool canFly
|
|
323
|
+
+String featherColor
|
|
324
|
+
+layEggs() void
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
Animal <|-- Mammal
|
|
328
|
+
Animal <|-- Bird
|
|
329
|
+
----
|
|
330
|
+
|
|
331
|
+
This example demonstrates:
|
|
332
|
+
|
|
333
|
+
* Base class with common attributes and methods
|
|
334
|
+
* Specialized subclasses
|
|
335
|
+
* Inheritance relationships using `<|--`
|
|
336
|
+
====
|
|
337
|
+
|
|
338
|
+
=== Complex inheritance with multiple levels
|
|
339
|
+
|
|
340
|
+
.Multi-level inheritance
|
|
341
|
+
[example]
|
|
342
|
+
====
|
|
343
|
+
[source,mermaid]
|
|
344
|
+
----
|
|
345
|
+
classDiagram
|
|
346
|
+
class Animal {
|
|
347
|
+
+String name
|
|
348
|
+
+int age
|
|
349
|
+
+String species
|
|
350
|
+
+makeSound() void
|
|
351
|
+
+eat(food Food) void
|
|
352
|
+
+sleep() void
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
class Mammal {
|
|
356
|
+
+String furColor
|
|
357
|
+
+bool warmBlooded
|
|
358
|
+
+giveBirth() void
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
class Bird {
|
|
362
|
+
+bool canFly
|
|
363
|
+
+String featherColor
|
|
364
|
+
+layEggs() void
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
class Dog {
|
|
368
|
+
+String breed
|
|
369
|
+
+bark() void
|
|
370
|
+
+fetch(item Item) void
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
class Cat {
|
|
374
|
+
+bool indoor
|
|
375
|
+
+int lives
|
|
376
|
+
+meow() void
|
|
377
|
+
+purr() void
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
class Eagle {
|
|
381
|
+
+float wingSpan
|
|
382
|
+
+hunt() void
|
|
383
|
+
+soar() void
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
class Penguin {
|
|
387
|
+
+swim() void
|
|
388
|
+
+slide() void
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
Animal <|-- Mammal
|
|
392
|
+
Animal <|-- Bird
|
|
393
|
+
Mammal <|-- Dog
|
|
394
|
+
Mammal <|-- Cat
|
|
395
|
+
Bird <|-- Eagle
|
|
396
|
+
Bird <|-- Penguin
|
|
397
|
+
----
|
|
398
|
+
|
|
399
|
+
This shows:
|
|
400
|
+
|
|
401
|
+
* Multi-level inheritance hierarchy
|
|
402
|
+
* Multiple subclasses at each level
|
|
403
|
+
* Common ancestor class
|
|
404
|
+
* Specialized behaviors in leaf classes
|
|
405
|
+
====
|
|
406
|
+
|
|
407
|
+
=== Associations and ownership
|
|
408
|
+
|
|
409
|
+
.Class associations with cardinality
|
|
410
|
+
[example]
|
|
411
|
+
====
|
|
412
|
+
[source,mermaid]
|
|
413
|
+
----
|
|
414
|
+
classDiagram
|
|
415
|
+
class Owner {
|
|
416
|
+
+String name
|
|
417
|
+
+String address
|
|
418
|
+
+List~Animal~ pets
|
|
419
|
+
+adoptPet(pet Animal) void
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
class Animal {
|
|
423
|
+
+String name
|
|
424
|
+
+int age
|
|
425
|
+
+makeSound() void
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
Owner "1" --> "*" Animal : owns
|
|
429
|
+
----
|
|
430
|
+
|
|
431
|
+
This demonstrates:
|
|
432
|
+
|
|
433
|
+
* Association between classes
|
|
434
|
+
* Cardinality (one-to-many relationship)
|
|
435
|
+
* Relationship label ("owns")
|
|
436
|
+
* Generic type notation `List~Animal~`
|
|
437
|
+
====
|
|
438
|
+
|
|
439
|
+
=== Composition and aggregation
|
|
440
|
+
|
|
441
|
+
.Different types of relationships
|
|
442
|
+
[example]
|
|
443
|
+
====
|
|
444
|
+
[source,mermaid]
|
|
445
|
+
----
|
|
446
|
+
classDiagram
|
|
447
|
+
class University {
|
|
448
|
+
+String name
|
|
449
|
+
+String location
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
class Department {
|
|
453
|
+
+String name
|
|
454
|
+
+String head
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
class Professor {
|
|
458
|
+
+String name
|
|
459
|
+
+String specialization
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
class Student {
|
|
463
|
+
+String name
|
|
464
|
+
+int studentId
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
class Course {
|
|
468
|
+
+String code
|
|
469
|
+
+String title
|
|
470
|
+
+int credits
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
University *-- Department : contains
|
|
474
|
+
Department o-- Professor : employs
|
|
475
|
+
Department --> Course : offers
|
|
476
|
+
Professor --> Course : teaches
|
|
477
|
+
Student --> Course : enrolls in
|
|
478
|
+
----
|
|
479
|
+
|
|
480
|
+
This shows:
|
|
481
|
+
|
|
482
|
+
* Composition (`*--`) - departments are part of university
|
|
483
|
+
* Aggregation (`o--`) - professors work for departments but can exist independently
|
|
484
|
+
* Associations (`-->`) - various relationships between entities
|
|
485
|
+
====
|
|
486
|
+
|
|
487
|
+
=== Interface implementation
|
|
488
|
+
|
|
489
|
+
.Interfaces and realization
|
|
490
|
+
[example]
|
|
491
|
+
====
|
|
492
|
+
[source,mermaid]
|
|
493
|
+
----
|
|
494
|
+
classDiagram
|
|
495
|
+
class Drawable {
|
|
496
|
+
<<interface>>
|
|
497
|
+
+draw() void
|
|
498
|
+
+resize(width int, height int) void
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
class Shape {
|
|
502
|
+
<<abstract>>
|
|
503
|
+
+color String
|
|
504
|
+
+getArea() float*
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
class Circle {
|
|
508
|
+
+radius float
|
|
509
|
+
+getArea() float
|
|
510
|
+
+draw() void
|
|
511
|
+
+resize(width int, height int) void
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
class Rectangle {
|
|
515
|
+
+width float
|
|
516
|
+
+height float
|
|
517
|
+
+getArea() float
|
|
518
|
+
+draw() void
|
|
519
|
+
+resize(width int, height int) void
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
Drawable <|.. Circle
|
|
523
|
+
Drawable <|.. Rectangle
|
|
524
|
+
Shape <|-- Circle
|
|
525
|
+
Shape <|-- Rectangle
|
|
526
|
+
----
|
|
527
|
+
|
|
528
|
+
This demonstrates:
|
|
529
|
+
|
|
530
|
+
* Interface definition with `<<interface>>`
|
|
531
|
+
* Abstract class with `<<abstract>>`
|
|
532
|
+
* Interface realization using `<|..`
|
|
533
|
+
* Multiple inheritance (from abstract class and interface)
|
|
534
|
+
====
|
|
535
|
+
|
|
536
|
+
=== Generic types
|
|
537
|
+
|
|
538
|
+
.Using generics
|
|
539
|
+
[example]
|
|
540
|
+
====
|
|
541
|
+
[source,mermaid]
|
|
542
|
+
----
|
|
543
|
+
classDiagram
|
|
544
|
+
class Collection~T~ {
|
|
545
|
+
<<interface>>
|
|
546
|
+
+add(item T) void
|
|
547
|
+
+remove(item T) void
|
|
548
|
+
+get(index int) T
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
class List~T~ {
|
|
552
|
+
+items T[]
|
|
553
|
+
+add(item T) void
|
|
554
|
+
+remove(item T) void
|
|
555
|
+
+get(index int) T
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
class Map~K,V~ {
|
|
559
|
+
+put(key K, value V) void
|
|
560
|
+
+get(key K) V
|
|
561
|
+
+remove(key K) void
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
Collection~T~ <|.. List~T~
|
|
565
|
+
----
|
|
566
|
+
|
|
567
|
+
This shows:
|
|
568
|
+
|
|
569
|
+
* Generic type parameters with tilde notation
|
|
570
|
+
* Single type parameter `~T~`
|
|
571
|
+
* Multiple type parameters `~K,V~`
|
|
572
|
+
* Generic interface and implementations
|
|
573
|
+
====
|
|
574
|
+
|
|
575
|
+
=== Complete domain model
|
|
576
|
+
|
|
577
|
+
.E-commerce domain model
|
|
578
|
+
[example]
|
|
579
|
+
====
|
|
580
|
+
[source,mermaid]
|
|
581
|
+
----
|
|
582
|
+
classDiagram
|
|
583
|
+
class Customer {
|
|
584
|
+
+int id
|
|
585
|
+
+String name
|
|
586
|
+
+String email
|
|
587
|
+
+List~Order~ orders
|
|
588
|
+
+placeOrder(order Order) void
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
class Order {
|
|
592
|
+
+int id
|
|
593
|
+
+Date orderDate
|
|
594
|
+
+OrderStatus status
|
|
595
|
+
+List~OrderItem~ items
|
|
596
|
+
+float totalAmount
|
|
597
|
+
+calculateTotal() float
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
class OrderItem {
|
|
601
|
+
+int quantity
|
|
602
|
+
+float price
|
|
603
|
+
+Product product
|
|
604
|
+
+getSubtotal() float
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
class Product {
|
|
608
|
+
+int id
|
|
609
|
+
+String name
|
|
610
|
+
+String description
|
|
611
|
+
+float price
|
|
612
|
+
+int stockQuantity
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
class OrderStatus {
|
|
616
|
+
<<enumeration>>
|
|
617
|
+
PENDING
|
|
618
|
+
PROCESSING
|
|
619
|
+
SHIPPED
|
|
620
|
+
DELIVERED
|
|
621
|
+
CANCELLED
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
class Payment {
|
|
625
|
+
+int id
|
|
626
|
+
+float amount
|
|
627
|
+
+Date paymentDate
|
|
628
|
+
+PaymentMethod method
|
|
629
|
+
+processPayment() bool
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
Customer "1" --> "*" Order : places
|
|
633
|
+
Order "1" *-- "*" OrderItem : contains
|
|
634
|
+
OrderItem "*" --> "1" Product : references
|
|
635
|
+
Order "1" --> "1" Payment : paid by
|
|
636
|
+
Order --> OrderStatus : has
|
|
637
|
+
----
|
|
638
|
+
|
|
639
|
+
This comprehensive example includes:
|
|
640
|
+
|
|
641
|
+
* Multiple related classes
|
|
642
|
+
* Composition relationships
|
|
643
|
+
* Associations with cardinality
|
|
644
|
+
* Enumeration type
|
|
645
|
+
* Business logic methods
|
|
646
|
+
* Complete domain model structure
|
|
647
|
+
====
|
|
648
|
+
|
|
649
|
+
== Features
|
|
650
|
+
|
|
651
|
+
=== Method parameters
|
|
652
|
+
|
|
653
|
+
Methods can have typed parameters:
|
|
654
|
+
|
|
655
|
+
[source,mermaid]
|
|
656
|
+
----
|
|
657
|
+
class Calculator {
|
|
658
|
+
+add(a int, b int) int
|
|
659
|
+
+divide(dividend float, divisor float) float
|
|
660
|
+
}
|
|
661
|
+
----
|
|
662
|
+
|
|
663
|
+
=== Multiple methods and attributes
|
|
664
|
+
|
|
665
|
+
Classes can have any number of attributes and methods:
|
|
666
|
+
|
|
667
|
+
[source,mermaid]
|
|
668
|
+
----
|
|
669
|
+
class ComplexClass {
|
|
670
|
+
+String attr1
|
|
671
|
+
+int attr2
|
|
672
|
+
-bool attr3
|
|
673
|
+
+method1() void
|
|
674
|
+
+method2(param String) int
|
|
675
|
+
-privateMethod() void
|
|
676
|
+
}
|
|
677
|
+
----
|
|
678
|
+
|
|
679
|
+
=== Static members
|
|
680
|
+
|
|
681
|
+
Static members can be indicated with underline or `$`:
|
|
682
|
+
|
|
683
|
+
[source,mermaid]
|
|
684
|
+
----
|
|
685
|
+
class MathUtils {
|
|
686
|
+
+$PI float
|
|
687
|
+
+$E float
|
|
688
|
+
+$sqrt(x float) float
|
|
689
|
+
}
|
|
690
|
+
----
|
|
691
|
+
|
|
692
|
+
=== Comments
|
|
693
|
+
|
|
694
|
+
Comments are not displayed but can be added:
|
|
695
|
+
|
|
696
|
+
[source,mermaid]
|
|
697
|
+
----
|
|
698
|
+
classDiagram
|
|
699
|
+
%% This is a comment
|
|
700
|
+
class MyClass
|
|
701
|
+
----
|
|
702
|
+
|
|
703
|
+
== Limitations
|
|
704
|
+
|
|
705
|
+
=== Currently not supported
|
|
706
|
+
|
|
707
|
+
The following Mermaid class diagram features are not yet supported in Sirena:
|
|
708
|
+
|
|
709
|
+
* Custom styling with CSS classes
|
|
710
|
+
* Click events and links
|
|
711
|
+
* Notes and annotations on relationships
|
|
712
|
+
* Namespace grouping
|
|
713
|
+
* Direction control (top-to-bottom vs left-to-right)
|
|
714
|
+
* Custom class styling
|
|
715
|
+
|
|
716
|
+
=== Known issues
|
|
717
|
+
|
|
718
|
+
* Very long class names may affect layout
|
|
719
|
+
* Complex relationship networks may become cluttered
|
|
720
|
+
* Generic syntax with nested types may not render correctly
|
|
721
|
+
|
|
722
|
+
== Best practices
|
|
723
|
+
|
|
724
|
+
=== Keep classes focused
|
|
725
|
+
|
|
726
|
+
Follow the Single Responsibility Principle:
|
|
727
|
+
|
|
728
|
+
[source,mermaid]
|
|
729
|
+
----
|
|
730
|
+
%% Good - focused class
|
|
731
|
+
class UserRepository {
|
|
732
|
+
+findById(id int) User
|
|
733
|
+
+save(user User) void
|
|
734
|
+
+delete(id int) void
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
%% Less ideal - too many responsibilities
|
|
738
|
+
class UserManager {
|
|
739
|
+
+validateUser() bool
|
|
740
|
+
+saveToDatabase() void
|
|
741
|
+
+sendEmail() void
|
|
742
|
+
+generateReport() void
|
|
743
|
+
+logActivity() void
|
|
744
|
+
}
|
|
745
|
+
----
|
|
746
|
+
|
|
747
|
+
=== Use meaningful names
|
|
748
|
+
|
|
749
|
+
Choose descriptive names for classes, attributes, and methods:
|
|
750
|
+
|
|
751
|
+
[source,mermaid]
|
|
752
|
+
----
|
|
753
|
+
%% Good
|
|
754
|
+
class CustomerOrder {
|
|
755
|
+
+orderDate Date
|
|
756
|
+
+calculateTotal() float
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
%% Less clear
|
|
760
|
+
class CO {
|
|
761
|
+
+dt Date
|
|
762
|
+
+calc() float
|
|
763
|
+
}
|
|
764
|
+
----
|
|
765
|
+
|
|
766
|
+
=== Show relevant details
|
|
767
|
+
|
|
768
|
+
Include only the details necessary for the diagram's purpose:
|
|
769
|
+
|
|
770
|
+
[source,mermaid]
|
|
771
|
+
----
|
|
772
|
+
%% For architecture overview - show only key methods
|
|
773
|
+
class UserService {
|
|
774
|
+
+createUser(data UserData) User
|
|
775
|
+
+authenticateUser(credentials Credentials) Session
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
%% For detailed implementation - show all methods
|
|
779
|
+
class UserService {
|
|
780
|
+
+createUser(data UserData) User
|
|
781
|
+
+authenticateUser(credentials Credentials) Session
|
|
782
|
+
-validateUserData(data UserData) bool
|
|
783
|
+
-hashPassword(password String) String
|
|
784
|
+
-sendWelcomeEmail(user User) void
|
|
785
|
+
}
|
|
786
|
+
----
|
|
787
|
+
|
|
788
|
+
=== Group related classes
|
|
789
|
+
|
|
790
|
+
Use inheritance and composition to show relationships:
|
|
791
|
+
|
|
792
|
+
[source,mermaid]
|
|
793
|
+
----
|
|
794
|
+
classDiagram
|
|
795
|
+
class Animal
|
|
796
|
+
class Mammal
|
|
797
|
+
class Reptile
|
|
798
|
+
|
|
799
|
+
Animal <|-- Mammal
|
|
800
|
+
Animal <|-- Reptile
|
|
801
|
+
----
|
|
802
|
+
|
|
803
|
+
=== Use appropriate relationship types
|
|
804
|
+
|
|
805
|
+
Choose the correct relationship type for the situation:
|
|
806
|
+
|
|
807
|
+
* Use inheritance (`<|--`) for "is-a" relationships
|
|
808
|
+
* Use composition (`*--`) for "part-of" relationships with strong ownership
|
|
809
|
+
* Use aggregation (`o--`) for "has-a" relationships with weak ownership
|
|
810
|
+
* Use association (`-->`) for general relationships
|
|
811
|
+
|
|
812
|
+
== Related documentation
|
|
813
|
+
|
|
814
|
+
* <<index.adoc#,Diagram types overview>>
|
|
815
|
+
* <<er-diagram.adoc#,Entity relationship diagrams>>
|
|
816
|
+
* link:https://mermaid.js.org/syntax/classDiagram.html[Official Mermaid class diagram documentation]
|