LoginSignup
16
11

More than 1 year has passed since last update.

ReSharper の Type Dependency Diagram でC#クラスの依存関係が一目瞭然

Last updated at Posted at 2022-06-10

はじめに

Unityでコードをたくさん書いていくと、徐々にスクリプト間の関連性がわからなくなっていったりするものです。最近だとAssembly Definition File(asmdef)を入れるために、依存関係を断ち切る必要がでてきたりしますが、そのような場合に、クラスの関係を一目で見られるように可視化すると、作業がはかどります。
これを実現する Type Dependency Diagram の便利な使い方についてご紹介します。

image.png

Type Dependency Diagramとは

クラスやインタフェース、enum等の型同士の関連性を可視化するのに便利なツールです。ReSharperの中に入っている1つの機能で、Visual Studio内で利用できます。C#向けです。

  • ReSharperについて
    • この記事で扱うType Dependency Diagramを表示するために必要です。
    • Visual Studioに、様々な解析やリファクタの機能を追加することができるツールです。
    • ReSharperは初回インストール時に限り30日間「評価」することもできます。
    • Rider等JetBrainsのツールをお使いの場合、dotUltimateパックに入っているので、セットにするとお得に購入できます。

準備

  • お使いのVisual StudioにReSharperをインストールしましょう。ここでは省略します。
    • Visual Studioのバージョンは 2017/2019/2022 あたりなら良いはずです。
  • Unityのスクリプト編集ツールとしてRiderなどを設定されている方は Preferences -> External Tools の項目から、External Script EditorVisual Studio **** に設定しましょう。

最初の一歩

Unityでなにかプロジェクトを開いて、クラスを選んで Type Dependency Diagram で見てみましょう。
ここでは、 Meta社の公開しているサンプルプロジェクト https://github.com/oculus-samples/Unity-TheWorldBeyond を例にします。

Scripts/VirtualPets.cs のところで右クリックして、メニューから Show Type Dependency Diagram を選択します。

image.png

そうすると、こちらのようなウィンドウが表示されると思います。

image.png

さて、VirtualPetクラスが、enum PetStateに依存していることがわかります。
ちなみに、PetStateクラス内に enum PetState が存在していますので、当然といえば当然です。

ここでは、関連している型をみていきたいので、VirtualPetの右クリックメニューから Add All Referenced Types を実行しましょう。

image.png

そうすると、VirtualPetから参照されているクラスが追加され、このようになります!

image.png

便利でしょうか?いや、細かすぎて何がなにやらですね。
これから、これを見やすくしていきます。

image.png

左上にあるツールバーの右端でグルーピングを変更できます。 Group by Namespace を選びましょう。

image.png

今度は突然すごいシンプルになりました。真ん中に {} とありますが、これはルートネームスペースを表しています。すべての親ということですね。
焦らずに左上の三角形を押しましょう。そうすると中身がでてきます。

image.png

中身が展開されました。
注目したいのは赤で囲ってあるところです。左の四角はSystem、下の四角はUnityEngineとあります。
SystemやUnityEngineネームスペースのクラスは、要するにStringやMonoBehaviourのようなものですが、一般的にはこれらは解析対象ではない、空気のような存在ですから、この図からは除外するのが妥当というものです。

それぞれ、選択した後キーボードの Delete キーを押すと削除できます。

image.png

だいぶすっきりしてきました。これで十分の場合はここで止めても良いでしょう。
また、些末なクラスはここで選択して削除しても良いでしょう。

image.png

しかし、ここでもう一段、ツールバー右端のGroupingから Group by Project Structure を選択しましょう。これはフォルダベースでグルーピングすることができます。

image.png

Oculus.VR フォルダに属するクラスがあることがわかります。これらが解析に重要であれば残しても良いですが、ライブラリ側コードですから今回は除外しましょう。
Oculus.VRの四角を選択して Delete キーを押すか、または x ボタンで除外することができます。

image.png

これで、だいぶ余分な型は消せたのではないかと思います。あとは見やすくしてみましょう。
真ん中の四角の ...\Scripts のところが閉じているので、三角形を押して展開しましょう。

image.png

それなりに依存関係が見えてきた感じがしますね。たとえば、VirtualPet クラスは、フォルダ外部の MultiToy クラスや SpaceshipTrigger クラスに依存していることが判明しました。

image.png

また、VirtualPet と MultiToy は、両方向の矢印がありますので、相互依存になっています。このままでは ScriptsフォルダやMultiToyをasmdef化できないかも、といったことがわかるでしょう。
※Unityでasmdef化すると、独立アセンブリ(DLL)となるため、片方向依存であることが必須要件となります。

また、見やすくする方法はいくつかあります。
何度か触っているツールバーのグルーピングのアイコンから Do Not Group を選択すれば、すこしすっきりとするでしょう。

image.png

ちょっと矢印が混雑していていけてないな、と思った場合、左側のアイコンでレイアウトを変えることができます。
上側の Organic Layouter の場合はこちらのようになります。

image.png

下側の Business Logic Layouter の場合はこちらのようになります。

image.png

個々の要素を自分で並べかえることもできるので、見やすいレイアウトを探ってみましょう。

勘違いしてはいけない点としては、グラフ内に追加された要素すべてを可視化したとはいえない点です。ここまでの流れはあくまで VirtualPet クラスが直接依存しているクラスについて可視化したものです。VirtualPets以外については、完全に可視化されたとは言い難い状況です。さらにほかのクラスについて着目したい場合は、そのクラスのメニューから Add All Refernced Types を実行し、再度クリーンアップの手順を踏むと良いでしょう。

そのほかできること

  • 特定のクラスを利用しているクラス・型をすべて図に追加する。
    上記の手順では、あくまでクラスが参照している型を追加しましたが、逆に参照されているほう Usages を追加することもできます。
    クラスの上にカーソルをしばらくホバーするとでてくる画面から、Add All Usages to the Diagram を選択しましょう。

    image.png

    追加されました。

    image.png

  • 任意の型をソリューションエクスプローラーで選択して、Type Dependency Diagram にドラッグ&ドロップで追加することができます。

    image.png

    追加されました。

    image.png

  • 任意の型を Type to search の欄から検索して追加することができます。
    image.png

  • ツールバーのFilterアイコンから、表示する関連のタイプをON/OFFできます。
    image.png

注意点

  • コードの規模によっては、解析やレイアウト変更にかなりの時間がかかります。この場合でも、上で説明したテクニックで不要なファイルを削除するのがおすすめです。

おしまい

コードをリファクタするとき、asmdef化するときや、コードの全体像を明らかにしたいときなどに利用してみると良いと思います!

参照

公式の解説です
https://pleiades.io/help/resharper/Exploring_Type_Dependency_Graph.html

宣伝

Psychic VR Lab では、Unityエンジニアを募集しています!

16
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
11