回答編集履歴

1 回答追記

TakeOne

TakeOne score 5443

2015/10/09 08:45  投稿

コメントモデルとコメントリストモデルの2つがあると考えること自体がおかしいです。
それぞれのユーザー名とコメントといいね数は同じものですから、それを2つのモデルで別のデータとして管理してはいけません。今回の場合、ユーザーの集合と、それに対するコメントと、それに対するいいね数が管理されているモデルは1つです。それはサーバーのデータベースで管理されています。そのサーバーのデータベースにアクセスする処理をまとめて1つのモデルクラスにすればいいです。そして、そのモデルをどう見せるかかビューで、1つのモデルから、複数のユーザー名とコメントの一部といいね数を取り出して一覧として表示するビュー(一覧画面)と、同じ1つのモデルから、指定された1つのユーザ名とそのユーザーのコメント全体といいね数を取り出して表示するビュー(詳細画面)の2つがあるということです。
そして、いいねボタンが押された時に、必要な処理を実施するのがコントロールです。いいねボタンが押されたら、コントロールは、モデルに対していいね数のカウントアップを依頼し、現在表示されているビューに対して現在のモデル状態で画面を再表示する依頼をすればいいだけです。
ビュー毎にモデルを作ると、今回の質問のように本来1つのデータなのに別々のモデルに同じデータが存在してしまい、その整合性を気にしないといけなくなり、処理が複雑になります。それはMVCモデルではありません。そういう事態にならないようにするために本来1つのデータは1つのモデルで管理するのがMVCモデルです。
ビュー毎にモデルを作ると、今回の質問のように本来1つのデータなのに別々のモデルに同じデータが存在してしまい、その整合性を気にしないといけなくなり、処理が複雑になります。それはMVCモデルではありません。そういう事態にならないようにするために本来1つのデータは1つのモデルで管理するのがMVCモデルです。
(10/9 8:43追記)
勘違いされるといけないので、少し補足します。
質問のコードのようにCommentクラスとCommentListクラスの2つを作ること自体は間違いではありません。その2つが別々に存在する別々のモデルであると考えることが誤っています。1つのモデルの中のデータ構造として、Commentクラスインスタンスの集合を持つCommentListクラスインスタンスが1つあると考えるのは正しいです。
例えば、詳細画面を表示するなら、
CommentListクラスに指定ユーザ名を持つCommentクラスインスタンス(CommentListクラス内で保持しているインスタンス)を返却するメソッドを作り、詳細画面のビューからそのメソッドを呼び出しCommentクラスを取得します。そしてCommentクラス内の各プロパティを参照して詳細画面を作ります。そして、いいねボタンが押されたら、Commentクラスのlikeメソッドを呼び出していいね数をカウントアップしてもらえばよいです。その場合カウントアップを依頼したCommentクラスは、CommentListクラス内で管理されているインスタンスですから、CommentListの方にも何か依頼する必要はないかと考える必要はありません。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る