Skip to main content
Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
EN
Upload
Download free for 30 days
Sign in
Uploaded by
torisoup
133,566 views
Unity開発で使える設計の話+Zenjectの紹介
プログラマのためのUnity勉強会 http://peatix.com/event/311392
Technology
◦
Read more
121
Save
Share
Embed
Save to Drive
Download now
Downloaded 447 times
1
/ 139
2
/ 139
3
/ 139
4
/ 139
5
/ 139
6
/ 139
7
/ 139
8
/ 139
9
/ 139
10
/ 139
11
/ 139
12
/ 139
13
/ 139
14
/ 139
15
/ 139
16
/ 139
17
/ 139
18
/ 139
19
/ 139
20
/ 139
More Related Content
PDF
MMORPGで考えるレベルデザイン
by
Katsumi Mizushima
117 slides
55.8K views
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
145 slides
46.9K views
PPTX
ゲームの楽しさを図式化する ―楽しさを網羅的に分類する「主体性構造モデル」
by
井戸 里志
35 slides
5.4K views
PDF
トリコの動かし方
by
株式会社ジェンデザイン
117 slides
50.9K views
PDF
オンラインゲームの仕組みと工夫
by
Yuta Imai
56 slides
889.1K views
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
63 slides
65.1K views
PDF
個人製作インディーゲーム”ジラフとアンニカ” のUE4 制作事例紹介 | UNREAL FEST EXTREME 2020 WINTER
by
エピック・ゲームズ・ジャパン Epic Games Japan
114 slides
6.1K views
PDF
【Unity】 Behavior TreeでAIを作る
by
torisoup
49 slides
24K views
MMORPGで考えるレベルデザイン
by
Katsumi Mizushima
117 slides
55.8K views
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
145 slides
46.9K views
ゲームの楽しさを図式化する ―楽しさを網羅的に分類する「主体性構造モデル」
by
井戸 里志
35 slides
5.4K views
トリコの動かし方
by
株式会社ジェンデザイン
117 slides
50.9K views
オンラインゲームの仕組みと工夫
by
Yuta Imai
56 slides
889.1K views
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
63 slides
65.1K views
個人製作インディーゲーム”ジラフとアンニカ” のUE4 制作事例紹介 | UNREAL FEST EXTREME 2020 WINTER
by
エピック・ゲームズ・ジャパン Epic Games Japan
114 slides
6.1K views
【Unity】 Behavior TreeでAIを作る
by
torisoup
49 slides
24K views
What's hot
PDF
インタフェース完全に理解した
by
torisoup
39 slides
6.9K views
PDF
ObserverパターンからはじめるUniRx
by
torisoup
45 slides
9.8K views
PDF
UniRx完全に理解した
by
torisoup
36 slides
10.3K views
PDF
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
87 slides
86.6K views
PDF
UniTask入門
by
torisoup
95 slides
15.5K views
PPTX
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
145 slides
163.8K views
PDF
コールバックと戦う話
by
torisoup
59 slides
3.4K views
PPTX
はじめてのUniRx
by
torisoup
94 slides
91.3K views
PDF
Observableで非同期処理
by
torisoup
191 slides
11.1K views
PDF
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
176 slides
30.7K views
PPTX
RPGにおけるイベント駆動型の設計と実装
by
Koji Morikawa
50 slides
10.4K views
PPTX
UnityでUI開発を高速化した件
by
Grenge, Inc.
38 slides
10.4K views
PDF
Doozy UI 使おうぜ! #unity_lt
by
torisoup
72 slides
27.6K views
PDF
Unityでオニオンアーキテクチャ
by
torisoup
44 slides
12.5K views
PPTX
テストコードの DRY と DAMP
by
Yusuke Kagata
11 slides
4.5K views
PDF
Unityのサウンド状況を調べまくって分かったアレコレ
by
Takaaki Ichijo
35 slides
8.1K views
PDF
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
33 slides
129.9K views
PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
by
U-dai Yokoyama
26 slides
18.9K views
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
94 slides
77.1K views
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
68 slides
65.4K views
インタフェース完全に理解した
by
torisoup
39 slides
6.9K views
ObserverパターンからはじめるUniRx
by
torisoup
45 slides
9.8K views
UniRx完全に理解した
by
torisoup
36 slides
10.3K views
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
87 slides
86.6K views
UniTask入門
by
torisoup
95 slides
15.5K views
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
145 slides
163.8K views
コールバックと戦う話
by
torisoup
59 slides
3.4K views
はじめてのUniRx
by
torisoup
94 slides
91.3K views
Observableで非同期処理
by
torisoup
191 slides
11.1K views
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
176 slides
30.7K views
RPGにおけるイベント駆動型の設計と実装
by
Koji Morikawa
50 slides
10.4K views
UnityでUI開発を高速化した件
by
Grenge, Inc.
38 slides
10.4K views
Doozy UI 使おうぜ! #unity_lt
by
torisoup
72 slides
27.6K views
Unityでオニオンアーキテクチャ
by
torisoup
44 slides
12.5K views
テストコードの DRY と DAMP
by
Yusuke Kagata
11 slides
4.5K views
Unityのサウンド状況を調べまくって分かったアレコレ
by
Takaaki Ichijo
35 slides
8.1K views
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
33 slides
129.9K views
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
by
U-dai Yokoyama
26 slides
18.9K views
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
94 slides
77.1K views
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
68 slides
65.4K views
Similar to Unity開発で使える設計の話+Zenjectの紹介
PDF
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
by
Tomoharu ASAMI
61 slides
64 views
PDF
オブジェクト指向を学ぼう
by
Yusuke Kikuchi
37 slides
198 views
PDF
Unityで覚えるC#
by
Masamitsu Ishikawa
57 slides
131.5K views
PDF
オブジェクト指向とSOLID原則の入門
by
KISARAGIMakoto
121 slides
598 views
PDF
第2回 モデリング勉強会
by
hakoika-itwg
10 slides
1.8K views
PPTX
Cedec2012 ai-contest-design-patterns-principles
by
Hironori Washizaki
25 slides
1.1K views
PDF
UnityLecture @Kyushu University
by
Kosuke Kaneko
48 slides
1.4K views
PDF
GDC2015報告
by
Tanaka Yukio
51 slides
566 views
PDF
Agile day 3「弟子入りゲーム」
by
Tarumoto Tetsuya
36 slides
1.4K views
PDF
GCSアジャイル開発を使ったゲームの作り方
by
Hiroyuki Tanaka
79 slides
3.3K views
PDF
CODE FES 2017 講演資料
by
Youichiro Miyake
172 slides
1K views
PDF
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
45 slides
5.2K views
PDF
Unityティーチャートレーニングデイ -認定プログラマー編-
by
Unity Technologies Japan K.K.
161 slides
3.4K views
PDF
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
by
Youichiro Miyake
181 slides
4.6K views
PPTX
Unity勉強会ハンズオン
by
Kodai Yano
102 slides
3.1K views
PDF
【Unity道場スペシャル 2018幕張】「あそびのデザイン講座」を使ったゲームデザイン授業の実践
by
Unity Technologies Japan K.K.
47 slides
723 views
PDF
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
by
Unity Technologies Japan K.K.
32 slides
2.7K views
PDF
週末プログラミングで作るカジュアルゲーム~シューティング編~
by
Nohina Hidenari
62 slides
7K views
PDF
Kuug 第1回
by
Shinobu Izumi
91 slides
2.8K views
PDF
Unityを使ったゲームデザイン超入門
by
小林 信行
36 slides
13.7K views
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
by
Tomoharu ASAMI
61 slides
64 views
オブジェクト指向を学ぼう
by
Yusuke Kikuchi
37 slides
198 views
Unityで覚えるC#
by
Masamitsu Ishikawa
57 slides
131.5K views
オブジェクト指向とSOLID原則の入門
by
KISARAGIMakoto
121 slides
598 views
第2回 モデリング勉強会
by
hakoika-itwg
10 slides
1.8K views
Cedec2012 ai-contest-design-patterns-principles
by
Hironori Washizaki
25 slides
1.1K views
UnityLecture @Kyushu University
by
Kosuke Kaneko
48 slides
1.4K views
GDC2015報告
by
Tanaka Yukio
51 slides
566 views
Agile day 3「弟子入りゲーム」
by
Tarumoto Tetsuya
36 slides
1.4K views
GCSアジャイル開発を使ったゲームの作り方
by
Hiroyuki Tanaka
79 slides
3.3K views
CODE FES 2017 講演資料
by
Youichiro Miyake
172 slides
1K views
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
45 slides
5.2K views
Unityティーチャートレーニングデイ -認定プログラマー編-
by
Unity Technologies Japan K.K.
161 slides
3.4K views
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
by
Youichiro Miyake
181 slides
4.6K views
Unity勉強会ハンズオン
by
Kodai Yano
102 slides
3.1K views
【Unity道場スペシャル 2018幕張】「あそびのデザイン講座」を使ったゲームデザイン授業の実践
by
Unity Technologies Japan K.K.
47 slides
723 views
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
by
Unity Technologies Japan K.K.
32 slides
2.7K views
週末プログラミングで作るカジュアルゲーム~シューティング編~
by
Nohina Hidenari
62 slides
7K views
Kuug 第1回
by
Shinobu Izumi
91 slides
2.8K views
Unityを使ったゲームデザイン超入門
by
小林 信行
36 slides
13.7K views
More from torisoup
PDF
MagicOnion入門
by
torisoup
37 slides
11.5K views
PDF
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
43 slides
4.4K views
PDF
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
100 slides
3.5K views
PDF
Photon Cloud ことはじめ
by
torisoup
40 slides
2K views
PDF
アバター生放送支援アプリ「アバれぽ」
by
torisoup
36 slides
844 views
PDF
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
29 slides
2.7K views
PDF
Task vs Observable
by
torisoup
38 slides
554 views
PDF
Unityでオンラインゲーム作った話
by
torisoup
47 slides
10.9K views
PDF
UniRxでPUNを使いやすくする
by
torisoup
20 slides
4.5K views
PPTX
UniRxでMV(R)Pパターンをやってみた
by
torisoup
21 slides
30.1K views
PPTX
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
114 slides
9.2K views
PDF
Unity講習会(初級)
by
torisoup
118 slides
22.3K views
MagicOnion入門
by
torisoup
37 slides
11.5K views
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
43 slides
4.4K views
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
100 slides
3.5K views
Photon Cloud ことはじめ
by
torisoup
40 slides
2K views
アバター生放送支援アプリ「アバれぽ」
by
torisoup
36 slides
844 views
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
29 slides
2.7K views
Task vs Observable
by
torisoup
38 slides
554 views
Unityでオンラインゲーム作った話
by
torisoup
47 slides
10.9K views
UniRxでPUNを使いやすくする
by
torisoup
20 slides
4.5K views
UniRxでMV(R)Pパターンをやってみた
by
torisoup
21 slides
30.1K views
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
114 slides
9.2K views
Unity講習会(初級)
by
torisoup
118 slides
22.3K views
Unity開発で使える設計の話+Zenjectの紹介
1.
Unity開発で使える設計の話 + Zenjectの紹介 2017/11/26 @toRisouP
2.
自己紹介 • 名前 とりすーぷ(@toRisouP) •
Qiitaとかよく書いてる • 同人ゲーム作ってる
3.
ハクレイフリーマーケット • 2017年10月にリリースした東方二次創作ゲーム • オンライン対戦対応のパーティゲーム
4.
おしながき • 設計とは – 設計とは何か、設計の何がよいのか –
モデリングとクラス設計 • 覚えておくべき基礎知識 – クラス図の読み方 – SOLID原則 – デザインパターン • Zenjectの紹介 – 依存性注入とは何か • まとめ
5.
設計とは何か
6.
設計とは何か • 何をどうやって作るのかを決定する作業 – そもそも何を作ろうとしているのか? –
必要な機能はどうすれば作れるのか? – 必要なリソースは何なのか? – 作るのにどれくらい時間がかかるのか? – どういう手順で作業をするのか?
7.
だいたいの開発フロー 1. 企画を決める 2. 仕様を決める 3.
システム設計する 4. コーディングする 5. テスト、デバッグする 6. リリースする 7. 運用、保守する ←ここ
8.
設計すると何がよいのか?
9.
設計のよさ • 設計することで作るものの全体像が可視化される – 規模感をチーム内で共有できる –
何から手を付ければ効率よく進むかわかるようになる – 今後問題が起きそうな部分を先に洗い出せる
10.
本題
11.
モデリングとクラス設計
12.
モデリングとクラス設計 • モデリング – 抽象的な考えを図や記号で可視化する作業 –
3Dモデリングの意味ではない – UML(統一モデリング言語)を使って描くことがほとんどである • クラス設計 – どういうクラスを作るのか クラス同士がどういう関係であるのか、 といった具体的に何のクラスを作るのかを決める作業
13.
モデリングの例
14.
モデリングの例:シーケンス図 • オブジェクト同士のやりとりを時間軸に沿って表現する図 – 複雑な処理を可視化することができる –
通信処理が挟まる部分などはシーケンス図を作っておくと混乱しない
15.
モデリングの例:アクティビティ図 • 手続きの流れを表現する図 – フローチャートの上位互換みたいなもの –
状態遷移図に似てる(似てるだけで別物である)
16.
モデリングの例:クラス図 • 登場するオブジェクトとその関係性を表す図 – クラスやインターフェイスなどのオブジェクトを記載 –
関連・依存・集約・コンポジション・汎化・実現なのどの 関係を矢印で表す
17.
モデリングをやるメリット • これからの作業内容を可視化できる – どこから作れば効率がよいかわかるようになる –
実装時に迷うことがなくなってスムーズに開発できる • 後から見返す時の資料として残すことができる – どういう作りになってるか俯瞰的に見ることができる – 不具合調査時のあたりがつけやすい – 引き継ぎや新人教育に使える
18.
クラス設計
19.
クラス設計 • クラスの関係をモデリングすること – どういうオブジェクトが必要なのか –
オブジェクト間がどういう関係にあるのか?
20.
クラス設計は適当にやれば OKといったものではない
21.
クラス設計をやるためには • クラス図が読み書きできる必要がある – UMLのクラス図を覚えるのがよい •
設計原則を覚える必要がある – 設計する上で守ることが推奨されるルール • 設計の定石も覚えておくべき – デザインパターンやDIといった応用性の高い考え
22.
こういった クラス設計をする上で 覚えておくべき知識を解説します
23.
おしながき • 設計とは – 設計とは何か、設計の何がよいのか –
モデリングとクラス設計 • 覚えておくべき基礎知識 – クラス図の読み方 – SOLID原則 – デザインパターン • Zenjectの紹介 – 依存性注入とは何か – かんたんな使い方 • まとめ
24.
(クラス設計をやる上で) 覚えておくべき基礎知識
25.
覚えておくべき知識 • クラス図の読み方 • SOLID原則 •
デザインパターン
26.
クラス図の読み方
27.
クラス図の読み方 1/6 • オブジェクトの読み方 –
名前空間、各記号の意味 名前空間 abstract class interface class struct
28.
クラス図の読み方 2/6 • オブジェクトの読み方 –
アクセス修飾子、フィールド、メソッド定義 ○ Public ◇ Protected □ Private フィールド メソッド
29.
クラス図の読み方 3/6 • 関連 –
実線で繋ぐとつながりを示す – 実線矢印で繋ぐと一方通行の関連を示す (「使う側 → 使われる側」という向きで引く) PlayerとItemは 相互に関係がある WeaponはBulletを知ってる BulletはWeaponを知らない
30.
クラス図の読み方 4/6 • 依存 –
破線矢印:片方が相手の状態に対して影響を受ける • 例)麻痺状態になるとすばやさが1/4になる
31.
クラス図の読み方 5/6 • 集約、コンポジション –
それぞれ「本体とパーツの関係」を表す • ◇が集約:分解できる関係 • ◆がコンポジション:分解できない関係 – 数字を書くと個数を表す 集約 コンポジション
32.
クラス図の読み方 6/6 • 汎化 –
白抜き実線矢印:クラスの継承関係を表す • 実現 – 白抜き破線矢印:インターフェイスの実装を表す BossはEnemyを 継承している Blockは IBreakableを 実装している
33.
読み方はわかった
34.
じゃあ描く時は?
35.
PlantUMLを使うことをおすすめ • テキストベースでUML図が描けるスグレモノ – クラス図の他にシーケンス図やアクティビティ図も描ける –
AtomやVS Codeにプラグインを入れればすぐ使える
36.
覚えておくべき知識 • クラス図の読み方 • SOLID原則 •
デザインパターン
37.
SOLID原則
38.
SOLID原則 • オブジェクト指向プログラミングにおける5つの原則 – 「原則」の名の通り、理由があって違反するのは問題はない •
SOLID原則を意識すれば設計はだいたいは上手くいく – Unity開発でも当然SOLID原則は有効 • 普通はオブジェクト指向で開発するしね?
39.
5つの原則 • 単一責任原則 – Single
Responsibility Principle • オープン・クローズド原則 (重要) – Open-Closed Principle • リスコフの置換原則 – Liskov Substitution Principle • 依存性逆転の原則 (重要) – Dependency Inversion Principle • インターフェイス分離の原則 – Interface Segregation Principle
40.
単一責任原則 Single Responsibility Principle
41.
単一責任原則 「1個のクラスに役割は1つ」 • 1つのクラスを変更する理由は1つでないといけない – 1個のクラスに複数の仕事を持たせてはいけない •
クラスの名前を適切につけるのがコツ
42.
例:単一責任原則に違反したクラス • PlayerControllerクラス – キー入力管理 –
移動 – アニメーション再生 – 体力管理 – エフェクト・効果音再生 1つのクラスに機能が詰まりすぎ! 機能追加や修正する時に、関係ない部分に影響が出る可能性が高い!
43.
単一責任原則を守ったクラス 役割に応じてクラスを分割しよう! 名前を見たら何をするのかすぐわかるくらいの粒度が適切 • 移動管理:PlayerMover • 入力管理:PlayerKeyInput •
アニメーション:PlayerAnimator • エフェクト再生:PlayerEffectPlayer
44.
オープン・クローズド原則 Open-Closed Principle 重要
45.
オープン・クローズド原則 モジュールは 拡張について開いていなければならず、 修正に対して閉じていなければならない
46.
どういう意味? • 機能の追加は簡単にできないといけない(オープン) • ただしその時に修正が発生してはいけない(クローズ)
47.
要するに? • 基底クラスやインターフェイスを使って、 抽象的に操作できるようにしよう
48.
よくない例 • Bulletクラスが相手に対してダメージを与えるコード – Tagを見てswitch文で処理を分岐している
49.
何がダメ? • Bulletの操作対象が増えた時にコードに修正が必要 – 全てのSwitch文を漏れなく探して書き換える必要がある –
変更の手間もかかるし、修正漏れがあっても気づけない Bossを実装したのでSwitch文に追加 もし追加を忘れてもエラーにならないし動いてしまう
50.
どうすればいいのか? • 処理を「抽象」に依存させればよい – 基底クラスやインターフェイスを使って処理を呼び出す実装に変える •
こうするとSwtich文は不要になる
51.
オープン・クローズド原則 • インターフェイスや基底クラスで抽象化しよう – 使う側が相手の型を意識する実装は不健全である –
機能を追加する時は「継承」や「実装」を行えばよい – 既存コードの変更は一切不要になる • GetComponet<T>はインターフェイスも指定できる – 指定インターフェイスを実装したコンポーネントを取得できる – 相手が何のオブジェクトか意識せずに処理を書くことができる
52.
リスコフの置換原則 Liskov Substitution Principle
53.
リスコフの置換原則(LSP) 派生型はその基底型と 置換可能でなければいけない
54.
どういう意味? • 派生型は基底型で決めたルールを変更してはいけない – アクセス修飾子を派生で勝手に上書きしてはいけない –
メソッドを実行するのに必要な判定を基底より強化してはいけない – メソッドの実行結果を基底より緩くしてはいけない
55.
LSP違反すると何が起きるのか? • 型安全性がこわれる – 間違えた使い方をしてもコンパイルエラーにならない –
実際に動かすまで正しく動作するかわからない • 「型」を意識してコードを書く必要が出て来る – ある型の時のみ処理を分岐する、みたいな処理が出て来る – オープン・クローズド原則に違反する
56.
LSPを違反させる例 • IDをもつ「Enemyクラス」 – IDが同じならば同一の敵であると判定する
57.
同一性のチェック • IDが同じならtrue • IDが違ってたらfalse •
この場合は正しく動く!
58.
LSP違反クラス • 「EnemyWithTeamIdクラス」 – IDとTeamIDの2つを使って同一性チェック –
基底のIsSameEnemyをnewで隠蔽している
59.
同じクラス同士で比較すると… • ちゃんと判定できる – Idが同じでもTeamIdが違うのでfalse判定になる
60.
これをEnemyにアップキャストすると… • 判定が壊れる – 両者でIsSameEnemyの挙動が違うのだからあたりまえ –
“EnemyWithTeamId”を”Enemy”として扱うと危険になってしまった
61.
リスコフの置換原則 • 基底クラスの定めたルールには従うこと – 派生クラスで勝手にルールを書き換えると動作保証できなくなる –
is-aの関係を破壊するような継承を行うと違反しやすい – Equalsのoverrideも違反しやすいので注意 • C#のnew修飾子はLSP違反を引き起こす可能性が高い – newでメソッドを隠蔽すると基底と派生でふるまいが変わってしまう – メソッドを上書きする場合はできるだけvirtual・override修飾子を使おう
62.
依存性逆転の原則 Dependency Inversion Principle 重要
63.
依存性逆転の原則(DIP) 上位モジュールが下位モジュールに依存してはいけない どちらも抽象に依存するべきである
64.
つまり? • 上位モジュールが仕様を決め、 下位モジュールがその仕様に従うのが正しい姿である – 上位モジュール:相手を使う側のクラス –
下位モジュール:上位から使われる側のクラス 下位 上位
65.
だめな例 • 上位モジュール:Player • 下位モジュール:Enemy •
PlayerがEnemyに対してApplyDamageを実行する
66.
下位モジュールを変更する 「Enemyの種類が追加された」 「ApplyDamage()の仕様を一部勝手に書き換えた」 ↑ 増えた ↑ 引数が増えた
67.
上位に変更が必要になる • PlayerはApplyDamage()の呼び出しを全部書き換える必要がある – シグネチャが変わったことに対応しないといけない –
Enemy2が増えたことで処理の分岐も必要になる – オープン・クローズド原則にも違反している
68.
修正:依存関係を逆転させる • インターフェイスをPlayer側に定義してそれを使う – インターフェイスの管轄をPlayer側にするのがキモ –
EnemyにPlayerの仕様を押し付けることができるようになる
69.
依存関係の「逆転」 • 矢印の向きがちゃんと逆になってる
70.
適用できる場所の例 • クラス内で他のクラスを直接newしている → 他のClientに差し替えようとするとコードの修正が必要になる
71.
依存性逆転をすると • 依存するインスタンスを切り替えられるようになる – 用途に合わせてClientを差し替えられる
72.
他にも… • Singletonへの依存を弱めることができる – UnityだとManagerクラスをSingletonで作ることが多い –
利用するManagerを外から渡してあげるようにすれば、 Singletonへの依存が消せるようになる
73.
依存性逆転の原則 • 依存関係をインターフェイスを使って整理しよう – 上位が仕様を決め、下位がそれに従うのが正しい設計 •
インターフェイスの使い所はここ! – インターフェイスは依存性逆転を行うためにある(と思う) • 「依存性注入」への話にもつながる – 詳しくは後述
74.
インターフェイス分離の原則 Interface Segregation Principle
75.
インターフェイス分離の原則 クライアントが利用しないメソッドへの依存を 強制してはいけない
76.
意味 • インターフェイスは適切な粒度で定義しよう – 不必要なメソッドがインターフェイスに紛れていると 使う側で混乱する –
インターフェイスを適切に分離し、 必要なインターフェイスにだけアクセスできるようにしよう
77.
SOLID原則のまとめ • SOLID原則はクラス設計の中核 – これをちゃんと守っていれば設計はだいたいなんとかなる •
SOLID原則は絶対ではない – あくまで「原則」 – あえて違反したほうが逆にキレイにまとまるんであれば、 違反してもよい(柔軟に対応しよう)
78.
特に • オープン・クローズド原則 • 依存性逆転の原則 •
この2つは特に重要で、ここをしっかり意識すると かなりまともな設計ができる
79.
覚えておくべき知識 • クラス図の読み方 • SOLID原則 •
デザインパターン
80.
デザインパターン
81.
デザインパターン • プログラムにおける設計の定石 – こういう時はこの設計にするといいよ、というパターン集 •
GoFデザインパターンが特に有名 – 23個の汎用パターン – 他にもMVCやMVVMやMVPといったアーキテクチャに関する デザインパターンもある
82.
GoFデザインパターン一覧 • Iterator • Adapter •
TemplateMethod • FactoryMethod • Singleton • Prototype • Builder • AbstractFactory • Bridge • Strategy • Composite • Decorator • Visitor • ChainOfResponsibility • Facade • Mediator • Observer • Memento • State • Flyweight • Proxy • Command • Iterpreter
83.
個人的によく使うGoFのパターン • GoFのデザインパターン – Observerパターン –
Mementoパターン – Facadeパターン
84.
Observerパターン • イベントの通知と購読を実現するパターン • 観察者(Observer)と観察対象(Subject)が登場する •
「Rx」はObserverパターンをベースに作られている – UniRxを使っている人は自然にこのパターンを使っているはず
85.
Mementoパターン • Undo機能を実現するパターン – インスタンスの状態を別の場所に保存しておくことで、 特定のタイミングでインスタンスの状態を巻き戻せるようになるパターン •
パズルゲームで1手前の状態に戻す • プレイヤが死んだらプレイヤのステータスを開始時点に戻す • などといった場面に使える
86.
Facadeパターン • 処理を簡単化する窓口を提供するパターン – GameObjectにたくさんのコンポーネントが張り付いていて、 どこから欲しい情報を集めたら良いのかわからない! みたいな時に、処理を一括して受け付ける窓口を提供する
87.
例 • Playerから情報を取得したい – 今ダッシュしているのか? –
今空中にいるのか? – 気絶しているのか? – 何のアニメーションを再生しているのか? • どのコンポーネントから情報を取り出せば いいんだ?
88.
Facadeオブジェクトを作る • PlayerDataProvider – プレイヤの情報を収集して外に返す窓口クラス
89.
外からの情報取得が簡単になる • PlayerDataProviderさえ取得すれば情報が取れる – PlayerDataProviderが代表してデータの収集をする –
内部の構造がどうなっているか外から気にしなくて済む – 複雑なシステムを外からは簡単に触れる用にしたい時に Facadeパターンは有効
90.
デザインパターンのまとめ • 設計作業の指針にできる – 何かのデザインパターンに当てはめると簡単に実装できたってこともある –
チームでコミュニケーションを取る時に、デザインパターンの名前がスッと 出てくると話が早い • ただしデザインパターンに振り回されてはいけない – メリットもあるが、デメリットもあるパターンが存在する – デザインパターンを妄信せず、自分で考えてアレンジする必要がある
91.
覚えておくべき知識・まとめ • クラス図の読み方、描き方 – クラス図を読めるようになるとよい –
描く時はPlantUMLを使うのがおすすめ • SOLID原則 – 特にオープン・クローズド原則と依存性逆転の原則が 個人的に重要だと思う • デザインパターン – 覚えておくとよい
92.
以上が設計のお話
93.
おしながき • 設計とは – 設計とは何か、設計の何がよいのか –
モデリングとクラス設計 • 覚えておくべき基礎知識 – クラス図の読み方 – SOLID原則 – デザインパターン • Zenjectの紹介 – 依存性注入とは何か • まとめ
94.
Zenject
95.
Zenjectとは • 依存性注入を管理してくれるフレームワーク – AssetStoreから無料でDLできる(MITライセンス) –
最近は採用事例が増えてきた
96.
Zenjectを知るにはまず 依存性注入の理解が必要
97.
依存性注入 Dependency Injection
98.
依存性注入 • オブジェクトを外から「注入」すること – Dependency
Injection、略してDIと呼ぶことが多い • Dependencyに「依存性」という訳が当てられているが、 本来の意味としては「オブジェクトの注入」である – 依存性逆転の原則(DIP)を適用した場合はこのDIが 必要になる
99.
どの場面でDIは使うのか? • 依存性逆転の原則を適用した時 – 実際に使うクラスをインタンス化し、上位モジュールに 渡してあげる作業が「DI」
100.
(Zenjectの話は一旦忘れて) 手作業でDIしてみる