validate は if文より劣る

cakephp や zend freamwork なんかだと、値をチェックする validate っていう機能がある。
これって一見便利な気がするけど、if文に比べると優れているどころか劣っていると思う。

ソースの中にリソースを書くんぢゃねーよ

いきなり脱線するんだけど、ソースの中にエラーメッセージを入れるのはどうかと思う。
エラーメッセージを内容はプログラムではない見たくれのデータだから、ビューに任せるべきだ。
メモリが足りないとか、絶対必要なコントローラーがないとかの緊急なエラーは埋め込みでもいいんだけど、「〜が入力されていません」などのような緊急以外でエンドユーザーが見る可能性があるエラーメッセージはすべてビューが持つべきだろう。
世の中の人は、エラーメッセージの文体を変更しなくてはいけなくなったら、プログラマがソースを調べて修正してんの?だるくない?

まぁ、それについては本題ではないのでとりあえずおいとく。

で、validate が if文より劣っている点は次の2つ。

ディフォルト入力

たとえば、名前が入力されていなかったときに、ななしさんにしたい場合どうするか。

if (!isset($_POST['name']))
{
	$name = 'ななしさん';
}
else
{
	$name = $_POST['name'];
}

validate でやるとしたら、一度 validate チェックにかけて、name のみ入力エラーだったら握りつぶして「ななしさん」と書き換えるような2度手間の書き方だと思う。

分岐対応がメンドイ

入力項目によってチェックする項目の切り替えに対応しづらい。

たとえばこんなフォームがあったとして、
選択内容によってチェックしなければいけない内容が変更される場合。

if (@$_POST['contact'] == 'tel')
{
	if (!IsTel(@$_POST['tel']))
	{
		$error['bad_tel'] = true;
	}
}
else
{
	if (!IsMail(@$_POST['mail']))
	{
		$error['bad_mail'] = true;
	}
}

入力チェックルーチンのあるべき姿

では、入力チェックルーチンを提供する場合どうすればよいのか。
難しいことは何も考えずに、こんな感じの入力チェック関数集って形で提供するのが一番効率的な気がする。

//簡易チェック
class L_Check
{
	//数字か?
	public static function IsNumber($p)
	{
		return preg_match('/^[0-9]+$/' ,$p);
	}
	//ASCIIか?
	public static function IsAscii($p)
	{
		return preg_match('/^[a-z0-9]+$/i' ,$p) ;
	}
	//長さ
	public static function IsLength($p,$min,$max)
	{
		$len = strlen($p);
		return ($len >= $min && $mlen <= $max);
	}
...
};

利用するほうは普通に、こんな感じで呼び出す。

if (! L_Check::IsLength( @$_POST['name'] , 1, 2) )
{
	$error['bad_name'] = true;
}

L_Check::IsLength っていうのが長すぎる場合は、 L_Check 取っ払って メソッドから関数 にしてもいいかもしれない。

ソースが長すぎる?
コレでどうだ!

$error['bad_name'] = ! (IsLength( @$_POST['name'] , 1, 2));

validateを使おうが、使いまいがエラーチェックを記述する行数や内容はたいした変化はないはずだ。
何より、if文だと多少無理が利くし、デバッグしやすいという最大のメリットがあるww
だったら、最初からif文でかけばいいぢゃないかと。

もし、間違いや、
俺様の作った validateは最高だという人は非常に興味があるから教えてください。
先生どうすれば幸せになれますか?