佐伯のメモ書き

やったことの覚え書きとか

MVCについて考える


おはようございます。
昨日まで取り掛かっていた業務内で制作部長にやんわりと全ボツを貰った佐伯です。
仕事にはしていますがまだまだペーペーのひよっこなのでこういうことはまあ、正直稀によくあるんですが採用になったのはデザインだけでシステム面ではほぼ全改修みたいなことになってしまいました。

今回ネックになったのはMVCで構築出来ていない』という部分なのですが、お恥ずかしい限りですがわたくしMVCという概念を初めて聞きました。こういう部分が独学で、資料も無くグーグル先生に頼り切った場合に起こる弊害かなと思います。
ということで、今回は自分のためのメモを含めてMVCという構成について書き留めます。

MVCとは

M(Model)
V(View)
C(Controller)
に分けて構築を行う形態です。
例えばですが「TOPページ」を作るのに「Index.php(コントローラー)」「top.php(ビュー)」「topFunction.php(モデル)」の三ファイルに分けて構築します。
更に言えばここに「header.php」「footer.php」も分けて構築するので何も考えずに全部突っ込んで作るのに比べるとファイル数が結構増えてしまったりなどします。
まあこれだけ言うと「ファイル多くなるなら管理大変やんけ!!!!」という話になりますが、まあぶっちゃけ結構面倒ではある。
ただこれがベスト、そしてポピュラーに使われている(らしい)というのは、その面倒な感じを差し置いても余りあるメリットがあるからこそです。(多分)

MVCの役割分担

結論から先に言ってしまうとMVCというのは役割分担のことです。
Model(処理を書く)、View(外見を書く)の二つをController(コネクター)で繋ぐ、みたいなイメージなんですかね。この辺私もよく分かっていない。
まあでも要するに「処理系(プログラム)」と「画面表示(HTML)」を別で書く、という話だけ分かっていれば大体問題ない(と思う)(実運用する時はだめです)。

これは弊部署のカッチョが出してくれた具体例ですが、WEBデザイナーとコーダーは必ずしも同一人物ではないし、プログラマとコーダーが別の人間であるという可能性も無きにしもあらず。
そういう時に同時進行で作業を進めるためにも、MVCという概念で分離しておく必要があるのだそうで。ホワーーーンなるほどね!?と思いましたね。
確かに、プログラマが必ずHTML書けるわけでもないしコーダーがプログラム書けるわけでもないもんね。確かに私もそうだった。

MVCのメリット/デメリット

そしてここにくるわけです。
私がMVCという概念に揉まれてみて、ごった煮ファイルとの違いを見たときに「これは確かにええぞなもし!!」と思った点を箇条書きで恐らく将来面倒臭がる自分に宛てて。これは戒め。

メリット

  • ソースの可読性が高い
    • 言語混在が最低限なので見やすい。
    • ファイルを小分けにするので全体的に短くなる。(ただし増える)
  • 使いまわしが利く
    • メソッド化をめっちゃするので同じ処理を繰り返し書かなくていいし後から「この処理使えたやんけ!!メソッドにしとけばよかった!!」みたいなの大分少ない。
  • 修正が簡単
    • メソッド以下略なのでプログラム修正は一か所とかで済む。
    • 通化ファイルが多いのでやっぱり一か所で済む。
    • 小分けにしているが故にどこに何があるか分かりやすいので、いちいち探さなくていい。
  • 機能追加が簡単
    • そもそも最初から別立てしているので、新機能での影響範囲が狭い。

デメリット

  • ファイル数が増える
    • 同ファイル建ての1.5倍以上にはなりそう
  • 定義書無しに初心者が見ると迷子になる
  • ファンクション名を雑に付けると後から困る
    • 困った(経験談)(ここで問われるネーミングセンス)

結論

組む時に混乱してても見返した時とかに大分楽なので、今後はこれを順守して構成していきたいなと思いました。(作文かな?)
正味メソッドという方法が頭からすっぽ抜けててめちゃくちゃ適当に書いてしまってる部分が多々あったりするので、取り敢えず念頭に置きながらの改修に精を出していこうと思う。
半年前に書いたソースもう何書いてあるかも分からんし自分が何を思ってこんなこと書いてるのかさっぱり分からんけど、これ以上どうしていいのかも分かってないです正直言うて。

自分宛のメモ書き

<?php
//functionの書き方
function hoge($foo){
    //ここに処理
    return $return
}

function getRequest($key){
 if (isset($_REQUEST[$key])) {
  // リクエストパータを返す
  return $_REQUEST[$key];
 }
}


//Controller
session_start();

require_once(dirname(__FILE__) . "/parts/header.php");
require_once(dirname(__FILE__) . "/parts/footer.php");

$mode = '';
$mode = getRequest('mode');

getHeader();
switch ($mode){
  case 'case1':
  require_once('parts/pages/case1.php');
  break;
  case 'case2':
  require_once('parts/model/case2.php');
  require_once('parts/pages/case2.php');
  break;
  default:
    require_once('parts/pages/top.php');
    //専用JSをフッター前に挿入
    require_once("class/script.php");
  break;
}
getFooter();