3

大規模な PHP プロジェクトを作成していますが、その進め方について些細な疑問があります。

class を取得したと仮定booksします。このクラスには、次のメソッドがありReturnInfoます。

function ReturnInfo($id) {
    if( is_numeric($id) ) {
        $query = "SELECT * FROM books WHERE id='" . $id . "' LIMIT 1;";

        if( $row = $this->DBDrive->ExecuteQuery($query, $FetchResults=TRUE) )   {  
                return $row;
        } else {
            return FALSE;
        }
    } else {
        throw new Exception('Books - ReturnInfo - id not valid.');          
    }
}

それから私は別の方法を持っていますPrintInfo

function PrintInfo($id) {
    print_r( $this->ReturnInfo($id) );
}

明らかに、コード サンプルは単なる例であり、実際の製品コードではありません。

2 番目の方法では、id が数値かどうかを (再度) チェックする必要がありますか? または、最初のメソッドですでに処理されているため、スキップできますか?例外でない場合はスローされますか?

今まで、私は常に冗長なチェックでコードを書いていました(すでに他の場所でチェックされていても、ここでもチェックします)

ベストプラクティスはありますか? 常識だけですか?

ご丁寧なご回答ありがとうございます。

4

2 に答える 2

5

さて、すべてのレイヤーをチェックインすることで何が得られるかを自問してください。それはより安全ですか?いいえ、脆弱なのは唯一の値である何かの値を使用する関数なので、チェック自体を行います。

唯一の利点は、無効な値を早期に停止できることです。これにより、実行されるコードが少なくなります。値が無効であることがわかる前に、完全に下に移動して戻る必要はありません。これは本当の利点かもしれないし、そうでないかもしれません。

ただし、問題が発生します。コードが増えます。あなたのコードはもうDRYではありません。「有効な」値を作成するものの定義を変更する場合は、すべての場所でチェックを変更する必要があります。それらははるかに大きな問題です。

私はこの方法で問題に取り組みます。コアビジネスモデルは詳細なチェックを行い、最終的には値が有効であることを確認する責任があり、この値で「危険」なことを行うのはそれだけです。外側のレイヤー(コントローラー、ビュー)は、値を渡すだけです。1つの例外を除いて、「大まかな」データ検証を行う場合があります。モデルが特定の形式の電話番号を想定しているとします。モデル内でこの特定のルールを確認する必要があります。ビュー/コントローラーレイヤーでは、値が少なくともある程度数値であると大まかに検証できます。たとえば、Javascriptチェックがあります。これにより、明らかに間違った値がコアアプリに影響を与えるのを防ぎ、コア検証ルールを1か所で微調整できる柔軟性が得られます。

于 2012-12-18T15:40:25.097 に答える
0

何千回も連続して実行されているループ内で戻り値を再確認しない限り、冗長なチェックに気付くことさえありません。それでも、型チェックは非常に小さな操作であり、例でデータを取得するために使用されている SQL クエリよりも桁違いに高速です。

リアルタイム アプリケーションの CPU サイクルを実際に圧迫している場合を除き、余分なチェックが提供するお尻のカバレッジを享受する可能性があります。

とは言っても、関数は通常、入力を出力と同じかそれ以上に厳密に検証する必要があるため、このような余分な冗長チェックを記述する唯一の場所は、厳密な入力/検証を必要とするインライン機能の場合です。

于 2012-12-18T17:02:15.613 に答える