質問: MVCというデザインパターンでコード分けすることになっているのですが、 様々なサイトを見てみるもMVCがいまいち理解しきれません。 まず以下の考えは合っているでしょうか? * `Model`はUIに関係のないことをする * `View`は`Model`から情報を取得して表示する * `Controller`は`Model`と`View`の仲介役 また、`View`のイベントを処理して`Model`に何かさせるのが`Controller`かと思うのですが、 `Controller`には例えば`View#setOnClickListener`などを記述すれば良いのでしょうか? それとも`View#setOnClickListener`自体は`View`に記述して `View#onClickListener`かその中身を`Controller`に記述するほうが良いでしょうか? あと、Androidの`Activity`や`Fragment`は`View`と`Controller`どちらに当てはまるのでしょうか? それから、`Fragment`にはどこまでやらせるのがよいのでしょうか? 現状はxmlからの`View`生成程度しかやらせておらず、その`View`にデータをセットしたりというのは別のクラスでやらせています。
回答: > > ModelはUIに関係のないことをする > > > 「ModelはUIに関する処理を担当しない」って意味ならイエス だがMVC間で「関係ない」っつー言い方はしねー。二つにまたがるもんは必ず出てきてどっちに実装するか考えることになる > > ViewはModelから情報を取得して表示する > > > イエス ただ二者の関係を考えんなら双方向だ。ビューは表示するデータをモデルに依存するがモデルはビューに頼ることは何もねー。それと取得というより参照だ > > ControllerはModelとViewの仲介役 > > > ノー。コントローラが仲介するのはユーザーとモデルだ ユーザーの存在 - 操作を受ける - モデルを変更する - ビューを更新する、っつー流れだ。お前の考えではユーザーの存在が抜けてねーか > > Viewのイベントを処理してModelに何かさせるのがControllerかと思うのですが... > > > ここ微妙に違うんだけどな、質問の要旨は次だから飛ばすわ > > Controllerには例えばView#setOnClickListenerなどを記述すれば良いのでしょうか? > > > イベントリスナをどこに書いたらいいかっつー話だろ。コントローラだ んでビューとコントローラが性質上融合してっからそのままViewクラスに書けばいい。イベントリスナのメソッドが用意されてりゃクラス名がViewでもコントローラの役割があるっつー逆説的な考え方だよ > > AndroidのActivityやFragmentはViewとControllerどちらに当てはまるのでしょうか? > > > コントローラ ユーザー操作をメソッドの形でアプリ、言い換えるとプログラマに伝えてるだろ。アプリのライフサイクルもユーザーが端末をスリープさせたとかアプリを終了させたとかいう操作なんだよ > > Fragmentにはどこまでやらせるのがよいのでしょうか? > > > 開発者次第だが基本はコントローラの範囲だろ。まずはモデルに属するメソッドを呼べ 実装のコツ * コントローラのイベントリスナのメソッドではモデルの操作をするだけ * ビューはモデルの変更を自動的に知り自身を更新する アプリ全体の大きなMVC以外にも内部の小さなMVCを意識しろ。モデルはアプリのデータだけじゃねーぞ。スイッチのオンオフ状態、ビューのツリー構造、ボックスの背景色の値もモデルだ。そしてMVCの関係は必ずしもクラスで切り分ける必要はねー。ユーザーの操作で発生した仕事の流れをコントローラから始まりビューの更新で終わるという一定のパターンにしろ コメントへの返答 > > MVCモデルの概念を漫画で解説してみる > > > 俺の考えでは「Viewを窓口」と言っている時点で間違いだ(窓口はコントローラだ)。だが理論を実装に落とし込んだ時にそう考えるようになったんならそれがそいつの実装結果だ 実装時は言語仕様やMVC各要素の比重などあらゆる要因で設計が変わる。ひとつのビューがふたつの異なるモデルの表示を担当することもある。柔軟に考えろ。変化しないのはユーザー操作から発生する操作受付、モデル変更、ビュー更新の仕事の流れだ > > 話の中に出てくる"おしゃれした私"がどういう変化か理解しきれていません。 > > > クラスを用いた処理の抽象化と外部向けAPIの互換性保持の話だ。MVCに限らねークラス設計の常識だ > > あんな風に完全分業できないですよね? > > > デザインパターンは「人の分業」は目的にしてねーだろう ボタンの配置からコマンドまでをデザイナに一作業だけで変更させるならそうできる仕組みを開発環境側で構築するしかねー