Skip to content

8. namespaceを活用する

アーキテクチャのレイヤーをコード上で明確にするために、C#のnamespace機能を活用しましょう。namespaceはクラスをグループ化する仕組みで、どのクラスがどのレイヤーに属しているかをコード上で明示できます。

csharp
// Domain層のクラス
namespace MyGame.Domain
{
    public class ScoreModel { /* ... */ }
    public class DamageCalculator { /* ... */ }
    public class BattleService { /* ... */ }
    public interface IScoreRepository { /* ... */ }
}

// Application層のクラス
namespace MyGame.Application
{
    using MyGame.Domain; // Domain層だけを参照する ✅

    public class DefeatEnemyUseCase { /* ... */ }
    public class StartGameUseCase { /* ... */ }
    public class FinishGameUseCase { /* ... */ }
    public interface IGameOverPort { /* ... */ }
}

// Presentation層のクラス
namespace MyGame.Presentation
{
    using MyGame.Application; // Application層を参照する ✅
    using MyGame.Domain;
    // using MyGame.Infrastructure; ← これはダメ!同じ層や外側の層に依存してはいけない

    public class ScoreView : MonoBehaviour { /* ... */ }
    public class ScorePresenter { /* ... */ } // Pure C#!
    public class GameOverPresenter : IGameOverPort { /* ... */ }
}

// Infrastructure層のクラス
namespace MyGame.Infrastructure
{
    using MyGame.Domain; // Domain層を参照する ✅

    public class JsonScoreRepository : IScoreRepository { /* ... */ }
}

// CompositionRoot層のクラス
namespace MyGame.CompositionRoot
{
    using MyGame.Domain; // 全層を参照 ✅(特権)
    using MyGame.Application;
    using MyGame.Presentation;
    using MyGame.Infrastructure;

    public class GameLifetimeScope : LifetimeScope { /* ... */ }
}

namespaceを使うことで、クラスがどのレイヤーに属して、どのレイヤーに依存しているかが明らかになります。また、異なるnamespaceに同名のクラスが存在しても衝突することがありません。

Unity設計講習会 資料公開ページ