Movatterモバイル変換


[0]ホーム

URL:


Hiroto Imoto, profile picture
Uploaded byHiroto Imoto
PDF, PPTX5,034 views

Humble Object Patternな話

Roppongi.unity #01のLT資料です。SpeakerDeckにアップロードできなかったのでSlideShareに上げています。最新のスライドは以下からhttps://speakerdeck.com/adarapata

Download as PDF, PPTX
Humble Object Patternな話Roppongi.unity #1 2019/02/21Roppongi.unity #1 2019/02/21
いもですいも(@adarapata)ゲームクライアントエンジニアadarapata.comRoppongi.unity #1 2019/02/21
ご注意2019/1/23にGotanda.unity #10で発表した「どこから始めるUnityTest」の時間切れで話せなかった後半部分にフォーカスした内容です。https://speakerdeck.com/adarapata/dokokarashi-meruunity-testなので前回と若干被る話が多いのでご了承ください。Roppongi.unity #1 2019/02/21
今日の話Humble Object Pattern についてRoppongi.unity #1 2019/02/21
前提みんなテストが書きたくて手が震えているRoppongi.unity #1 2019/02/21
テストしにくさの元密結合staticなインスタンス入力イベントが絡む処理UIが絡む処理ファイル、DBなどの外部リソースが絡む処理etc..実際問題、どう綺麗に書いてもテストしにくい部分は出てくるRoppongi.unity #1 2019/02/21
テストピラミッド。上位に行くほど難易度が高いRoppongi.unity #1 2019/02/21
コスト高いのでテスト避けたいわかる時にはそういう判断も必要かもしれない書かない≠ 書けない書けない理由は明らかにすべき。ピラミッドの境界を跨ぐような処理を分割していくRoppongi.unity #1 2019/02/21
Humble Object Pattern とはテストしやすいものとしにくいものを住み分ける実装パターンテストしにくいものの実装をHumble(控え目)にする多分初出はxUnit Patternshttp://xunitpatterns.com/Humble Object.htmlクリーンアーキテクチャ本にも載ってたので有名かもRoppongi.unity #1 2019/02/21
public class PlayerUnit : MonoBehaviour {[SerializeField]private float _speed = 1F;void Update(){var horizontal = Input.GetAxis("Horizontal");var vertical = Input.GetAxis("Vertical");Move(new Vector3(horizontal, vertical));}private void Move(Vector3 direction){transform.position += direction * _speed;}}きちんと任意の方向に動くかテストを実装したいRoppongi.unity #1 2019/02/21
書きにくさポイント入力が絡むので書きにくいMonoBehaviorの機能に依存しているので書きにくいSerializeFieldも同様でも移動する部分は書きたい書きやすいものと書きにくいものを切り分ける。Unityにおける書きにくいものは大体MonoBehaviour絡みなのでそこから切り出す。Roppongi.unity #1 2019/02/21
public interface IPlayerUnit {float Speed { get; }Vector3 Position { get; set; }}// MonoBehavior成分を0にしたけど、移動ロジックを持つクラスpublic class PlayerUnitController {private readonly IPlayerUnit _unit;public PlayerUnitController(IPlayerUnit unit){_unit = unit;}public void Move(Vector3 direction){_unit.Position += direction * _unit.Speed;}}テストを書きにくいMonobehaviorからロジックを抽出するRoppongi.unity #1 2019/02/21
public class PlayerUnitHumble : MonoBehaviour, IPlayerUnit {[SerializeField]private float _speed = 1F;private PlayerUnitController _controller;public float Speed => _speed;public Vector3 Position {get => transform.position;set => transform.position = value;}void Start() => _controller = new PlayerUnitController(this);void Update() {var horizontal = Input.GetAxis("Horizontal");var vertical = Input.GetAxis("Vertical");_controller.Move(new Vector3(horizontal, vertical));}}Roppongi.unity #1 2019/02/21
変更点移動処理の詳細と、Monobehaviorが離れた具体的な処理は PlayerUnitController に任せるようになったテストしやすいものとしにくいものに分かれたピラミッドの境界が明確になった切り分けられたので、移動処理のテストも書ける。入力のテストはやらない!移動処理を行う側はインタフェースだけ見ているので、差し替えが楽。Roppongi.unity #1 2019/02/21
IPlayerUnitは状況に応じて差し替えられるRoppongi.unity #1 2019/02/21
IPlayerUnitは状況に応じて差し替えられるRoppongi.unity #1 2019/02/21
テストコードpublic class PlayerUnitTest {// テスト用のいい感じモックpublic class MockPlayerUnit : IPlayerUnit {public float Speed { get; set; }public Vector3 Position { get; set; }}[Test]public void PlayerUnitMove() {var unit = new MockPlayerUnit { Speed = 5, Position = Vector3.zero };var controller = new PlayerUnitController(unit);controller.Move(Vector3.up);Assert.AreEqual(new Vector3(0,5F,0), unit.Position);}}Roppongi.unity #1 2019/02/21
まとめテストしにくい部分は発生するテストしにくいところとしやすいところを分けて、書ける領域を増やすHumble Objectはそれらを切り分けるRoppongi.unity #1 2019/02/21

Recommended

PDF
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
PDF
ドメイン駆動設計の正しい歩き方
PDF
なぜデータモデリングが重要なのか?
PPTX
世界一わかりやすいClean Architecture
PDF
【メタサーベイ】基盤モデル / Foundation Models
PDF
オブジェクト指向プログラミングのためのモデリング入門
PDF
世界でいちばんわかりやすいドメイン駆動設計
PDF
実践的な設計って、なんだろう?
PPTX
【DL輪読会】時系列予測 Transfomers の精度向上手法
PDF
オブジェクト指向エクササイズのススメ
PPTX
テストコードの DRY と DAMP
PDF
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
PDF
それはYAGNIか? それとも思考停止か?
PDF
ソフトウェアにおける 複雑さとは何なのか?
PDF
テスト文字列に「うんこ」と入れるな
PDF
イミュータブルデータモデル(入門編)
PDF
ドメイン駆動設計 本格入門
PDF
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks?
ODP
どこに何を書くのか?
PDF
Optimizer入門&最新動向
PDF
幾何と機械学習: A Short Intro
PDF
イミュータブルデータモデル(世代編)
PDF
イミュータブルデータモデルの極意
PPT
ドメインロジックの実装方法とドメイン駆動設計
PDF
[DL輪読会]Learning to Simulate Complex Physics with Graph Networks
PDF
C++の話(本当にあった怖い話)
KEY
やはりお前らのMVCは間違っている
PDF
最適化超入門

More Related Content

PDF
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
PDF
ドメイン駆動設計の正しい歩き方
PDF
なぜデータモデリングが重要なのか?
PPTX
世界一わかりやすいClean Architecture
PDF
【メタサーベイ】基盤モデル / Foundation Models
PDF
オブジェクト指向プログラミングのためのモデリング入門
PDF
世界でいちばんわかりやすいドメイン駆動設計
PDF
実践的な設計って、なんだろう?
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
ドメイン駆動設計の正しい歩き方
なぜデータモデリングが重要なのか?
世界一わかりやすいClean Architecture
【メタサーベイ】基盤モデル / Foundation Models
オブジェクト指向プログラミングのためのモデリング入門
世界でいちばんわかりやすいドメイン駆動設計
実践的な設計って、なんだろう?

What's hot

PPTX
【DL輪読会】時系列予測 Transfomers の精度向上手法
PDF
オブジェクト指向エクササイズのススメ
PPTX
テストコードの DRY と DAMP
PDF
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
PDF
それはYAGNIか? それとも思考停止か?
PDF
ソフトウェアにおける 複雑さとは何なのか?
PDF
テスト文字列に「うんこ」と入れるな
PDF
イミュータブルデータモデル(入門編)
PDF
ドメイン駆動設計 本格入門
PDF
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks?
ODP
どこに何を書くのか?
PDF
Optimizer入門&最新動向
PDF
幾何と機械学習: A Short Intro
PDF
イミュータブルデータモデル(世代編)
PDF
イミュータブルデータモデルの極意
PPT
ドメインロジックの実装方法とドメイン駆動設計
PDF
[DL輪読会]Learning to Simulate Complex Physics with Graph Networks
PDF
C++の話(本当にあった怖い話)
KEY
やはりお前らのMVCは間違っている
PDF
最適化超入門
【DL輪読会】時系列予測 Transfomers の精度向上手法
オブジェクト指向エクササイズのススメ
テストコードの DRY と DAMP
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
それはYAGNIか? それとも思考停止か?
ソフトウェアにおける 複雑さとは何なのか?
テスト文字列に「うんこ」と入れるな
イミュータブルデータモデル(入門編)
ドメイン駆動設計 本格入門
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks?
どこに何を書くのか?
Optimizer入門&最新動向
幾何と機械学習: A Short Intro
イミュータブルデータモデル(世代編)
イミュータブルデータモデルの極意
ドメインロジックの実装方法とドメイン駆動設計
[DL輪読会]Learning to Simulate Complex Physics with Graph Networks
C++の話(本当にあった怖い話)
やはりお前らのMVCは間違っている
最適化超入門

Humble Object Patternな話


[8]ページ先頭

©2009-2025 Movatter.jp