前のブログで、PHPで画面とプログラム部分を分けて書く方法(プログラム規約)を書きました。
で、今回は、その具体的例を示そうとおもったんだけど、
それって、前に書いたブログ、PHPで、別のPHPや画面を呼び出す、あるいはエラー画面と正常画面を切り分ける方法 と、基本的に同じなので、(あとはbunki_cnt.phpで、セッションに値をいれて、その値を画面で表示すればいいだけ)その例は、今回は省略します。
ホームページかなんかに、まとめたら、そのとき例を書くと思います。
で、今回は、このやり方(画面とプログラムを分けるけど、コントローラーがない。カオル姫方式)の問題点として、テストしにくかったり、解析しにくいことを、上記ブログの例から示します。
上記のブログで示した例について、まとめると、こんなかんじです
・ユーザー名を入れる画面を用意する(項目名:username)
・処理するプログラムのPHP(bunki_cnt.php)で処理を行い
(例にはその部分はありませんが)画面に表示する値を取得、セッションに入れて
その処理結果によって、headerのLocation指定で、次の画面を決める
ここでは、usernameがgoodmanなら次の画面(OK.htm)
そうでなかったら、エラー画面
・表示画面(例はhtmですけど、本来はPHP)では、そのセッションの中身を表示する。
■■ この方法の問題点。
では、処理部分(bunki_cnt.php)のテストをしましょう。といったときなのですが、結果として、OK.htm,NG.htmのどちらが表示されるので、この両方とも、用意しないといけません。
今回は処理が簡単ですし、画面も2つだからいいのですけど、これが、複数画面になってしまうと、全部の画面をあらかじめ用意して、で、その画面では、セッション内容を表示できるようにして。。。となったら、テスト負担が大きくなり、結局、全部できてから、流しで行うっていうことになってしまいます。
■■ この問題の改良法(なにもしないようでも、コントローラがいるわけ)
で、それを防ぐには、どうしたらいいか、つまり、画面を用意しなくても、テストドライバだけで、モジュールテストするには、どうしたらよいか?ということなのですが、これは、
必ず、コントローラーに戻して、コントローラーが、次画面を表示するようにすれば、問題は解決します。
つまり、上記の例をこのように修正します(太字の部分が修正箇所)
・ユーザー名を入れる画面を用意する(項目名:username)
・画面から、コントローラーを呼び出す
・コントローラーは、画面項目をセットし、処理するプログラムを呼び出す
・処理するプログラムのPHP(bunki_cnt.php)で処理を行い
(例にはその部分はありませんが)画面に表示する値を取得、セッションに入れて
その処理結果によって、セッションのnext_URLに表示したい画面のURLをセットする
ここでは、usernameがgoodmanなら次の画面(OK.htm)
そうでなかったら、エラー画面
そして、コントローラーを呼び出す
・コントローラーは、next_URLの値をもとに、headerのLocationで表示画面を呼び出す
・表示画面(例はhtmですけど、本来はPHP)では、そのセッションの中身を表示する。
というかんじで、コントローラーにかならず戻るようにすると、この処理部分のユニットテストを行うには、
・ユニットテスト用コントローラーを作成する。
そのコントローラーは、入力時のセッションの値をログなりどっかに出力
出力時のセッションの値をログなりどっかに出力しておしまい
(画面表示はしない。次の画面は、セッションの値を出力しているので、そのnext_URLの値をみて、ただしくセットされているかどうか判断する)
・テストドライバとして、引数をセットして、そのユニットテスト用コントローラーを呼び出して、単体テストする。
・実際の時には、本番用コントローラーにきりかえる。そうすると、next_URLの値をもとに、表示画面へ遷移する。
みたいなかんじで行えます。
で、この例にかぎらず、というか、PHPの話に限らず、コントローラーっていうのは、なーんにもしてないことも多いんですけど、必ずそこをとおる!というところがあると、便利だったりします。
で、気が向いたら、このコントローラーを使った、まさにPHPでMVCを実現する方法について、書きます。で、このコントローラーつきのものを、カオル姫-テンさん方式とよびます。
なぜ、テンがつくのかは、バレーづきの人にきいてください。
このまえのJTのテレビCMと、
「かならず、コントローラーにもどす」このコントローラーをセッターに言い換える。
といえば、延々と、説明してくれる。。はずです。
P.S バレーとは、バレーボールのことで、踊るほうではない。女子バレー好きの人に聞いてね。