C#のコードからUML図を作成する方法

2020年10月23日

無料でできる範囲で、UML図を作成してみます
クラス図を作成することで、次のようなメリットがあります。

  • クラス間のつながり、構成が整っているかを判断することができる
  • コーディングの学習に役立つ
  • コードの設計資料として使える
  • チームのディスカッションで使える
  • 修正ポイントを見つけやすい
  • コードからUMLを作成するツールを使うと、既存コードの分析に役立つ
  • スパゲッティコードを防げる、解消しやすい
  • 自動配線パターンを見ていると面白い

Java言語のサンプルが多いですが、C#でも使えます。(C#はJavaを参考にしていることがよくわかりますね)
よく、ソフトウェア開発ノウハウのデザインパターン の資料としても使われています。
本来、UMLも記述フォーマットを学んで、クラス図を作成したのち、コーディングに移る方法をとりますが、
今回は、存在しているC#コードからUMLを作成するツールをご紹介します。
UMLについては、このページ下部に紹介していますので、並行して学習を進めてください。

サンプル

今回は、VisualStudioだけで作成するC#のコードとUnityで同様に実現するスクリプト(C#)を例としてみていきましょう。

C#の場合

この資料は、UMLやC#について基本を学習した方向けとなっています。ソリューション、プロジェクト、C#の構文についての説明は対象外となっています。学習されたい方は、このページ下部の情報を参考にしてください。


最初に、実際作成されたクラス図を見てもらいます。
イメージをつかんでください。なお、サンプルなので、実際はご自身のコードを使ってもらっていいです。

クラス構成

サンプルクラスの構成となります。
どのようなクラス構成、構文でも構いません。
今回は、抽象クラスと派生クラスを作ってみました。

C#コード

抽象クラス

namespace UML_Sample
{
    public abstract class EnemyBase
    {
        public int Hp { get; set; }
        public abstract void Attack();
    }
}

派生クラス

using System;
namespace UML_Sample
{
    public class Slime : EnemyBase
    {
        public override void Attack()
        {
            Hp = 10;
            Console.WriteLine("噛みつき攻撃");
        }
    }
}

エントリーポイント

using System;
namespace UML_Sample
{
    class Program
    {
        static EnemyBase enemy;

        static void Main(string[] args)
        {
            enemy = new Slime();
            enemy.Attack();
            Console.WriteLine($"HP = {enemy.Hp}");
        }
    }
}

自動作成されたPlantUMLコード

コードのフォーマットについては、このページ下部の情報を参考にしてください。

@startuml
class Slime {
    + <<override>> Attack() : void
}
EnemyBase <|-- Slime
abstract class EnemyBase {
    + Hp : int <<get>> <<set>>
    + {abstract} Attack() : void
}
class Program {
    {static} Main(args:string[]) : void
}
Program --> "enemy" EnemyBase
@enduml

PlantUMLコードから作成されたクラス図

少し難しいかもしれませんが、依存性を低くする構成となっています。
クラス図のボックス、配線、変数名、参照、継承矢印など、全て自動作成になります。

Unityの場合

オブジェクトの構成

次のキャプチャを参考にオブジェクトとスクリプトの構成を作ってみましょう。

スクリプト(C#コード)

抽象クラス

using UnityEngine;

abstract class EnemyBase : MonoBehaviour
{
    public int hp;

    public abstract void Attack();
}

派生クラス。Slimeゲームオブジェクトにアタッチするスクリプト

using UnityEngine;

class Slime : EnemyBase
{
    public override void Attack()
    {
        hp = 10;
        Debug.Log("噛みつき攻撃");
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            Attack();
       Debug.Log($"HP = {hp}");
        }
    }
}

自動作成されたPlantUMLコード

コードのフォーマットについては、このページ下部の情報を参考にしてください。

@startuml
class Slime {
    + <<override>> Attack() : void
    Update() : void
}
EnemyBase <|-- Slime
abstract class EnemyBase {
    + hp : int
    + {abstract} Attack() : void
}
MonoBehaviour <|-- EnemyBase
@enduml

PlantUMLコードから作成されたクラス図

少し難しいかもしれませんが、依存性を低くする構成となっています。
クラス図のボックス、配線、変数名、参照、継承矢印など、全て自動作成になります。

色々な、C#からPlantUMLへの変換パターン

https://github.com/pierre3/PlantUmlClassDiagramGenerator#type-declaration

準備

UMLクラス図をビジュアルで作成できるツールは、有料、無料含めたくさんあります。今回は、マイクロソフトが提供している無料のIDE(統合開発環境)を使ってみます。このツールは、UMLクラス図作成のみ対応しているわけではなく、シンプルな基本の構成に、必要としている機能(例えばC#やJava)を拡張していくことで軽いコーディング環境を構築できるものになっています。IT技術者にはメジャーなツールなので、この機会に使いこなせるようになってみましょう。

インストールするプログラム

Visual Studio Code

インストール方法の説明は割愛しますが、インストーラの手順に従えば、マウスクリックだけで完了します。
最新版をインストールしましょう

.NET 5.0 SDK

C#の最新バージョンに対応するため、.Net5をインストールします。
これは、VisualStudioで最新のC#を使えるようにするためにも必要です。

インストール方法の説明は割愛しますが、インストーラの手順に従えば、マウスクリックだけで完了します。

参考 C#9.0の新機能

興味を持たれた方は、c#9,0でググると、たくさん情報が得られますよ。

Visual Studio Codeにインポートするいくつかの拡張機能

インストール方法は割愛しますが、画面左側の拡張機能アイコンからインストールが可能です。

C#の開発環境

最新版をインストールしましょう

エディター の日本語化するプラグイン

最新版をインストールしましょう

UML作成プラグイン

最新版をインストールしましょう

C#のコードをUMLへコンバートするプラグイン

最新版をインストールしましょう
V1.2.4(2021/4/16)では、.NET5対応になりました。
.NET5のインストールが必須です。

設定内容の変更

設定画面の表示

画面左下のギアアイコンから設定メニューを選択します

設定項目の検索

検索窓に「plantuml」と入力し、設定内容の項目を絞ります。

C# to PlantUML設定変更

PlantUML設定変更

使い方

C#からUMLへのコンバート

左下のギアマークからコマンドパレットを選びます

上部にパレットが開きますので、C# to PlantUMLを選択し、実行します

クラス図の作成

UMLコードの表示

それぞれのクラスごとに、*.pumlファイルが作成されています。
これは、クラスごとのUMLクラス図になります。
全体の情報、クラス間の繋がり、関係性を確認するためには、include.pumlを選択し、コードを表示します。

UMLからクラス図の作成

ALT+d(Macではopthin+d)で、クラス図が作成されプレビューを確認することができます

C# サンプルのみ掲載しています

クラス図のイメージへの書き出し

右クリックメニューからクラス図イメージのファイルへの書き出しもできます

outフォルダが作成され、ファイルフォーマットを指定したイメージ図が保存されます

*.pngファイル

いわゆる画像ファイルになります。画像加工ソフトで開くことができます。

*.svgファイル

ブラウザで開くことができます。
*.pngファイルと違い、画像としての保存ではなく、データとして保存されているので拡大しても粗くなりません。
複雑な図になるときは、こちらの方が見やすくなります。*.pngファイルの場合、拡大しても粗くなって非常に読みづらいものとなります。

その他サンプルクラス図

今回のサンプルに直接関係ありません
他のプロジェクトでテストしてみた結果になります。
表示位置、配線は自動になっています。この位置もコードで指定ができますので、最終的には、納まりのいいところを模索してもらえればと思います。

このような、大きな構成でも作成することもできます。
配置、配線は自動で作成されます。また、位置決めやコメント追加などの調整もコード記述で簡単にできますので、きれいに清書して資料として使うことができます。

大きなUMLファイルではエラーになる場合

各クラスは、問題なく表示されても、includeファイルがエラー表示になる場合、変換サーバの設定をローカルに変更すれば表示される場合があります。

PlantUML設定

javaとGraphVizのインストールが必要です。

JAVA JDKのインストール

GraphVizのインストール

スクロールし、次のところからインストールします。

学習資料

基本を学習されたい方は、こちらを参考にしてください。

UMLについての学習もこの資料には含まれていません。学習されたい場合、次の資料ページを確認してください。

変換のサンプル

C#のソースからUMLクラス図へ変換する拡張(GitHub)
サンプル以外の変換パターンがUMLとクラス図とともにReadme.mdに記載されています

2020年10月23日C#,ツール,バージョン管理

Posted by hidepon