C#のソースコードからクラス図を作成(VisualStudio2022)

VisualStudioCodeで拡張機能のインストールで対応する方法ではなくWindows版VisualStudio2022を使って確認する方法を見ていきましょう

クラス図の作成ツールは、標準インストールでは同梱されていません
今回は、ツールのインストール手順から見ていくことにします

クラス図を作るためのツールをインストール

必要なツールやコード

  • VisualStudio2022 (C#のインストール)
  • クラスダイアグラム作成ツール
  • サンプル作成のためのプロジェクト(あらかじめ作成しておきましょう)
    .Net6または.NetFrameworkのどちらでも構いません
    今回は、.Net6のコンソールアプリ(TopLevelStatement)で作成しています
    複数のクラス、抽象クラス、インターフェースなどがあると確認がしやすいです

VisualStudioインストーラーの起動

VisualStudioのメニューからインストーラーを起動します
単体でインストーラーを起動してもいいです

ツールのインストール

インストーラが起動したら、個別のコンポーネントタブからクラスデザイナーを選択し、インストールします
この時、元の開発で使っているVisualStudioは、あらかじめ閉じておいてください。
ここでは、早く見つけるために、キーワード検索をしています

クラスダイアグラムを作成

クラスダイアグラムファイルを作成

インストールが完了したら、VisualStudioに戻ります

ソリューションエクスプローラーからプロジェクトを選択して、右クリックします

追加、新しい項目の順に選択します

新しい項目の追加画面で、クラスダイアグラムを選択し、名前を例えば「PolyDG.cd」として、追加します

既存のプロジェクトからクラス図を自動作成

からのダイアグラムが作成されるので、ソリューションエクスプローラから、プロジェクトをドラッグ&ドロップします

クラス図が自動作成されます
それぞれのボックスを右クリックすると様々な更新が出来ますので、テストしてみましょう
ここでの変更は、ソースコードにリアルタイムに反映されます
また、ソースコードの変更もこのクラス図にリアルタイムに反映されます
設計の整理、確認のために有効に利用しましょう

コードサンプル

.Net6のコンソールアプリ

VirtualPet sleepyPet = new SleepyPet();
VirtualPet hungryPet = new HungryPet();
VirtualPet birdPet = new BirdPet();

List<VirtualPet> virtualPets = new List<VirtualPet>();
virtualPets.Add(sleepyPet);
virtualPets.Add(hungryPet);
virtualPets.Add(birdPet);

foreach (var pet in virtualPets)
{
    pet.Eat();
}

IFlyable hungryFlyablePet = new HungryPet();
IFlyable birdFlyablePet = new BirdPet();

List<IFlyable> virtualFlyablePets = new List<IFlyable>();
virtualFlyablePets.Add(hungryFlyablePet);
virtualFlyablePets.Add(birdFlyablePet);

foreach (var pet in virtualFlyablePets)
{
    pet.Fly();
}

interface IFlyable
{
    void Fly();
}

abstract class VirtualPet
{
    public abstract void Eat();
}

class SleepyPet : VirtualPet
{
    public override void Eat()
    {
        Console.WriteLine("眠れるペットが食べました");
    }
}

class HungryPet : VirtualPet, IFlyable
{
    public override void Eat()
    {
        Console.WriteLine("ペコペコペットが食べました");
    }

    public void Fly()
    {
        Console.WriteLine("ペコペコペットが空を飛んだ");
    }
}

class BirdPet : VirtualPet, IFlyable
{
    public override void Eat()
    {
        Console.WriteLine("鳥ペットが食べました");
    }

    public void Fly()
    {
        Console.WriteLine("鳥ペットが空を飛んだ");
    }
}

表示

眠れるペットが食べました
ペコペコペットが食べました
鳥ペットが食べました
ペコペコペットが空を飛んだ
鳥ペットが空を飛んだ

TopLevelStatementを解除して、通常のメインメソッドタイプで作成した場合

Visualstudio for Mac のインテリセンスで自動変換

internal class Program
{
    private static void Main(string[] args)
    {
        VirtualPet sleepyPet = new SleepyPet();
        VirtualPet hungryPet = new HungryPet();
        VirtualPet birdPet = new BirdPet();

        List<VirtualPet> virtualPets = new List<VirtualPet>();
        virtualPets.Add(sleepyPet);
        virtualPets.Add(hungryPet);
        virtualPets.Add(birdPet);

        foreach (var pet in virtualPets)
        {
            pet.Eat();
        }

        IFlyable hungryFlyablePet = new HungryPet();
        IFlyable birdFlyablePet = new BirdPet();

        List<IFlyable> virtualFlyablePets = new List<IFlyable>();
        virtualFlyablePets.Add(hungryFlyablePet);
        virtualFlyablePets.Add(birdFlyablePet);

        foreach (var pet in virtualFlyablePets)
        {
            pet.Fly();
        }
    }
}

interface IFlyable
{
    void Fly();
}

abstract class VirtualPet
{
    public abstract void Eat();
}

class SleepyPet : VirtualPet
{
    public override void Eat()
    {
        Console.WriteLine("眠れるペットが食べました");
    }
}

class HungryPet : VirtualPet, IFlyable
{
    public override void Eat()
    {
        Console.WriteLine("ペコペコペットが食べました");
    }

    public void Fly()
    {
        Console.WriteLine("ペコペコペットが空を飛んだ");
    }
}

class BirdPet : VirtualPet, IFlyable
{
    public override void Eat()
    {
        Console.WriteLine("鳥ペットが食べました");
    }

    public void Fly()
    {
        Console.WriteLine("鳥ペットが空を飛んだ");
    }
}

参考

VisualStudioCodeエディタで作成する方法