2011-06-25 20 views
2

ここに質問があります。自分のAPIセットを開発したいと思っています。このAPIを開発するときに、他の人たちと共有します。他の人が正しいことをすることを保証することはできません。任意のエラーチェックと検証の中で言うハロープログラム... はこのようなものがあります:プログラミングの検証方法は?

function sayHello($yourName){ 
echo($yourName); 
} 

が、その後、一部の人は$ YOURNAME paramsは上を通過し、型チェックを含めるべきか知らないかもしれないが、私は意志このようなものを強化してください...

/** 
* Say hello to someone. 
* 
* @param string $aName 
**/ 

function sayHello($yourName){ 

    if (!is_string($aName)) { 
     throw new ArgumentException("Type not correct."); 
    } 

    echo($yourName); 
} 

[OK]をクリックすると、 ssは、ので、私は同様に、ので、私のコードは次のようになることを避けるために、私には、空の文字列または非常に長い文字列を必要とする:

/** 
* Say hello to someone. 
* 
* @param string $aName 
**/ 

function sayHello($yourName){ 

    if (!is_string($yourName)) { 
     throw new ArgumentException("Type not correct."); 
    } 
    if(strlen($yourName)) == 0 || strlen($yourName)) > 100){ 
     throw new ArgumentException("argument length is invalid."); 
    } 

    echo($yourName); 
} 

OK、最悪の場合でも、私は私の関数の中でいくつかのビジネスロジックを持っています、例えば、私の機能は英語のみ名を許可し、そう、私は何かにこのような、より複雑になります。

/** 
* Say hello to someone. 
* 
* @param string $aName 
**/ 

function sayHello($yourName){ 

    if (!is_string($yourName)) { 
     throw new ArgumentException("Type not correct."); 
    } 
    if(strlen($yourName)) == 0 || strlen($yourName)) > 100){ 
     throw new ArgumentException("argument length is invalid."); 
    } 
    if(!isEnglishName($yourName)){ 
     throw new ArgumentException("argument business logic is wrong."); 
    } 

    echo($yourName); 
} 

あなたが見ることができるように、これだけの簡単なのsayHelloプログラムは3行のコードからより多くの、それだけになるためにすることができますが単純な関数、より複雑な論理を考えると、どうすればそのプロセスを単純化できますか?どのような戦略が取れますか?ありがとうございました。

+0

質問はどこですか? –

+0

私は質問があると思う:検証のために成長する要件を処理する最良の方法は何ですか?おそらく何らかのバリデーションの枠組みが必要でしょう。 – AbdullahC

+0

関連するプログラミング言語で質問にタグを付けると常に役立ちます。 –

答えて

2

華麗な例!

簡潔に言えば、何かを検証しないでください。これ以上の苦労はありません。あなたがそれらを記述する必要が

  • - ハード(3つのルールとそれがさらに悪化することができる)である
  • 彼らは通常、異なる場所(などのsayHello、setDefaultHello、)で重複している - あなたがいないので、適切なタイプ(Name)を持っていれば、あなたはまだ文字列を "制限"しています。
  • 例外をスローする必要がありますが、どれを例外にする必要がありますか?

私はこれが聞こえるかもしれないどのように悪い知っているが、(私は完全に私がどのように悪い、デザイン・バイ・接触を無視しています!):

    • はとにかく、入力引数を制限するポイントは何でしょうか。
    • 実際にオブジェクトを渡すことを禁止しますか?
    • は、「実行中」または「制限中」のコードですか?あなたの目標に焦点を当てる - 何をしなければならないか、いつどのようにしなければならないか。
    • このバージョンは可読性があります?検証の有無にかかわらず?

    特に最後のものは説得力があるはずです。

    概要:

    • あなたが名前のクラス(とあなたのタイプのすべてのために他のクラスの多く)
    • を導入することができたり、duck-typing

    に入ることができ、私がお勧め後者。あなたがまだそれについての意見を持っていない場合は、それを試してみてください、あなたはいつでも、デザインごとに契約に戻ることができます。一緒に混ぜ合わせてはいけません。

  • 1

    ユーザ入力を処理する場合、現代のWebフレームワークはすべてのWebフォームの検証を可能にします。ここでは(特定のフレームワークから取られていない)の例です:

    $validation()->item('name')->add_rule(array('required', 'min_length[2]','max_length[20]' 'is_english', 'is_string')); 
    

    あなたが見る、検証がまだ存在しているが、コードは離れて、集中あなたが機能を再利用することができますいくつかの他のクラスで抽象化されています。

    次に、コードを場所全体に複製するのではなく、フォームを構成するだけです。

    0

    論理的には、プロセスを簡略化することはできません。

    関数に名前の検証を置くと、トップレベルのコードを簡単に実行できるようになりますが、これらの検証はどこかで行う必要があります。特に、ユーザが$yourNameと入力した場合は、あなたの例にも当てはまるでしょう。

    この要件と同様に、呼び出したすべての関数からのエラーの戻りを確認する必要があります。ここでも違いはありません。

    あなたは本当に選択肢がありません。何らかの機能のエラーをチェックしなければ、プログラムに時限爆弾が置かれています。ここでも同じことが言えます。関数の入力を検証する必要があります。

    引数の検証には、関数のコア操作と同じくらいのコードが必要であることがわかりました。しかし、それはそうです。その周りには方法がありません。