はかせのラボ

私の頭の中を書いていく雑記ブログです

プログラミング MVPパターン ~設計偏~

あいさつ

どうも、はかせです。
前回までは理論とメリットを話しました。
今回は実装する前段階として設計をやっていきます。

まずは設計

実装をする前にはしっかり設計をしていきましょう。
設計は大事です(戒め)

とはいってもMVPそのものの設計はそんな多くないです。
図にするとこんな感じ
f:id:hakase0274:20190319233710p:plain

究極論MVPパターンってのはUIとロジックを別離して
それぞれの中継役を作れば成立します。

ただこのまま作るとMVPパターン的にちょっとうーんって感じになります。
このまま行くとModelはPresenterを知っている必要がありますし、
ViewはPresenterを知っている必要があります

PresenterがModelとViewを知っているのは中継役だから仕方ないとしても
ModelとViewは結果を公開しますが誰がデータを受け取るなんて
こいつらにとっては心底どうでもいいことのはずです。
つまりこうしたいです。
f:id:hakase0274:20190319235302p:plain

要は中継役であるPresenterが監視役となって
値の変更をそれぞれのレイヤーに伝える形ですね。
こうすることでModelはModelで完結できますし、
ViewはViewで完結できます。
UIとロジックを完全に別離できます。

ただこのままでも少し足りません。
なぜならModelもViewも確かに独立してますが
情報を全て内側に隠してしまっているため
Presenterが監視しても変更されたかどうかわからないからです。

なのでこんな感じで
f:id:hakase0274:20190319235723p:plain
外部に伝えるべき値を通知する機能を付けるとしましょう。

とりあえずざっくりとですが設計はこんな感じにしましょう。

あとがき

今回は設計編でした。
次回はこの設計をもとに実装をしていきます。
(色々やってたらブログ書く時間が無くて超焦ってます)

それでは今回はこの辺でノシ

プログラミング MVPパターン ~理論編②~

あいさつ

どうも、はかせです。
今回はMVPパターンのメリットについてです。
どういうものなのかは前回の記事をご覧ください。
hakase0274.hatenablog.com

疎結合に作りやすい

MVPパターンでは
計算
中継
描画

といった風に機能ごとにレイヤーが分かれています。

そして中継レイヤーがあるため計算と描画レイヤーは完全に分離されます。
中継レイヤーも結果を受け取る・渡すだけなので
それぞれのレイヤーの中身を知ることがありません。

各レイヤーは結果でのみつながっているため
処理を変えても他のレイヤーに影響を与えません。

拡張性が高くしやすい

これはさっきの疎結合に作りやすいというメリットによって
発生するメリットです。

各レイヤーは結果でのみつながっていると書きました。
つまり目的の結果を渡す・受け取れるならどのような実装をしてようが問題ないのです。

よくあるリモコンの例えでもしてみましょうか。
リモコンの電源ボタンを押すと対応する機械の電源がつきます。

人間はリモコンがどうやって信号を送ってるかなんて知りませんし
リモコンは機械が信号受けてからどんな処理してるかなんて知りませんし
機械は誰がどうやって自分に信号を送信してるかなんて知りません。

人間はリモコンの電源ボタンを押したら
電源を付ける信号が送られるという結果だけ知っていますし、
リモコンは電源ボタンが押されたら
対応する信号を対応機器に送るという処理をするだけですし、
機械は信号が来たら電源を付けるという処理を行うだけです。

つまり機械の動作には
誰がなんのリモコンで操作したかなんて関係ないのです。
だから誰でも使える
スマートリモコンなんかでリモコンを変えても問題なく動くわけですね。

これが拡張性が高いということですね。
前後の処理が何であれ
決められた入力に対して決められた出力を返すだけの処理ならば
前後の処理の中身を変えても入力が変わらなければ出力も変わらないので
前後の処理を修正したりまるっと変えても問題ないよねってことです。

あとがき

今回は理論編②ということでMVPパターンのメリットについて書きました。
ちなみにメリットとして○○やすいという書き方をしました。
良く見聞きするものとしては○○になるみたいな断言的な言い方をすることが多いです。

今回私が少し濁したような書き方をしたのはMVPパターンを採用しただけでは
疎結合にもならないし拡張性も高くならないからです。

デザインパターンやらアセットやらはちゃんと使い方や概念を理解して初めてメリットが生まれます。
MVPパターンだって3つの機能レイヤーに分けても
それぞれのレイヤーが他の機能と絡んでいたら
疎結合とはいえないでしょうし、
疎結合でないなら拡張性もあまり高くない可能性が高いです。

まぁ長々と話しましたが、
要はちゃんと使い方を理解してから
用法用量守って正しく使って下さいってことですね。

それでは今回はこの辺でノシ