2

データベースからリストをロードして選択リストに入れる機能があります。関数は次のとおりです: (疑似コード)

 protected function Foo() 
 {
    try {

        get pdo instance
        prepare statement

        if (pdo query executes) 
        {

            while (row = fetched rows) 
            {
                do stuff with row
            }
        } 
     } 
     catch (PDOException $ex) 
     {
         do error stuff here
     }        
 }

NetBeans は、行が多すぎ、ネストされたブロックが多すぎるというコードのヒントを示します。私は個人的に、機能は受け入れられるべきだと感じています。また、ロジックを小さな関数に分割するのは少しばかげていると思いますが、なぜネットビーンズは私に嘘をつくのでしょうか :) ?

私の質問は次のとおりです。

これは悪い論理ですか、それとも先に進んでもいいですか? NetBean の制約内に収まるように関数を再設計する方法についての提案を歓迎します。

編集:

私自身の質問には答えませんが、この場合、不要なネストされたブロックが 1 つあります。pdo は、try/catch ブロックを持つシングルトン クラスから取得されます。例外は既にキャッチされているため、この関数でもう一度繰り返す必要はありません。

編集2:

try catch ブロックを削除することは、Peter から Paul への支払いを奪うようなものでした。そのため、pdo インスタンスの作成時に例外がスローされても、実行は停止しません。したがって、正しく初期化されていない PDO オブジェクトで準備ステートメントを呼び出してみます。これにより、prepare 呼び出しの前に別​​のテストを実行する必要が生じ、元の関数の作り直しに戻るだけです。

私の経験では、これは私のロジックがどこかで床に落ちていることを意味します。何か言いたいことがあれば、デザインを見直して大声で戻ってきます。

改めて感謝します

4

2 に答える 2

7

あなたのコードは良いです。NetBeans が提案していることは、必ずしも従うべ​​き規則ではなく、PHPStorm などの他のエディターを使用した場合でも心配する必要はありません (PHPStorm では、コーディング スタイルを PSR 1/2 に従うように設定できます)。

ガード句と呼ばれるものを使用して、少なくとも 1 つの入れ子をなくすことができます。

protected function Foo() 
{
    try {
        get pdo instance
        prepare statement

        if (! pdo query executes) return; 

        while (row = fetched rows) 
        {
            do stuff with row
        }

     } 
     catch (PDOException $ex) 
     {
         do error stuff here
     }        
}

厳格なルールがないため、人々がさまざまな好みを持っているのを見てきました。たとえば、Anthony Ferraraは個人的に、ネストされた 4 つのレベルを超えるべきではないと考えています。

ポイントは、ネストと行数をできる限り最小限に抑える必要があるということです。メソッドが大きすぎる場合 (神メソッドと呼ばれることもあります)、それは間違ったやり方をしていることを意味します。

ジェフ・ベイが彼の著書「 ThoughtWorks アンソロジー」で提案したいくつか (実際には 9 つ) の提案について議論している、ウィリアム・デュランドによるこの素晴らしい記事もご覧になることをお勧めします。

オブジェクト体操

PHP Coding Standards Fixerもあなたの味方です。

そう:

  • 現在のコードは完全に問題ありません
  • 個人的な好みを作成し、可能な限りネストと行数を最小限に抑えます。
于 2015-05-12T11:14:53.487 に答える
0

条件が真でない場合は、if ステートメントを逆にして関数を終了し、1 レベルのネストをなくすことができます。ロジックは私もOKに見えます。

于 2015-05-12T09:57:36.713 に答える