前のブログで、Webにおける画面とプログラムの分離方法の、問題がある方法についてかきましたけど、それで、具体的にはどうなるのか?という話と、これによって、アジャイルっぽくやると(テストファーストとかユニットテストとか)、どうなるかのお話です。
なお、このあとに紹介予定のカオル姫方式でも、アジャイルっぽくできます。
で、まず、具体例。
ここでは、以下のサイトで、ボタンを押して、gamen1.php画面にいくとします。
<HTML> <HEAD><TITLE>てすとだぴょん</TITLE></HEAD> <BODY> <Form action="gamen1.php "method="post"> Name: <input type="text" name="username"><br> <input type="submit" name="submit" value="実行"> </form> |
(全角<>は、実際には半角です)
このファイルをtest.htmとします。
で、その場合、画面用PHPであるgamen1.phpと、同時に、gamen1_cnt.phpを作ります。
■■(1)gamen1.phpは、まずはじめに、こう書きます。
1.まず、HTMLファイルを作成します。
HTMLエディタでもOK.デザイナーさんが作るのかなあ
→で、ここで、プログラム的に文字が入るところに、$$$item1$$$とか、分かるマークを入れておいてもらうと、あとの作業が楽かもお。。
2.あたまに(HTMLタグの前でOK)、だまって、こうかきます。
<?php include("gamen1_cnt.php"); gamen1_cnt_init(); ?> |
(全角<>は、実際には半角です)
3.ファイル名が、XXXX.HTMだったら、gamen1.phpになおしておきましょう。
ここまでで、gamen1.phpの内容は、こうなります
<?php include("gamen1_cnt.php"); gamen1_cnt_init(); ?> <HTML> <BODY> 表 <table border=1> <tr><td>$$$list1['item1']$$$</td><td>$$$list1['item2']$$$</td></tr> </table> <Form action="gamen2.php "method="post"> Name: <input type="text" name="username" value=$$$name$$$><br> <input type="submit" name="submit" value="実行"> </BODY> </HTML> |
(全角<>は、実際には半角です)
なお、$$$list1[item1]$$$とかいてあるのは、List1の中に、複数レコードが入っていて、そのレコードのitem1を表示しろという意味です。ここは、複数レコードのところなので、繰り返しになります。
■■(2)gamen1_cnt.phpは、まずはじめに、こう書きます。
1.関数gamen1_cnt_initを宣言し、中身空でかきます。
<?php function gamen1_cnt_init() { } ?> |
(全角<>は、実際には半角です)
■■(3)この時点で、test.htmでボタンを押しても、gamen1.phpのHTMLが表示されるだけで、なにもおこりません(ね、テストファーストっぽいでしょ ^^)
■■(4)ここで、文字がはいるところに、print文をいれます。
gamen1.phpで、処理結果の文字が入るところ($$$item1$$$とか、マークをいれておいてもらっているところ)に、print文で、セッションの値がはいるようにします。
1項目、1つの値が入るところは、
print $_SESSION['name']
のように(例の場合は項目名nameの値)表示されるように書きます。
1項目に、複数レコードのところ(繰り返し)のところは
foreach($_SESSION['list1'] as $rec)と、繰り返しの範囲のところを書いて、
レコードのある項目の値を入れるところは
print $rec['item1']
のように、書きます($recに1レコード分入っているから)
結果として、gamen1.phpは、こんなかんじです(これで画面側はOK)
<?php include("gamen1_cnt.php"); gamen1_cnt_init(); ?> <HTML> <BODY> 表 <table border=1> <? foreach($_SESSION['list1'] as $rec){ ?> <tr><td><? print $rec['item1'] ?></td><td><? print $rec['item2'] ?></td></tr> <? }?> </table> <Form action="gamen2.php "method="post"> Name: <input type="text" name="username" value="<? print $_SESSION['name']?>"><br> <input type="submit" name="submit" value="実行"> </BODY> </HTML> |
(全角<>は、実際には半角です)
■■(5)この時点で、表示できるかどうかみてみます。
見ても、値ははいってこないはずです。まだかいてませんから。
■■(6)つぎに、ダミーの値をいれます。
gamen1_cnt.phpの関数gamen1_cnt_initで、セッションをスタートさせ、ダミーの値をいれておきます。これで、テストができるようにします。
レコードの場合は、$rec[カラム名]=値のように、1レコード分セットして、そのレコードを
$data[レコード番号]=$recというかんじで、レコードをセットし、最後に
$_session[項目名]=$data
の形で表全体をセットします。
こんなかんじです。
<?php function gamen1_cnt_init() { session_start(); // セッション開始 $_SESSION['name'] = "aaa"; $rec['item1'] = "1行目1項目目の値"; $rec['item2'] = "1行目2項目目の値"; $data[1] = $rec; $rec['item1'] = "2行目1項目目の値"; $rec['item2'] = "2行目2項目目の値"; $data[2] = $rec; $rec['item1'] = "3行目1項目目の値"; $rec['item2'] = "3行目2項目目の値"; $data[3] = $rec; $_SESSION['list1'] = $data; } ?> |
(全角<>は、実際には半角です)
■■(7)こうした状態で、test.htmからボタンをクリックすると、ダミーの値が表示されるはずです。
■■(8)あとは、コントロールの中gamen1_cnt_initの中を書けばいいことになります。
逆に、gamen1_cnt_initの中だけ出来ている場合などは、セッションの値をprintすることにより、gamen1_cnt_initの中が、正しく出来ているかどうか、確認できます。
なお、今回は、gamen1_cnt_initに渡す値がありませんでしたが、
■■ ※ test1.htm(呼び出し画面)からの値を渡したい場合
gamen1.phpの冒頭、gamen1_cnt_initを呼ぶ前に、session_startさせて、
foreach(@_POST as $key=>$val)
{
$_SESSION[$key]=$val;
}
(で、あってるかな?確認してないけど)みたいなかんじで、セッションに、画面の値を入れてしまってください。gamen1_cnt_initでは、そこから、値をとってきて、処理します。
なので、test1.htmとgamen1_cnt_initで、同じセッションに値をいれて、重なってしまってまずい場合は、テキトーに命名規約をつくって、重ならないようにしてください。
ということで、画面ができてなくても、こんなかんじで、ユニットテストできます
■■ ※画面をつかわずにユニットテストするには
gamen1_cntをインクルード
セッションをスタート
セッションに、呼び出し元でセットされるはずの値をセットする
gamen1_cnt_initを呼び出し
セッションの中身を全部表示
というPHPプログラムを作成する
っていうかんじで、画面とプログラム部分(コントロールとモデル部分)を分けて、画面だけを、ダミーの値を入れてテストしたり、プログラム部分だけを画面なしでテストしたりすることが可能になります。で、テストファーストっぽく徐々に、初めは何も怒らないところから作るので、
ね、アジャイルっぽいでしょ。
今回はPHPでやりましたけど、CGIでも、JSPでも、まったく同じ方式でできるはずだと思います。
でも、これだと、画面を複数切り替えられないので、つーか、もっと簡単に分離する方式を、気が向いたら、しめします(それがカオル姫方式。なぜカオル姫なのか(CMから取っている)は、その中で示される)