SlideShare uma empresa Scribd logo
1 de 22
Baixar para ler offline
Clean Architecture
x
Assembly definition
中野洋輔
自己紹介
• 中野洋輔
• @naninuneno_y
• ___
• asmdefは「アセンデフ」と読む派
Assembly definition
Assembly Definition Filesという神機能(テラシュールブログ)
> C#のコードが出力するアセンブリを
複数のアセンブリに分割する機能です
Clean Architecture
• Clean Architecture for Unity
• @monry
• https://learning.unity3d.jp/4021/
• Unityでオニオンアーキテクチャ
• @toRisouP
• https://www.slideshare.net/torisoup
/unity-14815173
Main InstallerUseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
構成
ここが大変
• 学習コスト高
• クラス・インタフェースが増える
• ファイルが増えるのでフォルダ分けが重要に
• レイヤの依存関係を守ってもらうのが大変
• レイヤを不正にまたいだ依存
• 逆の依存
ここが大変
• 学習コスト高
• クラス・インタフェースが増える
• ファイルが増えるのでフォルダ分けが重要に
asmdef考慮で綺麗にフォルダ分け
• レイヤの依存関係を守ってもらうのが大変
• レイヤを不正にまたいだ依存
• 逆の依存
asmdefに事前に設定して不正な関係を防ぐ
Hoge.MainHoge.Installer
Hoge.Domain.UseCase
Hoge.Domain.Presenter Hoge.Domain.Repository
Hoge.Presenter Hoge.Repository
Hoge.Repository.Detail
Hoge.asmdef
UniRx
Zenject
UniRx.Async
Installer.cs Main.cs
UseCase.cs
IPresenter.cs IRepository.cs
Presenter.cs
IView.cs
Repository.cs
IDataStore.cs
View.cs DataStore.cs
共通の定義
・データ型
・Util関数
自分のプロジェクト 外部ライブラリ
重要
Hoge.Domain
共通のロジック
Domain
Adapter
Detail
Hoge.Presenter.Detail
firebaseとか
Hoge.Domain.UseCase
Hoge.Domain.Presenter Hoge.Domain.Repository
Hoge.asmdef
UniRx
UseCase.cs
IPresenter.cs IRepository.cs
共通の定義
・データ型
・Util関数
Hoge.Domain
共通のロジック
UseCase
重要
自分のプロジェクト 外部ライブラリ
Domain
Adapter
Detail
UniRx.Async
Hoge.Domain.Presenter Hoge.Domain.Repository
Hoge.asmdef
UniRx
IPresenter.cs IRepository.cs
共通の定義
・データ型
・Util関数
IPresenter/
IRepository
重要
自分のプロジェクト 外部ライブラリ
Domain
Adapter
Detail
UniRx.Async
Hoge.Domain.Presenter Hoge.Domain.Repository
Hoge.Presenter Hoge.Repository
Hoge.asmdef
UniRx
IPresenter.cs IRepository.cs
Presenter.cs
IView.cs
Repository.cs
IDataStore.cs
共通の定義
・データ型
・Util関数
重要
Domain
Adapter
Detail
Presenter/
Repository
自分のプロジェクト 外部ライブラリ
UniRx.Async
Hoge.Presenter Hoge.Repository
Hoge.Presenter.Detail Hoge.Repository.Detail
Hoge.asmdef
Presenter.cs
IView.cs
Repository.cs
IDataStore.cs
View.cs DataStore.cs
共通の定義
・データ型
・Util関数
重要
Adapter
Detail
View/
DataStore
自分のプロジェクト 外部ライブラリ
Domain
firebaseとか
UniRx.Async
Hoge.Main
Hoge.Domain.UseCase
Hoge.Domain.Presenter Hoge.Domain.Repository
Hoge.asmdef
Zenject
Main.cs
UseCase.cs
IPresenter.cs IRepository.cs
共通の定義
・データ型
・Util関数
重要
Domain
Adapter
Detail
Main 自分のプロジェクト 外部ライブラリ
Hoge.Installer
Hoge.Domain.Presenter Hoge.Domain.Repository
Hoge.Presenter Hoge.Repository
Hoge.Repository.Detail
Hoge.asmdef
Zenject
Installer.cs
IPresenter.cs IRepository.cs
Presenter.cs
IView.cs
Repository.cs
IDataStore.cs
View.cs DataStore.cs
共通の定義
・データ型
・Util関数
重要
Domain
Adapter
Detail
Hoge.Presenter.Detail
Installer 自分のプロジェクト 外部ライブラリ
まとめ
• 自然とディレクトリも分けられる
• 関心の分離にも繋がる
• Intellisenseの候補が絞られる
• レビュー時にasmdefに差分があったら注意すれば良い
• asmdefの番人が必要
• AssetBundleに罠がある(らしい)
• csprojの数にビビる
• ここまでくると可視化やvalidationツールが欲しくなる
naninunenoy/
UnityCleanArchitectureExample
MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
UseCase
アプリケーションでしたいこと
Presenterを介してUIの入力/表示を実装
Repositoryを介してDataのIOを実装
UniRxが便利
public class UseCase : IUseCase {
readonly IPresenter presenter;
readonly IRepository repository;
public UseCase(IPresenter presenter,
IRepository repository) {
this.presenter = presenter;
this.repository = repository;
}
void IUseCase.Begin() {
// ボタンが押された回数を保存みたいな
}
void IUseCase.Finish() {
// 終了処理
}
}
MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
IPresenter/IReposiotry
UseCaseが参照するUIやデータを操作
するための停止
UseCase(したいこと)があってこいつら
が決まるので、Domain層の住人
public interface IPresenter {
IObservable<Unit> ClickObs {get;}
void SetText(string text);
}
public interface IRepository {
void SetCount(int count);
int GetCount();
}
データのI/Oを非同期にしたいなら
UniTaskも選択肢
MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
Presenter/Reposiotry
実際に処理を行う奴らとUseCaseの仲介
こいつらも詳細は知らない
いわゆる腐敗防止層(?)
public class Presenter : IPresenter {
readonly IView view;
public Presenter(IView view) {
this.view = view;
}
public IObservable<Unit> ClickObs =>
view.Button.OnClickObservable();
public void SetText(string text) {
view.Text.text = text;
}
}
public interface IView {
Button Button {get;}
Text Text {get;}
}
MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
View/DataStore
実際に処理を行う奴ら
外部フレームワークに依存しまくってOK
ここを変えてもアプリケーションの
ロジックに影響はなし
public class View : MonoBehaviour, IView {
[SerializeField] Button button = default;
[SerializeField] Text text = default;
public Button Button => button;
public Text Text => text;
}
public class DataStore : IDataStore {
public void SaveCount(int count) {
PlayerPrefs.SetInt("count", count);
}
public int LoadCount() {
return PlayerPrefs.GetInt("count", 0);
}
}
MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
Main
PresenterやRepositoryの実装を
(どうにかして)受け取り、
UseCaseの作成/実行/破棄を行う。
MonoBehaviourを継承し、Unityのライ
フサイクルにのせる。
public class Main : MonoBehaviour {
IUseCase usecase;
[Inject]
Construct(IPresenter presenter,
IRepository repository) {
usecase = new UseCase(
presenter, repository);
}
void Awake() {
usecase.Begin();
}
void OnDestroy() {
usecase.Finish();
}
}
MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
Installer
Zenject.MonoInstallerを継承
あるinterfaceを要求された時に返すクラ
スやインスタンスを事前に定義できる
全ての定義を知る存在
public class Installer : MonoInstaller {
[SerializeField] View view;
[SerializeField] DataStore dataStore;
public override void InstallBindings() {
Container
.Bind<IPresenter>()
.FromInstance(new Presenter(view))
.AsCached();
Container
.Bind<IRepository>()
.FromInstance(new Repository(dataStore))
.AsCached();
}
}

Mais conteúdo relacionado

Mais procurados

GitHub入門 手順編
GitHub入門 手順編GitHub入門 手順編
GitHub入門 手順編
hideaki honda
 

Mais procurados (20)

がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechconUnityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだ
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
SSIとDIDで何を解決したいのか?(β版)
SSIとDIDで何を解決したいのか?(β版)SSIとDIDで何を解決したいのか?(β版)
SSIとDIDで何を解決したいのか?(β版)
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
 
はじめてのScriptable Build Pipeline
はじめてのScriptable Build PipelineはじめてのScriptable Build Pipeline
はじめてのScriptable Build Pipeline
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
GitHub入門 手順編
GitHub入門 手順編GitHub入門 手順編
GitHub入門 手順編
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
 
分散型IDと検証可能なアイデンティティ技術概要
分散型IDと検証可能なアイデンティティ技術概要分散型IDと検証可能なアイデンティティ技術概要
分散型IDと検証可能なアイデンティティ技術概要
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル
 

Semelhante a CleanArchitecture with AssemblyDefinition in unity

13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発
Kazuki Nakajima
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
Kazuki Nakajima
 

Semelhante a CleanArchitecture with AssemblyDefinition in unity (20)

【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
 
BPStudy20121221
BPStudy20121221BPStudy20121221
BPStudy20121221
 
VIRLとPyATSで実現するネットワークCI
VIRLとPyATSで実現するネットワークCIVIRLとPyATSで実現するネットワークCI
VIRLとPyATSで実現するネットワークCI
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
 
Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見
 
Entity Framework(Core)についての概要を学ぼう
Entity Framework(Core)についての概要を学ぼうEntity Framework(Core)についての概要を学ぼう
Entity Framework(Core)についての概要を学ぼう
 
Node.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたことNode.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたこと
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
 
zozotown real time linkage infrastructure
zozotown real time linkage infrastructurezozotown real time linkage infrastructure
zozotown real time linkage infrastructure
 
ITPro Expo 2014: クラウド統合基盤 ソリューション ~ VMware/Cisco/EMC 統合基盤 VBlock ~
ITPro Expo 2014: クラウド統合基盤 ソリューション ~ VMware/Cisco/EMC 統合基盤 VBlock ~ITPro Expo 2014: クラウド統合基盤 ソリューション ~ VMware/Cisco/EMC 統合基盤 VBlock ~
ITPro Expo 2014: クラウド統合基盤 ソリューション ~ VMware/Cisco/EMC 統合基盤 VBlock ~
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発
 
Using Windows Azure
Using Windows AzureUsing Windows Azure
Using Windows Azure
 
[日本DCの本命、大阪でWindows Azureを愛でる会] Windows Azure 概要 & 最新情報
[日本DCの本命、大阪でWindows Azureを愛でる会] Windows Azure 概要 & 最新情報[日本DCの本命、大阪でWindows Azureを愛でる会] Windows Azure 概要 & 最新情報
[日本DCの本命、大阪でWindows Azureを愛でる会] Windows Azure 概要 & 最新情報
 
Build 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiBuild 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansai
 
Windows Azure PHP Tips
Windows Azure PHP Tips Windows Azure PHP Tips
Windows Azure PHP Tips
 
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
 
Entity Framework 5.0 deep dive
Entity Framework 5.0 deep diveEntity Framework 5.0 deep dive
Entity Framework 5.0 deep dive
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
 

CleanArchitecture with AssemblyDefinition in unity