【Java】 MVC2モデルの復習しつつ RPGのダメージ計算するプログラムを書く #1

Created: 2025/03/11

はじめに


——新学期が近づくにつれ
        焦りと期待が入り混じるこの季節——

そんな中、突然、
 iwa先輩から

  天からのお告げが聞こえた

          「書け」

    それはまるで天啓のように私の心に響き渡った。


茶番はこのくらいにして

今回は、臨地で学んだ復習も兼ねて
レイヤードアーキテクチャのMVCモデル2について記事を書いて行こうと思います。

何も作らないのも味気ないので
RPGの戦闘によるダメージ計算的なプログラムも作成する予定です。

皆様のお役に立てれば嬉しくて震えます。

MVCモデル2について

まずMVCモデルとは

Model-View-Controllerモデル略してMVCモデル

  • モデル(Model)
  • ビュー(View)
  • コントローラ(Controller)

この3つのコンポーネント(部品)で構成する
ソフトウェア開発方法論のことを指します——以上

これで、理解出来たら 多分才能に溢れているので読み飛ばしてください
もう少し説明します。


各コンポーネントの役割

モデル(Model)
 データの管理ビジネスロジック(計算とか)
ビュー(View)
 UIModelの結果を表示
コントローラ(Controller)
  ユーザーからの入力を受け取り、Modelを操作しViewに結果を渡す

関係は以下の図のようになっています。

画像

このような関係のため、処理の流れは
 1. ユーザーのアクションをViewが検出しViewControllerを動かす
 2. ControllerModelを動かす
 3. ModelViewに通知を送る
 4. ViewModelからデータを取得
 5. Viewが表示
のようになっています。

そのため、MVCモデルでは以下のような問題が発生しやすくなります。

  • Viewの処理がControllerに依存している
    • ViewがControllerに直接依存するため、UIを変更するたびにControllerの修正も必要になる。
  • ViewとControllerが密接に結びついていて開発が面倒
    • モジュールごとの独立性が低く、テストや修正がしにくい。
  • 一部のControllerの処理がView側に書かれてしまう
    • Viewが本来の役割を逸脱し、業務ロジックが混在することで管理が難しくなる。

本来Controllerが担当するべき処理がView側に書かれてしまうことがあり
結果として不自然な設計になってしまいます。

なんて気持ち悪い設計だ

本題のMVCモデル2とは

もうお察ししてる人も多いかと思いますが
MVC2(MVCモデル2)は、MVCが改良されたものになります。

Windowsと違って数字が上がることで利便性良くなるの不思議~

改良内容を具体的に言うと
そのMVCの考え方をベースに、Webアーキテクチャを適用し生まれたこと。

改良によって生まれた違いは
MVC2Controllerがすべて制御するようになったことです。

各コンポーネントの役割は同じなので省略します。

以下の図を見てください。

画像

上の図からも読み取れるように

Viewから直接Modelのデータを取ることはありません。
Controllerが橋渡しをします。

そして、Controllerがすべての処理を制御しているため
互いの依存度が低く、独立性が保たれています。

これにより
各コンポーネントが本来の役割から逸脱することはありませんし
テストや修正も容易になります。

さらに
Controllerが処理の呼び出しを行っているため
Controllerのプログラムのコードを見るだけで
プログラムの全体の流れを把握することが出来ます。

MVCモデル2MVCモデルと違い
Model, View, Controllerを明確に分離し
処理の呼び出し元はControllerのみなので
作り手にも読み手にも優しい設計であると言えると思います。

まとめ

この記事では
MVCモデルとその改良版であるMVCモデル2について解説しました。

MVCモデル2ではControllerがすべてを制御することで
各コンポーネントの役割が明確になり
保守性や可読性が向上するという利点があります。

皆さんも試しに是非使ってみてください。

この記事は初めて書いたので、不十分な点や改善できる部分があるかもしれません。
もし気になる点があれば、ぜひご指摘いただけると嬉しいです!
最後まで読んでいただき、ありがとうございました。

次回からはコーディングしていこうと思います。