OOP を使用しておらずprogramming-overhead
、呼び出されている、またはプログラマー用語で発生している問題を述べるところから始めましょうspaghetti-code
。
多くのオーバーヘッドが発生した場合、つまり、内容が異なるだけで機能は同じである、ほぼ同じコード行を書くのに時間が費やされていることを意味します。次に、機能が同じであるが、その内容を区別するコードのすべての平和をスライスし始めます。
あなたは、コピーして貼り付ける必要があると述べましたが、さらに複雑で、form
検証部分 (ステージ 1 と呼んだもの) を行うだけです。これは、すべての作業を行うロジックを適用する方法の簡単な例にすぎません。それが期待する供給入力。1 つの例は、他の例よりもエレガントかもしれません。
以下のすべてのコードはテストされていません
同等の機能のコードを見つけるための例。
// functionality on checking values is the same, but it's content is not
if (isset($_POST['submitButton'])) {
if (isset($_POST['money'])) {
if (is_numeric($_POST['money'])) {
と
// though every decision made by its content is only being produced once ..
} else
echo "You don't have that much money!";
} else
echo "Enter a valid number";
} else
echo "Enter how much you want to wager.";
ここでのコツは、これを論理的に解決するための解決策を見つけることです。PHP には組み込み関数がたくさんありますが、まずそれを解決する方法についてのアイデアを把握してください。例としてkey
、 のような各 に、設定/存在しない場合に等しい値を持たせることがsubmitButton
挙げられます。次に、値を によって提供されるキーと比較しているため、何があっても..配列が意思決定者です。money
not exists
null
$_POST
$_POST
jQuery
キーにデフォルト値を適用するメソッドを使用してライブラリが構築された例が分かり$.extend()
やすいので、キーには常に値があり、存在するかどうかを最初にチェックしないことで常に決定を下す必要があります。しかし、PHP も同様です。
値をデフォルトにしましょう。
$_POST = array_merge(array(
'submitButton' => null,
'money' => 0,
'etc' => '...'
, $_POST);
この配列を検証する関数の作成は、存在する値に常に依存できるため、はるかに簡単になりました。
あなたは、検証が必要なフォームが他にもたくさんあると述べました。特定のフィールドを検証する関数を次に見つけ出す必要があります。
有効または無効なフォームの正式な表現は、配列にすることができます。
$valid_form = array(
'submitButton' => array('not_null'),
'money' => array('not_null','int'),
'etc' => '...'
);
検証する関数は次のようになります
function validateForm($values, $valid) {
// error array to be returned
$error = array();
// let's iterate over each value, remember we defaulted the $_POST array with
// all the fields it can have, so all fields should be iterated apon.
foreach($values as $key => $value) {
if(array_key_exist($key, $valid)) {
// logic content can be used by different functions, switch
// used here for simplicity
foreach($valid[$key] as $validation) {
switch($validation) {
case 'not_null':
if(is_null($value)) {
$error[] = "error logic";
continue; // skip rest
}
break;
case 'etc':
$error[] = "..";
break;
}
}
}
}
return $error ? $error : true; // true being valid
}
エラー処理はさまざまな方法で実行できますが、単純な例を 1 つだけ挙げると (このプロジェクトがどれだけ広範囲になるかによって異なります)、エラーの内容を検証キーにバインドできます。
$vfe = $valid_form_errors = array( // $vfe for simlicity's sake
'__no_error' => 'no error present for "%key%" validation',
'not_null' => '%key% should not be null',
'int' => '%key% expects to be an integer'
);
$valid_form = array(
'submitButton' => array('not_null'),
'money' => array('not_null','int'),
'etc' => '...'
);
正式なエラー メッセージを作成する関数
function error_msg($key, $validation) {
global $vfe;
// error exists?
$eE = array_key_exists($validation,$vfe);
return str_replace('%key%', $eE?$key:$validation, $vfe[$eE?$validation:'__no_error']);
}
そして単純なスイッチでは、エラーロジックは
foreach($valid[$key] as $validation) {
switch($validation) {
case 'not_null':
if(is_null($value))
$error[] = error_msg($key, $validation);
break;
case 'etc':
$error[] = "..";
break;
}
}
では、別のロジックを使用すると、コードはどのように見えるでしょうか?
// first stage ..
$form_valid = validateForm($_POST, $valid_form);
if ($form_valid === true) {
// second stage, same logic be applied as with validateForm, etc.
if($_POST['money'] <= $user['money']) {
$query = mysql_query("SELECT * FROM someTable WHERE id={$user['id']}");
if($result = mysql_fetch_array($query)) {
// third stage, same logic can be applied here..
if ($someOtherCheck == $user['someOtherData']) {
} else {
echo "This isn't right.";
}
} else {
echo "You don't have a row in some table!";
}
}
else {
$errors = $form_valid;
// error handling here
print_r($errors);
}
すべては、期待される値をどれだけ具体的に定義できるかにかかっています。エラーをフォームキーにバインドするなど、すべての機能をより具体的に拡張して、後の段階でその入力を具体的に対象とすることができます。重要なことは、関数が期待する値を比較するように頼むだけでこれらすべてを実行する可能性のある重複をすべて消去し、実際にどの値があるかを彼に伝えることです。