0

コードにシリアル化された IF ステートメントの長いリストを含めることは避けるべきですか? やむを得ないこともあるが、それは私の経験不足なのだろうか。

たとえば、ユーザーがアップロードした画像を処理していて、エラーについて正確なフィードバックを提供したい場合は、次のようになります。

if($file["size"] == 0) { 
    throw new Exception("ERROR: File was empty");
}

if (($file["type"] != "image/gif")
|| ($file["type"] != "image/jpeg")
|| ($file["type"] != "image/pjpeg")
|| ($file["type"] != "image/png")) {
    throw new Exception("ERROR: Image must be either GIF, PNG or JPEG!");
}

if ($file["size"] > 2000000) {
    throw new Exception("ERROR: Image must be than less 2MB!");
}

    if ($file["error"] > 0) {
    throw new Exception("UNKNOWN ERROR: ".$file['error']);
}

$imgDetails = getimagesize($file["tmp_name"]);

if($imgDetails['channels'] != 3){
    throw new Exception("ERROR: Image must be RGB.)";
}

if($imgDetails['0'] < 50 && $imgDetails['1'] < 50) {
    throw new Exception("ERROR: Image must be larger then 50 x 50.)";           
}

etc. etc. etc. 最終的にファイルがすべてのテストに合格し、処理されるまで。

これは「悪い習慣」ですか?

4

3 に答える 3

1

型チェックを短縮するために使用できますがin_array、この関数から出力を直接プッシュすることを除いて、一般的にこれは適切な形式です。これがクラスで行われる場合、エラー出力を直接プッシュする代わりに、例外を使用することができます。

早く戻って、頻繁に戻ってください。

于 2013-02-26T19:02:47.750 に答える
0

通常、あなたが話しているような if チェーンは、いくつかのセレクターをキーとして、関数のハッシュマップに変形できることがわかりました。

$processImage = { "image/gif" => function processGIF(){blah} }O(n/2) 平均ではなく O(1) で各関数にアクセスできるようなハッシュ マップがある場合(コールの正規分布も不正確であると仮定します)。確かに、それが大量に発生しない限り、これはそれほど重要ではありません。

次に、次を使用してその関数を呼び出すことができます$processImage["image/gif"]();(これは有効な構文だと思います。ここ数年、php よりも多くの JS を実行してきました。)

ただし、ハッシュマップのアプローチはかなり拡張可能で読みやすいと思いますが、それはそれでうまくいきます。

確かに、それらをリファクタリングすることには利点があります..しかし、多くの場合、そうする利点は最小限/状況に応じたものです。

于 2013-02-26T19:01:17.740 に答える
0

任意の制限をリストするのではなく、制限のコレクションを作成し、そのコレクションを調べるコードを実行できます。

JavaScript でこれを行う方法を忘れましたが、JavaScript で 配列にオブジェクトが含まれているかどうかを確認するにはどうすればよいですか?

うまくいけば、これはちょっと役に立ちました>.>

于 2013-02-26T18:57:00.027 に答える