ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

OSSがその分野にある以上、いままで書いたやり方は、認められない。訳知り顔の人に全否定されるから

2005-11-24 18:48:00 | Weblog

 いままで、いろいろと、PHPにおいて、画面と処理プログラムを分離し、MVCを実現するためのコーディング規約と、実際のユニットテスト方法に書いてきましたが、では、実際に、この規約で、開発することが認められるか?というと、たぶん、100%不可能です。

 理由は、PHPにおけるMVCのフレームワークが、各種テンプレートを使う形で、「オープンソフトとして」たくさんでてるから。。

 オープンソフトで出ている場合、
・そのオープンソフトを使わなくても、(今まで述べたように)できるとしても
・で、そっちのほうが(テンプレートのバージョンの問題がない分)、バージョン管理の問題がないとしても、
・オープンソースのプログラムの作り方を覚えなくてすむ分、開発が短期ですみ、
・さらに(strutsのチェックボックスは、先にクリアしておかないと。。みたいな)知らないと大変な目にあうTIPSを知らなくていいぶん、ずっとリスクが小さかったとしても、

 ぜったい、自分たちの創意工夫は否定され、「そーいう苦労をしなくていいように、オープンソフトがでてるんだから、オープンソフトをつかえ、このばか!」と、指示が来て、そのため、
・オープンソフトを使わないほうが、開発工数が少なくてすんでも、
・(そのOSSの)バージョンアップのときに互換性を考えないで作られて、
  あとで修正を入れなきゃならないかもしれないリスクをはらんでいても、
オープンソフトを、つかわさせられるわけよ(>_<!)。。

 いや、グループ会社や取引先の会社のツールやソフトをつかえ、っていうなら、大賛成だよ!

 それにより、取引先のうりあげあーっぷ!かんけいあーっぷ、で、間接的に、自分たちの収入安定につながってるわけだから。

 でも、オープンソフト使っても、売り上げ、あがらないでしょ。。

 え、自分たちの転職に有利だ!って。。

 一時的にはね。でも、この業界、ずーっと続いている言語もないし(COBOLはつぶしが利くとかむかしはいわれたんだよねー。あ、Cも、そんなこといわれたね。今はJAVAかい (^^) )ましてや、あるオープンソフトがずーっと使われるという保証もない。

 それどころか、ある日突然、正反対のことをいわれるのよねー。

 たとえば、Cの黎明期は、いかにメモリーをつかわないか、っていうことが、マニアック的にきそわれたりしていた(プログラム領域の制限があったから)。いま、Javaだったら、メモリーの制限。。。といっても、、メモリ確保の制御、できないっしょ(^^)

 ま、こんな理屈っぽい話をしなくても、一目瞭然だよね。

 いままで読んできてくれた人(なんて、いるのかなあ。。)だったら、あのやり方、PHPでなく
・画面部分をJSP
・プログラム部分をサーブレットで書けば、
strutsを使わずに、プログラム規約で、MVCに分けてかけることに、気づくはず。

 で、そうすれば、Strutsタグを覚えなくていいし、Strutsのバージョンの問題もないし、サーブレットのユニットテストもできるし。。といろいろいいことあって、そんなこと、システムやってる人なら、すぐに思いつくんだけど、じゃあ、Strutsじゃなくって、そーやって、コーディング規約を作ろう!っていう話は、でないわけよ。。

 「Strutsつかえ!」と訳知り顔の人間に全否定されちゃうよね。

 いや、そんな、「コーディング規約で簡単にできるよ!」といったら、「規約は守んない人間がいるから、だからオープンソフトなんだろー、そんなこというお前って、技術者としてどーなの!」
 とかいって、訳知り顔の人間に、自分の存在意義自体を全否定されかねない!
 だから、みーんな、そんなこと知ってても、思いついても、だーれもいわない。。
 これが現実なのよ。
(Strutsでも、MVC無視して、規約を守んない人が出てきたら、おなじじゃん。なんて、間違っても、いえない)

 で、今後も、(まあ、ずーっと前、ブログに書いたように、一部では、そういうことから、自分たちで作って、難易度を下げようていう機運も出ていることは確かだけど)オープンソフトなのよ。

 その結果、

・バージョンアップや相性のリスクが増えても、
・それを学習するために生産性が下がっても、
・その学習についてこれる人を用意しなくちゃならないから、単価上がっても、

いや、

・それを使うことによって、客に迷惑をかけてもね。

 だからさー、遅いといわれるCORBAでも。。。
(ここで、ある会社を連想できる言葉を書きそうになったので、この部分カット。
 べつに、ここはgooブログだから、いいんだけどね。。。gooの子会社に証券会社ないしー(^^;)




 もっとも、これが、権威のある人が、いったら話は違うんだけどね。

 たとえば、某業界有名人が、雑誌にこういう話をかけば、これは、こういう考えも検討される。

 そう、この業界、権威の発言は、まんせーなのだ。

 その権威の発言が、だれがみても、へん??

 っていう発言でも、権威が言えばOKなのだ。

 この実例について、ウィリアムのいたずらは、現在、ブログネタを準備中。

 覚えていたら書く。期待しないで、待っていてくれ。

 でも、うぃりあむのいたずらのような、「ぷーたろう」みたいなやつ(=フリーなので、会社に所属してないっていうことは、ぷーたろうと一緒)がいっても、だれも見向きもしないわけだ。

 これが、某大学教授、某上場企業の若手課長とかいったら、また違うんだろーけどね。

 そう、オープンソフトの話は、この権威と結びつき、否定できない方向にいっている。




 なわけで、じゃあ、今まで書いてきたことは、意味ないのか??っていうと、

 表面的には、まったくの無意味。

 これ、自分がぜーんぶ勝手にやっていいのであれば、そういうやり方を採用できるかもしれないけど、上記の理由により、ペアプログラミングなら、相手に否定されれば、どんなにいいやり方でも、そこで「終了」だし(本当にすごいやり方というのは、作る前には、他人に理解できない。出来上がってみて、使ってみて、すごさが分かる)
 グループでやるなら、訳知り顔の人に、「オープンソフトを採用すべき、お前の考えなんて、ききたかねーよ!、くだらねーことかんがえず、盲目的に、オープンソフトまんせーって言えばいいんだよ」で終わってしまう。

 しかし、実は、今までの話は、MVCの表面的な話でなく、奥義的な話になったとき、生きてくる。

 オープンソフトの使い方を覚えても(つまりStrutsの書き方を覚えても)その部分は、見えてこない。で、実は、そこを説明するために、わざわざ、この話を書いたんですねー。

 で、その奥義とは。。。

 書こうと思ったら、時間切れだ(>_<!)

 さ、いそいで、移動です!

 っていうことで、覚えていたら書きますね。ぜーんぜん期待してないで、待ってて。。


 くれなくていいけどおー(^^)v

 

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

コントローラーに、起動するプログラムの情報を持たせる方法

2005-11-24 15:29:59 | PHP

 きのうのブログで、PHPなどでMVCを行う方法について書きました。
 PHPなど、と書いたのは、実はこのやりかた、PHPじゃなくってもかまいません。
 画面表示部にあたるVIEWをJSPで書いて、処理部分をサーブレットやCGIでも、OKです。

 で、昨日までのやり方だと、コントローラーは、処理部分や、画面から指定されたURL先に、そのままジャンプしているだけです。言い換えると、コントローラー側では、次に起動するプログラムの情報はありません。
 このことは、いい場合もあります。たとえば、開発のはじめの時期において、どのような画面構成にするかどうかが決まっていない場合でも、部分的にでも決まっていれば、呼び出せることや、全体像について誰も知らなくても、このシステムなら、次の処理先さえ分かれば、問題なく処理できるからです。

 でも、逆に、コントローラーに、次に遷移する画面を、すべて登録しておいて、コントローラーさえ見れば、このシステムで、どのようなプログラムを使うのか、すべて把握したい場合もありえます。
 今回は、そのようなコントローラーで、すべての遷移プログラム情報を保持するケース(カオル姫-テンさん方式(集中)についてです。




 この場合、昨日の例では、nextURLに次に遷移するURLを書いていましたが、
 今回は、nextJobに、次にうつる仕事の指定(処理なのか、正常画面なのか、エラー画面なのか)を指定します。
 そして、コントロールを呼び出し、コントロールは、nextJobの値をみて、処理なり、各種画面なりに遷移するというものです。

以下、具体例で説明します。例の内容は、昨日のブログとおなじく、伝言板です。



■■ 具体例

● コントローラーのようす
 まずは、一番大きく変わる、コントローラーについて
<?
//==============================================//
//						//
//	コントローラー(nextJobで飛び先決定)	//
//						//
//==============================================//
	//	セッションをスタートさせる
	session_start();

	//	引数をセッションにいれる
	foreach($_POST as $key => $val)
	{
		$_SESSION[$key] = $val;
	}
	foreach($_GET as $key => $val)
	{
		$_SESSION[$key] = $val;
	}

	//	次のURL(VIEWまたはモデル)へ遷移

	if ( $_SESSION['debug_mode'] == "YES")
	{	//	デバッグモードのときには、デバッグ用画面
		$headwd = "Location:debug.php¥n¥n";
	}
	else
	{	//	それ以外のときは、次のURL画面
		switch($_SESSION['nextJob'])
		{
		case	"OK":
			$headwd = "Location:OK_shutyu.php¥n¥n";
			break;
		case	"SHORI":
			$headwd = "Location:shori_shutyu.php¥n¥n";
			break;
		default:
			$headwd = "Location:NG_shutyu.php¥n¥n";
			break;
		}
	}
	header($headwd);
?>

(上記の < > ¥ は実際には、半角のものを使ってください)
前のものと変わっているのは、次のURL指定、nextJobの値によって、遷移先を変えています。


●呼び出し側
 はじめに、フォームにユーザー名を入力し、コントローラーを呼び出すHTML画面は、こんな感じです。
<HTML>
<HEAD><TITLE>てすとだぴょん</TITLE></HEAD>
<BODY>
<Form action="ctl_shutyu.php "method="post">
    <input type="hidden" name="nextJob" value="SHORI">
    Name:  <input type="text" name="username"><br>
<input type="submit" name="submit" value="実行">
</form> 

(上記の < > ¥ は実際には、半角のものを使ってください)

前のnextURLのかわりに、nextJobで、次の画面を指定してます。
あと、actionの呼び先が変わってますが、これは、たまたま呼び先を変えたから、こうなっただけです。他には、基本的に変わってません。

●処理(モデル部分)について
 処理についても、同様で、違いはnextURLがnextJobになったこと、飛び先が変わったことだけです。
 こんなかんじ。
<?
//==============================================//
//						//
//	伝言設定処理部分			//
//						//
//==============================================//

  	//	セッション開始
	session_start();

	//	データセット
	//	本当は、DB検索とかをする
	$rec['simei'] = "社長";
	$rec['naiyo'] = "健康に注意して馬車馬のように働け";
	$data[1] = $rec;

	$rec['simei'] = "部長";
	$rec['naiyo'] = "オレの給料を上げるため、お前らは死ぬほど働け";
	$data[2] = $rec;

	$rec['simei'] = "係長";
	$rec['naiyo'] = "あのー、できないことを要求されても、できません";
	$data[3] = $rec;

	$_SESSION['dengon'] = $data;

	//	次のURLを設定
	if ( $_SESSION['username'] == "課長" )
	{
		$_SESSION['nextJob'] ="OK";
	}
	else
	{
		$_SESSION['nextJob'] ="NG";
	}

	//	コントローラーに戻す
	header("Location:ctl_shutyu.php¥n¥n");
?>

(上記の < > ¥ は実際には、半角のものを使ってください)

●画面(VIEW)について
 今回変わったところは、nextURLがnextJobにかわったことと、処理先です。
 よって、これらを使わない、表示だけの画面(正常画面OK.php)は、変更はありません。
 入出力を行うエラー画面のみ、nextJobの指定方法と処理先が変わります。
 こんなかんじ

<?
//==============================================//
//						//
//	NG画面(もう一度再入力)		//
//						//
//==============================================//
	session_start();
?>
<HTML>
<BODY>

<h1><font color="red">入力した名前は間違えています</font></h1>

<Form action="ctl_shutyu.php "method="post">
    <input type="hidden" name="nextJob" value="SHORI">
    Name:  <input type="text" name="username" value="<? print $_SESSION['username']?>"><br>

<input type="submit" name="submit" value="実行">
</BODY>
</HTML>

(上記の < > ¥ は実際には、半角のものを使ってください)




 ということで、これで、一通りの画面とプログラムの分離方法について、ご披露いたしましたが、

 じゃあ、これを使おうか?となると、実際は。。。

 というお話を、覚えていたら、気が向いたときにします。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

中国って10万のケータイあるんだって!W-ZERO3の2倍っすかあ(@_@!)

2005-11-24 09:54:34 | Weblog

 今日、「朝は楽しくで」、中国のカード型ケータイ(NEC製)を紹介していて、その値段がなななんと、10万円!!っていうのをやってました。

 ありえねー。ケータイが10万なんて(@_@)

 パソコンが買えます。

 この前、たしか、テレビ東京の11時ごろのニュースでW-ZERO3は5万円くらいで出るっていうことなので(通話料はもちろん別で、毎月かかります)、まあ、PHSなんですけどパソコン(PDA?)つきの電話? の2倍です。

 ありえません。

 日本では売ってないそうです。そうでしょー

 でも、中国では、売れてるそうです。

 それも、ありえねー。どーしてケータイに10万もかけて、買うんだ??




 ただ、W-ZERO3は、いいですよねー。
 まあ、だいたいやりたいことは、ひととおりできそうだし。。

 でも、5万。。。ウィリアムのいたずらにとっては、たかい。

 まあ、そのうち、待ってると、やすくなるかもしれないので、
 出始めても(いつでるかわかんないけど)すぐには買わないで、やすくなるまで待つことにしよう(なんなかったりして >_<!)

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPで、MVCにわけ、処理、画面別々に、ユニットテストを行う例と、方法

2005-11-23 20:03:40 | PHP

 前のブログ PHP等でMVCにわけて、アジャイルっぽく開発できるようにするためのコーディング方略と例 で、カオル姫-テンさん方式(分散)、つまり、
 ・コントローラーをいれて
 ・画面部分と処理部分をわけ
 ・画面部分は、セッションの中身を表示するだけ
 ・処理部分は、画面表示内容をセッションに設定して、コントローラー呼び出し
の方法を示しました。

 で、今回は、その方法で、画面だけ、あるいは処理部分のPHPプログラムだけをテストする、ユニットテストの方法をしめします。




■■ 方略
 どうやって、ユニットテストをやるかということについて、画面(VIEW)と処理部分(モデル)とにわけて説明します。

●画面の場合
 ドライバ側で、セッションに、表示する値を設定して、
 headerで、画面のPHPを呼び出します。
  →セッションに設定した値が表示されるはずです。

●処理部分の場合
 ドライバ側で、セッションに、処理に必要な値を設定して、
 セッションのdebug_modeに"YES"を設定して、
 headerで、その処理PHPを呼び出します。
 →かならず、コントローラーにもどることになります。
  で、コントローラーでは、debug_modeがYESの場合は、nextURLの値にかかわらず
  debug.phpを呼び出しますので
 debug.phpで、セッションの中身を表示すれば、OKです。

ということで、ドライバとdebug.phpを作成し、ドライバから、値をセッションに設定、debug_modeをYESにして、画面なり、処理するPHPを呼び出せば、デバッグできそうです。




■■具体例

 では、今回は、処理プログラムshori.phpをテストしてみます。
 処理のテストの場合は、ドライバとdebug.phpを用意すればOKです。

●ドライバ側

 以下のようなドライバ側のPHPを作成します。
<?
//==============================================//
//						//
//	テストドライバ				//
//						//
//==============================================//

	//	セッション開始
	session_start();

	//	値設定
	$_SESSION['username']	=	"課長";
	$_SESSION['nextURL']	=	"shori.php";

			//	デバッグモードで
	$_SESSION['debug_mode']	=	"YES";

	//	機能呼び出し
	header("Location:shori.php¥n¥n");

?>

(上記の < > ¥ は実際には半角です)

 セッションをスタートし、データをセット、デバッグモードをYESにして、処理プログラムを呼び出します(コントローラーではありません。処理プログラムshori.phpを呼び出してくださいね)

● デバッグ表示用(debug.php)

 以下のようなデバッグ表示用のPHPを作成します。
<?

//////////////////////////////////////////////////////////
//	ここで使う関数					//
//////////////////////////////////////////////////////////

	//==============================================================//
	//	関数:print_dispdata					//
	//	内容:表示します					//
	//	引数	$data	表示するもの				//
	//		$mae	表示時、行の前の文字(スペース)	//
	//==============================================================//
	function print_dispdata($data,$mae)
	{
		foreach($data as $key => $val)
		{
			if ( is_array($val)	==	true)
			{
				print $key . "は、配列<BR>";
				print_dispdata($val,$mae . " ");
			}
			else
			{
				print $mae . $key . ":" . $val . "<BR>";
			}
		}
	} 
?>

<?
//////////////////////////////////////////////////////////
//	プログラム開始					//
//////////////////////////////////////////////////////////
	session_start();

?>

<html>
<head><title>テスト結果</title><head>
<body>

<h3>テスト結果</H3>
<? 
	print_dispdata($_SESSION,"");
?>

</body>
</HTML>

(上記の < > ¥ は実際には半角です)

 表になっているところは、配列なので、配列の場合は、キーと中身を再帰的に表示するようにしています。

 あとは、前のブログ で作成したファイル(コントローラーctl.phpとshori.phpが必要)を用意しておきます。

 そして、ドライバ用として作成したファイルを開いてください(http://127.0.0.1/ドライバ用ファイル.php のように、httpプロトコルのURLを入れて呼び出してね。C:¥program files¥なんとかかんとかみたいなかんじのファイル形式で呼び出さないでね!!ファイルをIEにドロップしても、ファイル形式になってしまうので、プログラムが見えるだけだよ!!)。

こんなかんじで、処理結果が見えます

テスト結果

username:課長 nextURL:OK.php debug_mode:YES dengonは、配列 1は、配列   simei:社長   naiyo:健康に注意して馬車馬のように働け 2は、配列   simei:部長   naiyo:オレの給料を上げるため、お前らは死ぬほど働け 3は、配列   simei:係長   naiyo:あのー、できないことを要求されても、できません





 で、実際には、ユニットテストだけでなく、ある程度処理をまとめて、結合してテストしたいわけです。その場合、画面表示までやるのであれば、デバッグモードをYESにしないで、テストすればいいし、いくつかの処理をさせたあとで、表示させたければ、コントローラー(ctl.php)の

if ( $_SESSION['debug_mode'] == "YES")

のところを、

if ( $_SESSION['nextURL'] == とめたいURL)

 のようなかんじで、nextURLに、とめたいURLの値がセットされていたら、debug.phpを表示するように書き換えればOKです。そこまでの処理結果がdebug.phpで表示されます。




 ということで、テスト方法についても書いたので、
 つぎは、コントローラーで集中管理する方法(カオル姫-テンさん方式(集中))です。
(覚えていて、気が向いたら)



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP等でMVCにわけて、アジャイルっぽく開発できるようにするためのコーディング方略と例

2005-11-23 13:37:03 | PHP

 PHPで、画面と処理部分に分けるお話で、ちゃんとコントローラーをいれることにより、ユニットテストもできるようにするためのコーディング規約、
 つまり、カオル姫-テンさん方式について、ここにご披露いたします。

 今回は、カオル姫-テンさん方式の分散のほう、つまり、コントローラーは、汎用的で何にでも使えるが、コントローラーをみても、次の画面については、なにもわからない(次の画面指定は、VIEWやモデルで指定する)について、具体例を示して、説明します。
 なお、今回は、テスト部分は、説明しません。ユニットテストの方法は、次回以降、気が向いたときにします。
 で、この方法は、ちょっとひねると、CGIでも、なんにでも使えるはずっす。




■■ 方法の概略
 この方法の概略は、こんなかんじ
・はじめのフォーム入力画面で、
  FormのAction先をコントローラーに指定します
  input type="hidden" name="nextURL"で、valueに、処理を行う(モデルとなる)
  URLを指定します。

・コントローラーは、
  セッションをスタートし、
  フォームの値等、$_POST,$_GETに入っている値をセッションに入れて
  セッションのnextURLで指定されたURLへ、遷移する
   →nextURLには、次の処理先や、遷移したい画面(VIEW)が入ってる

・処理プログラム(モデル部分)は
  セッションの値をもとに、DBアクセスなどをして、
  次の処理や表示する画面をきめて、セッションのnextURLに、URLをセット
  次の処理で使う値や、画面に表示する値をセッションに入れて
  headerのLocationにコントローラーのURLをセットし、
   コントローラーに戻る。
   →コントローラーに戻った後は上記のコントローラーの処理で
    nextURLに指定した画面または、次の処理へ遷移する

・画面では、セッションをスタートし
  動的部分に関しては、セッションの値をもとに、表示する
  なので、基本的に、foreachと、printくらいしかない。

という感じになります。




■■ 具体例
 では、以下に具体例をしめします。
 今回は、こんな伝言板を考えます。

 1.画面から、ユーザー名をいれます。
 2.ユーザー名が課長でなければエラー画面(再入力)
   課長なら、伝言をセットします
 3.エラー画面は、ユーザー名が再入力できて、2へ行きます
   正常画面は、伝言を表示します。

 では、以下、ソースを示します。




●はじめの、ユーザー名入力画面
ユーザー名入力画面は、こんなかんじ。
<HTML>
<HEAD><TITLE>てすとだぴょん</TITLE></HEAD>
<BODY>
<Form action="ctl.php "method="post">
    <input type="hidden" name="nextURL" value="shori.php">
    Name:  <input type="text" name="username"><br>
<input type="submit" name="submit" value="実行">
</form> 

(上記の< > は、実際には、半角です)

FORMのactionに、コントローラー(ctl.php)を指定し、
inputのhiddenで、nextURLに、処理プログラム(shori.php)を指定しています。

●コントローラー
 コントローラーは、今回のプログラムにかかわらず、どれも同じです。
<?
//==============================================//
//						//
//	コントローラー(どんなときでも共通)	//
//						//
//==============================================//
	//	セッションをスタートさせる
	session_start();

	//	引数をセッションにいれる
	foreach($_POST as $key => $val)
	{
		$_SESSION[$key] = $val;
	}
	foreach($_GET as $key => $val)
	{
		$_SESSION[$key] = $val;
	}

	//	次のURL(VIEWまたはモデル)へ遷移
	if ( $_SESSION['debug_mode'] == "YES")
	{	//	デバッグモードのときには、デバッグ用画面
		$headwd = "Location:debug.php¥n¥n";
	}
	else
	{	//	それ以外のときは、次のURL画面
		$headwd = "Location:" . $_SESSION['nextURL'] . "¥n¥n";
	}
	header($headwd);

?>

(上記の< > ¥ は、実際には、半角です)

 セッションを開始し、$_POST,$_GETの値(フォームの値)を、$_SESSIONにいれ、nextURLで指定されたURLに遷移します。なお、デバッグモードに関しては、次回以降で説明します。

●処理プログラム(モデル)
 モデル部分は、こんなかんじです
<?
//==============================================//
//						//
//	伝言設定処理部分			//
//						//
//==============================================//

  	//	セッション開始
	session_start();

	//	データセット
	//	本当は、DB検索とかをする
	$rec['simei'] = "社長";
	$rec['naiyo'] = "健康に注意して馬車馬のように働け";
	$data[1] = $rec;

	$rec['simei'] = "部長";
	$rec['naiyo'] = "オレの給料を上げるため、お前らは死ぬほど働け";
	$data[2] = $rec;

	$rec['simei'] = "係長";
	$rec['naiyo'] = "あのー、できないことを要求されても、できません";
	$data[3] = $rec;

	$_SESSION['dengon'] = $data;

	//	次のURLを設定
	if ( $_SESSION['username'] == "課長" )
	{
		$_SESSION['nextURL'] ="OK.php";
	}
	else
	{
		$_SESSION['nextURL'] ="NG.php";
	}

	//	コントローラーに戻す
	header("Location:ctl.php¥n¥n");
?>

(上記の< > ¥ は、実際には、半角です)
セッションをスタートし、表示する値などを取得、セッションに設定して(本当はDBからとってきたりするんですけど、ここでは、固定値を入れます)値によって、次の処理や画面を決定して、nextURLに設定し、コントローラーに遷移します。

●画面表示部分(VIEW)

まず、エラー(NG)画面は、こんなかんじです
<?
//==============================================//
//						//
//	NG画面(もう一度再入力)		//
//						//
//==============================================//
	session_start();
?>
<HTML>
<BODY>

<h1><font color="red">入力した名前は間違えています</font></h1>

<Form action="ctl.php "method="post">
    <input type="hidden" name="nextURL" value="shori.php">
    Name:  <input type="text" name="username" value="<? print $_SESSION['username']?>"><br>

<input type="submit" name="submit" value="実行">
</BODY>
</HTML>

(上記の< > ¥ は、実際には、半角です)

 画面表示なので、セッションをスタートさせ、printで値をセッションから取り出し、表示しています。同時にこの画面は(再)入力画面なので、はじめに取り上げた入力画面同様、FORMのactionをコントローラーにして、処理先(shori.php)を、input のtype=hidden name=nextURLで設定しています。

 正常(OK)画面は、こんなかんじです。
<?
//==============================================//
//						//
//	OK画面(伝言表示)			//
//						//
//==============================================//
	session_start();
?>

<HTML>
<BODY>

<? print $_SESSION['username']?>さんへ<p>

今日の伝言<p>
<table border=1>
<? foreach($_SESSION['dengon'] as $rec){ ?>
<tr><td><? print $rec['simei'] ?></td><td><? print $rec['naiyo'] ?></td></tr>
<? }?>
</table>
</BODY>
</HTML>

(上記の< > ¥ は、実際には、半角です)
 
 セッションをスタートし、セッションの内容をprintで表示しています。




 ということで、ここまででも、結構長くなってしまったので、プログラム規約のまとめや、テスト方法に関しては、記事を改めて書きます。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

画面とプログラムを分けても、コントローラーがないと、テスト&解析しにくい

2005-11-22 21:23:57 | PHP

 前のブログで、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 バレーとは、バレーボールのことで、踊るほうではない。女子バレー好きの人に聞いてね。

 

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP等で画面とプログラムを分離する(処理結果で画面分け:カオル姫方式)

2005-11-22 17:35:04 | PHP

 実際に、画面とプログラムを分離する際、プログラムの処理結果によって、画面を分けたい場合、

・コーディング規約だけで、特段のことを使わず
・さらに、アジャイルっぽく、テストファーストやモジュールテスト可能で
・もちろん、分業可能なようにするには?

どういう規約にすればいいかについて、書きます。

(なお、「カオル姫」で、このページに来ちゃった人、このページには、カオル姫のCM情報しかないです。>_<! ごめんなさい。CM情報は、このページで、1箇所だけ、リンクになっているところ)。

 この方法、3通りあります。
 1つは、コントローラーを使わないもの
 2つめは、コントローラーを使い、
   コントローラーが次に処理するプログラムや、画面を決める方式
 3つめは、コントローラーを使うものの、
   次に処理するプログラムや、画面はコントローラーが決めるのでなく、
   コントローラーを呼び出す側がきめるもの

 についてです。
 なぜ、3番が必要かは、3番について書くことがあったら、そのとき、覚えていて、気が向いたら書くことでしょう。

 なお、ここでは、以下、省略して
  1番の方法を、カオル姫方式
  2番の方法を、カオル姫-テンさん方式(集中)
  3番の方法を、カオル姫-テンさん方式(分散)と書きます。
 なんで、こんな名前にしたかは、あとで、書きます(このブログの中に書かれることでしょう)。

 今日は、カオル姫方式のご披露です。




 PHPで、プログラムと画面を分ける事は、意味があります。

 それは、デザイナー部分と、プログラマーの作成部分を分けるということもあるし、画面が来る前に、プログラム部分をテストしたり、プログラム部分ができてないとき、画面部分を先にテストできるからです。

 さらに、業務上の要請からもあります。

 業務において、こんなケースが考えられます。
  支払いが
   ・銀行振り込みのときは、何も処理しない
   ・カードのときは、与信チェック
     エラーのときは、エラー画面表示
  その後、なんかいろいろ処理して
  正常のときは、同じ「正常処理」画面をだしてね!

 といったように、エラー画面が出るか、正常画面が出るか分からない(与信チェックしないとわかんない)、かつ、場合によって、処理内容が違う。そして、1つ1つの処理は長い。でも、最終的には同じ画面を出すといったかんじ。

 こういう、処理結果によって画面が変わるとか、ある値によって、処理が違うといったときも、
   1画面1PHPプログラム、
   1処理1PHPプログラム
 にして、分離したいわけです(そーしないと、ものすごい量のプログラムになる)。

 で、どうするか。。。




そのとき、こういうコーディング規約にします。

■■ 画面側(VIEW)
・デザイン部分をあらかじめ作成しておきます。そして、動的に値が変わるところは、なにか、マークを入れておきます。
・はじめに、sessionをスタートさせます。
・セッションの中に、入っている値を表示します。
   項目名1つに、1つの値が入っているときはそのままprint、
   項目名が、複数レコードで、1レコードにいくつかの項目がある場合は、
   foreach(@_SESSION[項目名] as $rec) で1レコードぷん取り出すのを繰り返させ、
     その繰り返しの中で、 print $rec[カラム名] で値を表示する。
・デザイン時、動的に値が変わるところに、マークを入れてもらい、
 上記の書き換えを行う。

■■ 処理側(プログラム部分)
・Viewがクリックされた場合、処理用のPHPプログラムを呼び出す
・そのプログラムでは、画面表示するとき、動的に値が変わるところは、セッションの中に入る
・最後に、さらに処理が続く場合は、headerのロケーション指定で、次の処理を、
  VIEWで表示したい場合は、headerのロケーション指定で、VIEWのPHPを呼び出す

という形になります。




 つまり、イメージ的にいうと、

・プログラムの処理部分と、VIEW部分を、完全にPHPプログラムをわけてしまい、
・クリックしたときには、プログラムの処理部分を呼び出す。
・で、処理中に、表示したい値をセッションに入れて
・最後に適切な(画面表示したい)VIEWをheaderのLocationで呼び出す
・呼び出されたVIEWは、セッションの値を表示する

といったかんじ。




 この例を、先ほどの「業務において、こんなケースが考えられます」と挙げた例で書くと、

・画面入力後、「銀行振り込み・カード振り分け」PHPをForm のActionから呼び出す。

・銀行振り込み・カード振り分けPHPは、
   銀行振り込みのとき、「なんかいろいろ処理して」PHPを呼び出す
   カードのとき、カード処理PHPを呼び出す
 呼び出し方は、この前のブログに書いた、hederのLocationで

・カード処理PHPは、処理をして
   エラーだったら、表示に必要なものをセッションにセットして、
      エラー画面(VIEW)を呼び出す
   OKだったら、「なんかいろいろ処理して」PHPを呼び出す
 呼び出し方は、この前のブログに書いた、hederのLocationで

・「なんかいろいろ処理して」PHPは、いろいろ処理して、セッションに表示内容をセット
 最後に、「正常画面」PHP(VIEW)を呼び出す
 呼び出し方は、この前のブログに書いた、hederのLocationで

・呼び出された「正常画面」PHPや「エラー画面」PHPは、セッションから値を取得して
 それを表示する。

てなかんじになる。




 で、今CMで、これを見える化??したものがテレビのCMで、流れている。

 JTのCMで、バレーボールのやつ(ここ

 このCMで、バレーボールがセッションだと思ってください。

 このボールをカオル姫(菅山かおる選手、一番左上)が受け取って、次々に選手、さらに、工場や、運送のおにーさん、タバコ屋のおじさんがつないでいき、最後に、アタッカーがボールを打ちますよね。

 ここで、アタッカーは、境界、バウンダリになるので、Viewつーか、画面になります。
 その間の人は、ポールをつなぐ(セッションに値を入れる)という処理をしていますよね。
 このボールをつないでいる、それぞれの人が、PHPプログラム。

 つまり、セッションをつうじて、アタッカー(VIEWプログラム)へ、いろいろの人が処理(PHPプログラム)してる。

 で、JTの選手は、竹下さん(一番上4番目の写真)とカオル姫だけでなく、もっといろいろいるけど、ボールがきたのは、たまたま、この2人、つまり、セッションの中に入っている値によって、処理するPHPプログラムが選ばれる。

 で、カオル姫は、竹下さんは知ってるけど、まさか、タバコやのおじさんは知らない。

 つまり、PHPの処理プログラムは、状況によって、次に誰を呼び出すか(複数候補有)は知っていて、ボールによって=セッションの値によって、呼び出す先を決めて、呼び出す(headerのLocationで)てなかんじなわけです。




 ということで、この方式を、このCMからとって、カオル姫方式と、勝手にウィリアムのいたずらが命名しました(一番初めにボールを受けるのが、カオル姫なので)。

 で、次の話は、この具体例を示したり、カオル姫-テンさん方式についてご披露するのですが、それについては、気が向いたときに、またかきます。
 もう時間切れ!なのだ。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPで、別のPHPや画面を呼び出す、あるいはエラー画面と正常画面を切り分ける方法

2005-11-22 14:07:20 | JavaとWeb

 きのうのカオル姫方式を披露する前に、その前段階である、headerにLocation指定をすることにより、別画面を呼び出したり、表示画面を切り分けたりする方法について、書いておきます。




■■ 問題

 いま、入力されたら、チェックして、正常なとき、正常画面、エラーのとき、エラー画面を表示したいとします。

 つまり、こういった入力画面があって

<HTML>
<HEAD><TITLE>てすとだぴょん</TITLE></HEAD>
<BODY>
<Form action="bunki_cnt.php "method="post">
    Name:  <input type="text" name="username"><br>
<input type="submit" name="submit" value="実行">
</form> 

(なお、プログラム中、全角の < >は、本当は、すべて半角です)

こんなかんじで、ユーザー名だけ入れます(項目名:username)

で、そのとき
●ユーザー名がgoodmanだったら、こんなかんじで、入っていい画面をだします。
<HTML>
<HEAD><TITLE>あなたは、いい人ですね</TITLE></HEAD>
<BODY>
<H1>入っていいです</H1>
</BODY>
</HTML>

(なお、プログラム中、全角の < >は、本当は、すべて半角です)
この画面をOK.htmとします。

●ユーザー名がgoodman以外だったら、こんな感じで、NG画面を出します。
<HTML>
<HEAD><TITLE>あなたは、わるい人ですね</TITLE></HEAD>
<BODY>
<H1><Font color="red">はいっちゃだめ</font></H1>
</BODY>
</HTML>

(なお、プログラム中、全角の < >は、本当は、すべて半角です)
この画面をNG.htmとします。

 つまり、usernameの値を見て、goodmanのときOK.htmを、それ以外のときNG.htmを
表示する、PHPプログラムを書くということです。
 このプログラムを、bunki_cnt.phpとします。




■■ 方法
$_POST['username']の値をチェックし、header("Location:URL名改行改行");で飛ばすことになります。
つまり、プログラム(bunki_cnt.php)は、こんなかんじ

<HTML><BODY>
<?php

	if( $_POST['username'] == "goodman" )
	{
		header("Location:OK.htm¥n¥n");
	}
	else
	{
		header("Location:NG.htm¥n¥n");
	}
?>
</BODY></HTML>

(なお、プログラム中、全角の < > ¥は、本当は、すべて半角です)

そうすると、ユーザー名の値によってきりかわります。

 改行コードは2つ、URLの末尾に必要です。

 同じサーバーの中のファイルを見ているので、NG.htmのように、ファイル名しかかいていませんが、そこに http://www.yahoo.co.jp のようなURLを書いてもOKです。そのサイトを表示します。




■■ ここからいえること

 昨日の方法だと、画面を処理によって切り替えることはできませんでしたけど、今日のこのLocationをつかうと、

 画面入力
  ↓
 処理を行うPHPプログラム
   ・実際の処理を行う。
   ・セッションに画面表示すべき値をいれる
   ・Locationで、次に表示する画面設定(場合によって、飛び先が変わる)
  ↓
 表示画面用PHP
   ・セッションから値を取り出し、画面表示(のみ)

 という感じで、複数のいろんな画面に飛ばせることも可能です。
 カオル姫方式の基本は、このやりかたです。
 ただし、この方法は、コントローラーがなくなってしまいます。
 したがって、これをちょっとひねって、コントローラーをいれることもしめします。

 コントローラーを入れる場合は、コントローラーで分岐先を管理する方法と、コントローラーでは管理しない方法があります。

 詳しくは、気の向いたときに。。。また。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP等で画面とプログラムの分離&アジャイルっぽく開発(テストファースト、ユニットテスト)の例

2005-11-21 20:58:06 | PHP

 前のブログで、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から取っている)は、その中で示される)


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Webにおける画面とプログラムの分離を単純に行い、わざと問題点をだしてみる。

2005-11-21 17:45:57 | PHP

 先ほどのブログにあった、Webプログラム(PHPなど)における画面とプログラムの分離を、規約によって行う方法について、ものすごーい単純な規約を使って、わざと問題点をだしてみます。

 この程度なら、たぶんテンプレートを使ったほうがよいと思われるでしょう。

 実際は、このやり方とは、違うやり方をします(それは、次回以降のブログで説明する)。

 ただし、このやり方を説明しておかないと
・あまりに唐突なやり方になってしまう。
・今回説明する方法でいいのでは?という意見が出る
ために、前もって説明しておいてしまいます。




 単純に、PHPとか(まあ、CGIでもJSPでもいいんだけど)で、画面と、プログラム部分を分離しようとすると、つまり、MVCモデルを実現しようとすると、こんなことでできます。

(1)画面部分は、
・コントロール部分のソースをインクルードする
・そこで、コントロールのモジュールを呼び出す
・(画面表示の値は、コントロール側でどこかにセットしておき)
  画面表示では、表示するだけにする。

(2)コントロール側では
・呼び出されるモジュールをつくり、そこで、モデルを呼び出す
・表示する値が求まったら、画面表示の値をどこかにセットする。




 今回は、画面表示の値を入れておくところを、セッションとしましょう
(セッション以外でもぜんぜんかまわないんだけど、次回以降の話のために、セッションに入れる)

そうすると、規約としては、

(1)画面表示側
・プログラム名はXXXX.PHP
・はじめに、コントロールのインクルードをして、次の行で、XXXX_cnt_init()を呼び出す。
・値を表示するためのプログラムしか、書いては、いかん。
 クリックされたら、ある処理を動かしたい場合、動かす処理を、XXXX_shoriYY(ひきすう)YYは数字という関数を呼び出すようにして、その関数は、コントロールファイルの中に書くようにする。

 値表示は、
  文字、数字のように、1項目に1つの値のときは、print $_SESSION['項目名']で
  表のように、1項目につき、複数行あり、その行が、複数のカラムを持つ場合は、
  foreach($_SESSION['項目名'] as $rec)で、1行分を$recの中にいれ
   各行につき、 print $rec['カラム名']で表示する
  リストのように、1項目につき、複数の値あるときは、表で、複数行、1カラムしかないものとして処理する。

(2)コントロール側は、
・プログラム名はXXXX_cnt.PHP
・XXXX_cnt_init()という関数を作成し、その関数の中で、セッションをスタートし、セッションの中に、表示させたい値を入れる。値の設定の仕方は、上記のとおり。
・もし、それ以外に、画面のほうで、関数を呼び出したいときには、ここにその関数を書く




ひえー、時間がなくなっちゃったんで、具体的例は、またこんど。

で、これの問題点。

いろいろあるけど、時間ないので、致命的なのを1個だけ。
エラー画面を表示したいときなどに別画面に遷移させにくい(させると、プログラム複雑になる)

この問題を解決した方法を、今度、書こうと思っています。

なずけて、カオル姫方式。

時間がないので、このへんで。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Webシステムのほうが、画面部分と、プログラム部分を分けたいはず。人件費の理由で。

2005-11-21 15:14:37 | PHP

 Javaだと、MVCとかで、画面のView部分と、プログラミング部分の(主に)Model部分を分けるという考えが浸透していると思う。
 PHPでも、HTMLテンプレートとか、Smartyとか、PEARのテンプレート機能を使うとかで、画面とプログラム部分を分離できるみたいですよね(こんなことしなくても、ちょっとしたコーディング規約を使うだけで、もっと柔軟に、分けることができると思う。それについて、今実験中)。

 で、ここで、いいたいのは、何で、画面とプログラム部分を分けるかという話。

 そうすると、MVCモデルがなんとかかんとか。。。っていう話になっちゃうけど、もっと、重大な話がある。

 デザイナーの単価と、プログラマーの単価が違うのだ。

 今日は、その話。

 で、その観点から考えると、できるだけ、簡単に画面と分離したい(つまり、デザイナーさんが、ちょっとしたマーカーをいれて、自動的とまではいかなくても、テンプレートにできるようなかんじ)けど、それについて、PHPだと、こういう規約を決めればいいじゃん!っていうのは、今、実験中なので、今度、実験がすんで、気が向いたら披露します。

 実は、「PHPだと」と書いたのは、はじめ、ウィリアムのいたずらは、この規約をJSP用に考えていた。しかし、JSPだけでなく、PHPでも、なんでも基本方針的には、応用できるじゃん!(そーいう点で、PHPを利用する立場とはちがう。この考え方さえ守れば、新しい言語がでてきても、応用できるという点で)つーものなんですけどね。でも、今日はその話じゃなくって、その前提の、なんで、こんな話をするのかということ。




 Web系において、デザイン部分と、プログラム部分を分けたいって言うのは、結構現実的な大きな理由として、デザイナーの単価と、プログラマーの単価の違いっていうのがあるんじゃないかな?って思うんですよ。

 デザイナーの単価は、「はっきり言って安い!」。

 1画面1万円くらいでも、やってくれるんじゃないかにゃー。
 (もっと、安いかな・・)

 そのうえ、この分野には、新規参入者が多い。
 ちょっとデザインのお勉強をして、起業しちゃう人なんかもいる。

 そのため、単価がどんどん安くなっている。




 一方、プログラマは、いくら、フリーには安い人がいるといっても、1日稼動して、数万円っていうのは、当たり前の世界なのよ。

 さらにだ、ちょっと大きくなると、マネージャーなんつーのも出てくる。
 マネージャーは、プログラムもホームページも作らないけど、しっかりお金を取っていくわけだ。

 で、じゃあ、実際にどれくらいになるか。。。というと、マネージャーが動くと、マネージャーは、たいてい正社員なので、年収400万円以上になっちゃうのよ。そーすると、月40万でしょ。
会社は上乗せするから(会社分の社会保険もはらうし、その他もろもろお金かかるし)結局月60万くらい。

 ところが、ECサイトなんかだと、中小企業の場合、2ヶ月で、100万くらいで作りたい!っていう場合もあるのよ。マネージャーさんにお金をだして、おわっちゃう(>_<!)

 マネージャーが2つも3つも掛け持ちすればいいじゃん!と考えるかもしれないけど、デザイン事務所のマネージャーならともかく、開発会社で、3つの案件を同時に掛け持つって、大変なのよ。
 マネージャーって、会議に出て、結構時間つぶれちゃうんで。

 なので、掛け持ちできる仕事が少なかったりする。

 プログラマーなら、もっと安いけど、デザイナーほどではない。

 とにかく、中小企業の感覚、100万でECサイト作って!とか言う場合、デザイナーにお金を払って、あと、データ入力をパンチャーにしてもらって、その他いろいろはらうと、この時点で、もう、お金たりないのよ。なので、プログラマーを動かしたくないわけ。

 それ以外のものでも、中小企業なんかが絡んできたり、小規模イベントの場合、プログラマーを動かすお金まで回らない。ましてやマネジャーつけて、大規模に開発することはできない。
(マネージャーつけるレベルになると、400万程度以上の案件になる。ソフトハウスが「部隊を動かして」請ける案件は、一般的にそれ以上のことが多い。それ以下のものは、プログラマだけでやったり、フリーにまわしたり、さらに零細ソフトハウスに紹介したり。。)




 ところが、デザイナーは安いのよ(それが社会的にいいことか悪いことかは別問題)。
 「アルバイトの」求人雑誌のなんかで、Webデザイナーの値段をみてね!

 なので、デザイン部分と、プログラム部分を分離し、プログラム部分をデザイナーがちょっと変形すればできる程度にしたい。。。と、いう感じだと思う。

 つまり、単価の立場から見て、デザイン部分(画面 Viewの部分)と、プログラム部分(モデル部分)を分けたいわけ。で、デザイン部分は、あるていど複雑/修正あってもかまわない(人件費安いから)けど、プログラム部分は、あんまり複雑にしないで、できれば、デザイナーさんがちょこちょこっといじって、プログラマ使わなくても終わり!にしたいわけ。

 つーので、フォームメールがウケたりするわけだ。あれなら、フォームメールCGI(共用サーバーでだいたい提供してくれる)を呼び出すだけだからねえ。。デザイナーでも対処可能。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の検索で困ることの例:浅田真央さんの公式ホームページのありか

2005-11-20 18:49:12 | Weblog

 最近話題の、浅田真央さん(わからない人へ、フィギアスケート選手)
 で、真央さんの公式ホームページを探そうとすると。。。
 うーん、最近の検索エンジンの問題が(>_<!)

 まず、正解から書こう。浅田真央さんの公式ホームページは(舞さんと一緒)、
 ここ 「Brilliance On Ice - Mao Asada and Mai Asada Official Site 」
 http://www.maomaiasada.com/indexjp.htm


 さあ、YAHOOで引くと。。。
 浅田真央 で引いても、はじめの10件に出てこない(>_<!)
 2ちゃんとか、Wikiとか。。

 浅田真央 公式だと、やっと最後にでてくる

 http://www.google.co.jp/で
 浅田真央をひくと、ニュースがいっぱい。公式ページには、(10件の結果では)いけず。。

 浅田真央 公式で引くと3番目ぐらいに、メインページでないけど、公式ページにひっかかる(YAHOOよりまし?)

 MSNだと。。。
 すげー! 「浅田真央」 一発で、1番上に、公式ホームページがあ!!

 Gooも、「浅田真央」だと、ブログとかがでていて、公式ページはでてこない
 「浅田真央 公式」だと5番目にgoogleで出ていた、公式ページにひっかかります。
 「浅田真央さんの公式ホームページは」で文章で検索させても、10件までの間に、公式ページはでてこない。

 MSN,おそるべし(@_@)

 つーか、最近、公式ページとか、探しにくくなったよね!
 こまったことに。。。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

サーバー側にDBを置くより、メールでデータ送って、それを社内で処理したほうが安全では?

2005-11-20 12:17:34 | JavaとWeb

 ワコールの件、トラックバックをつけていただいてありました。
 で、そのブログをみて、私も同感なのですが、
どんな攻撃で被害にあったのでしょうか?被害拡散防止のためにも侵入の手口の公開を行い、注意喚起を広く一般に行うべきだと考えます。
 たしかに。日経コンピューターあたりで、詳しく取り上げていただきたいものです。




 で、それとは、ちょっと違った話になるけど、いつも思っていることで、最近って、安易に、HTTPサーバー側に、DB置いちゃってません?

 それって、クラックされやすいし(結局社外においてあるんで)、HTTPサーバーがやられたら、おしまいになってしまう気がします(つまり、そのサーバーに入れなかったら、手が打てなくなる)。

 で、こういう提案は、あまり受け入れられないのですが、これへの対策で

 「サーバー側は、社内にWebでの登録内容をメールで送り
   (必要なら暗号化する)、
  ファイアウォールを利かした社内で、メールを自動的に解釈し、
      社内DBサーバーでデータを更新して、
  結果をメールでおくりかえすか、
      FTPで、サーバーにおくる」

 という方法があります。

 これだと、サーバー側は、メールを送るだけで、DBを持たないです。

 このことは、アタックに強くなると同時に、共用サーバーの場合、DBのバージョンアップが容易にできます(共用サーバーの場合、DBのバージョンアップは、レンタルサーバー屋さんに左右される)。とくに、レンタルサーバー屋さんのDBバージョンアップで、過去のソースと互換性がなかったり、そのバージョンで脆弱性があったとしても、共用サーバーなら、自分では、どーしょーもなくなってしまいます。
 
 それに対し、メールでおくる方法にすれば、DBは社内にあるので、不正アクセスされにくいし、バージョンアップ、長時間のバックアップ、サーバー負荷などに対しても、柔軟に対応できる。
 メールを自動的にDBへ登録するプログラムは、Linuxかなんかのばあい、たしか、.hostsファイルに、そのアドレスのメールが着たら、このプログラムを起動しろ!って書けばよかったんじゃなかったっけ?

 最後の、登録成功に関しては、
・登録後、「メールで返事します」というページをだして、メールで返事してもいいし、
・登録後、社内サーバーからFTPで、HTTPサーバーに、
   最後の「更新しました」ページを書き出し、
  サーバー側は、そのページが書き出されるまで、まって
   (ファイルの存在をチェック、なかったら、一定時間sleepして、
     またチェック、これを繰り返し、
     ある一定回数以上調べても、ファイル書き出されなかったらエラー)
  ファイルが書き出されてたら、locationで、それを表示する
 っていうかんじでいけるんじゃないかしら。

 ただ、これは登録とか、顧客データなどの重要データの検索にたいしてだけで、ほかの公開してるようなデータの検索まで、やる必要はない(そーいうのは、DBを使わないならファイル検索とかでもいい)と思うけど。。

 まー、複雑になるけど、これだと、共用サーバでもできるし、メールからDB登録のプログラムを共有化すると、結局メールフォームがおくれるデザイナーさんだけで、画面まわりをつくれる(サーバー登録周りも、難易度がさがるし、登録まわりと、画面周りをまったく切りはなせられるので分業して作業できる)。

 なんつーかんじで、結構メリットあると思うけど。。どーだろ。

(ちなみに、この手段は、Webアクセスできず、メールだけ許されている会社(大手に常駐派遣などである)において、作業報告などをおくったり、社内データを検索するときに利用される。
 ローカルに登録ホームページをおいて、http://127.0.0.1/XXXX.htm(またはXXXX.cgi XXXXはてきとーに)で登録(formでactionをmailtoにする場合は、ローカルにHTTPサーバーがなくてもOK)、その結果を、メールでおくる。結果は、メールで知るっていうかんじね。
 ばかげてる!とか思うかもしれないけど、最近の一流企業様たちは、Webを自由に使わせてくれないのよ。。ほんとほんと)

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ワコールで顧客データ流出、有効期間切れでも、注意したほうがいいかもよ

2005-11-20 01:53:09 | Weblog

 ワコールオンラインショップで、顧客データの流出があったようですね。

 ここに、その件に関するワコールからのお詫び文が出ています
http://www.wacoal.co.jp/owabi0511/


 でも流出データが

○ 流出したデータとその内容
  ・ 注文番号
  ・ クレジットカード番号、有効期限
  ・ お客様番号
  ・ 住所、電話番号
  ※ 流出したデータの内容は、お客様により異なります。
  ※ 氏名、購買履歴については流出していません。


 お客様番号が流出して、氏名が流出していないということは、顧客マスタが流出したわけではない(一安心?)とすると、住所、電話番号は、なんで??送り先なのかな?
 。。。いやちがうな。。。それなら、購買履歴も流出するはず。。ということは、こう考えると矛盾しないね。。。

 クレジットカード会社への与信あるいは引き落としのデータをためておくDB、ファイルが流出した。クレジットカード会社は、与信のため、クレジットカード番号を確認し、本人一致に住所と電話番号を使ってる。クレジット引き落としと、注文と、お客さんの紐付けのため、注文番号、お客様番号がはいっている。。

 あ、そうそう、こういう場合、有効期限がきれていても、注意したほうがいいよ!!
 洗い替えという手法を使うと、有効期間が切れていても、カードを引き落とせる場合があるので。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

外部設計で、やることなど

2005-11-19 21:02:58 | コピーされるほど儲かるシステム!

今日のこのブログの話題は、次のメルマガで書く内容についてです。
メルマガのほうは、次回は、外部設計の手順になります。
ということで、今日の話題は、外部設計の手順について。




 要求仕様書が来たあとで行う作業として、外部設計ということになります。
 この外部設計で行われる作業としては、プログラムのソフト/ハードの基本的構成の決定(フレームワーク決定)と、画面まわり、DB/ファイル周りの仕様決め、通信があれば、その通信まわりの仕様決め、そして、詳細設計に出せるまで、機能をおとしこみ、その機能間の入出力を決定することになります。

 この、機能間の入出力決定が行われるからこそ、契約による設計やテストファースト、ユニットテストといった、最近XPなどで取り上げられる概念が成立します。
 もし、機能間の入出力決定がなされないとして、機能だけが決定していたら、どうなるでしょう。
 入出力はでたらめになってしまいますので、ある機能と、ほかの機能がつながらず、作り直しになってしまいます。そこで、詳細設計に入る前に、各ユニット間の機能は決定していて、それは、テスト可能であり、そのテスト(ユニットテスト)が合格したら、各機能間が接続できるようにならなければなりません。

 ということで、これらをまとめると、以下のようになります。

■■ 外部設計でやるべきこと
・ハード構成の決定
 →ハードウエア構成図の作成(予算などの検討も)
・ソフトウエアの基本的な構成(フレームワーク等)の決定
 →フレームワークの説明
・画面まわりの決定
 →画面定義書の作成
・DB/ファイル回りの決定
 →テーブル定義書、ファイル定義書
・通信など、その他の入出力まわりの決定
・機能の落とし込み
 →インターフェース定義書など

 そして、画面定義書とは、ユーザーの確認を取ります。
 ハードウエア構成図は、作成後、ハードを導入することができるか、資金的、空間的、人的に検討します。
 人的に検討というのは、そのような人材が見つかるあてもないのに、システムを作る危険がないかどうかの確認です。よくやってしまうのが、サーバーのお守りをする人がいないのに、24時間稼動するWebシステムを構築してしまうとか、支店に、誰もコンピューターがわかる人がいないのに、そこにサーバーがあるとかです。

 なお、外部設計と、詳細設計の中間あたりで、こんなことをします。

■■ 詳細設計前に行うこと
・共通で使う部分に関して、共通部分として切り出す
 →共通部分の仕様と、利用の規約をまとめる
・命名規約などの決定
・フレームワーク利用規約のまとめ
・コーディング規約
・配置(javaでいうパッケージなど)

 なお、共通部分というのは、ログのようなものはもちろん、一般的にDBの入出力や帳票出力・画面出力も共通化しますので、その部分もふくみます。これらは、最近はフレームワークに吸収されたり、O/Rマッピングに吸収されてしまいますが。
 なお、そうすると、アスペクト指向の話?となるかもしれませんが、それよりも広い概念になるとおもいます。アスペクト指向の場合、業務の本質における部分の共通化というのを、アスペクトとして捕らえるかどうかは、意見が分かれると思います。
 しかし、共通部分の作成の場合は、これは、共通化されます。
 そうすると、業務の多くの部分というのは、
・チェックする
・ソートする
・マージする
・編集する
・どっかに書き出す(DB/帳票/画面)
程度の、簡単なものの組み合わせになってしまいます。そこで、これらのメソッドをあらかじめ用意しておき、詳細設計では、これらの機能を組み合わせていく形になります。
 そして、これらの機能の入出力においては、契約による設計の議論を持ち出すまでもなく、確認できるためのログが入っているので、このログを追うことにより、詳細設計とプログラムの整合性が、確認できるように設計します。




 やば、メルマガのレベルより、かなり高い内容になってしまった。
 ちょっち、書き直さないと。メルマガ用には。。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする