0
0
テーマ、知りたいこと
Unityで画面などを作成する際にMVPパターンのが紹介されている記事をよく読んでおり、対応手段について意見をお聞きしたいです。
知見がそれほどあるわけではないのでお手柔らかにお願い致します。
下記に実装パターンを記載し、自分の感想も記いたしますのでMVPパターンから外れているか、このようにすれば良いのではないかなど気になった箇所の指摘をいただきたいです。
下記は「人の情報」を表示する実装の例
(後々リスト化表示などもしたい)
実装1
流れとしては
ModelクラスはPersonというマスターデータ情報を持っている
Viewクラスは表示用で表示に必要なパラメータクラスを渡して表示を一括更新する
PresenterクラスはModelの情報からViewの表示用パラメータクラスを作成してViewに渡す
※Viewでは「NickName」というPersonマスターデータにはない表示項目があり、View表示用パラメータで表示用に設定している
●「人」データ(マスターデータのような不変のデータ)
C#
1public class PersonData 2{ 3 public string name; 4 public int age; 5 public float height; 6 public float weight; 7}
●Modelクラス
C#
1public class TestModel 2{ 3 public PersonData personData; 4}
●Viewクラス
C#
1public class TestView : MonoBehaviour 2{ 3 // Viewパラメータクラス 4 public class ViewData 5 { 6 public string Name { private set; get; } 7 public string NickName { private set; get; } 8 public int Age { private set; get; } 9 public float Height { private set; get; } 10 public float Weight { private set; get; } 11 public ViewData(PersonData data) 12 { 13 this.Name = data.name; 14 this.NickName = "nickname_" + this.Name; 15 this.Age = data.age; 16 this.Height = data.height; 17 this.Weight = data.weight; 18 } 19 } 20 21 [SerializeField] private TextMeshProUGUI nameText; 22 [SerializeField] private TextMeshProUGUI nickNameText; 23 [SerializeField] private TextMeshProUGUI ageText; 24 [SerializeField] private TextMeshProUGUI heightText; 25 [SerializeField] private TextMeshProUGUI weightText; 26 27 28 public void ReDisplay(ViewData viewData) 29 { 30 // 色々表示 31 } 32}
●Presenterクラス
C#
1public class TestPresenter : MonoBehaviour 2{ 3 private TestModel model; 4 public TestView view; 5 6 void Start() 7 { 8 // Modelの情報からViewで表示するパラメータを作成してViewに渡す 9 var viewData = new TestView.ViewData(this.model.personData); 10 this.view.ReDisplay(viewData); 11 } 12}
実装2
流れとしては
ModelクラスはView表示用インターフェースを実装した「PersonInfo」を持っている
Viewクラスは表示用で表示に必要なパラメータインターフェースを渡して表示を一括更新する
PresenterクラスはModelの持っているView表示用インターフェースを実装した「PersonInfo」をViewに渡す
※Viewでは「NickName」というPersonマスターデータにはない表示項目があり、View表示用インターフェースで設定している
●「人」データ(マスターデータのような不変のデータ)
C#
1public class PersonData 2{ 3 public string name; 4 public int age; 5 public float height; 6 public float weight; 7}
●Modelクラス
C#
1public class TestModel 2{ 3 private PersonData personData; 4 public PersonInfo personInfo; 5 6 public TestModel() 7 { 8 // personData取得する(略) 9 personInfo = new PersonInfo(this.personData); 10 } 11 12 public class PersonInfo : TestView.IViewData 13 { 14 public string Name => this.personData.name; 15 public string NickName => "nickname_" + this.personData.name; 16 public int Age => this.personData.age; 17 public float Height => this.personData.height; 18 public float Weight => this.personData.weight; 19 20 public PersonData personData; 21 public PersonInfo(PersonData data) 22 { 23 this.personData = data; 24 } 25 } 26}
●Viewクラス
C#
1public class TestView : MonoBehaviour 2{ 3 // View表示用インターフェース 4 public interface IViewData 5 { 6 public string Name { get; } 7 public string NickName { get; } 8 public int Age { get; } 9 public float Height { get; } 10 public float Weight { get; } 11 } 12 13 [SerializeField] private TextMeshProUGUI nameText; 14 [SerializeField] private TextMeshProUGUI nickNameText; 15 [SerializeField] private TextMeshProUGUI ageText; 16 [SerializeField] private TextMeshProUGUI heightText; 17 [SerializeField] private TextMeshProUGUI weightText; 18 19 20 public void ReDisplay(IViewData viewData) 21 { 22 // 色々表示 23 } 24}
●Presenterクラス
C#
1public class TestPresenter : MonoBehaviour 2{ 3 private TestModel model; 4 public TestView view; 5 6 void Start() 7 { 8 this.view.ReDisplay(model.personInfo); 9 } 10}
実装1、実装2の違い
●実装1
View表示用パラメータはPresenterがModel情報をもとに作成する
ModelはPersonという情報のみ持っている
ViewにはPresenterが作成したView用パラメータを渡す
●実装2
View表示用パラメータはModel内でインターフェースを実装したクラスを作成して対応している
ModelはPersonという情報とView表示用インターフェースを実装したPersonInfoというクラスのインスタンスを持っている
ViewにはPresenterがModelから取得したView表示用インターフェースを実装したクラスのインスタンスを取得して渡す
●実装1についての感想
ModelとViewが完全に分かれているで分担しやすい
仮にPerson情報が100件ありリスト表示化するなどの対応になってソートで表示が変わることになったらView表示更新用にView表示用パラメータクラスのインスタンスを100個分作り直す必要がある。
→ソート毎にView表示用パラメータを作成する必要がある
●実装2についての感想
Modelクラス内にView表示用インターフェースを実装したクラスがあり完全に分かれていはいないように思える。
仮にPerson情報が100件ありリスト表示化するなどの対応になってソートで表示が変わることになったらView表示更新用にView表示用パラメータクラスのインスタンスを100個分作り直す必要がない。
→ソートしてもインターフェースを実装したクラスのインスタンスのリストをソートすればよいだけなのでView表示用パラメータを都度作成ししなくてよくなる。
回答2件
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。