if-then-else が多すぎてコードが読めなくなる場合に、Don't-Repeat-Yourself (DRY) 原則を遵守するにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/937225

質問

「Don't-Repeat-Yourself」の原則を守りたいのですが、HTML や CSS と一緒に PHP を作成するときに、同じコードをさまざまな状況で再利用すると、コードにすぐに多くの if- が含まれてしまうことがあります。そうしないと、コードの保守が容易ではなくなります。

テンプレート エンジンである Smarty が使用されている場合、これはより大きな問題になる可能性があります。ほとんどのコード エディタでは {if} {else} {/if} が一致しないためです。そのため、プログラマーは一致するタグを視覚的に探す必要があり、これは簡単ではありません。ネストされた {if} {else} {/if} のレベルが 3 つまたは 4 つある場合。

このような状況において、DRY にこだわりながらも、保守性の高いコードを維持する方法はあるでしょうか?

役に立ちましたか?

解決

完全なフレームワークが不足しているため、コンテンツに対して (ロジックが含まれている場合でも) 私がよく行うことは次のとおりです。 分けて ファイルに変換し、別の論理評価を使用してそれらをマージ (マングル) し、その後テンプレート ロジックを評価します。これにより、コンテンツがチャンク化され、チャンクが共通の状態で共有/再利用可能になります。

このようにして、各最終テンプレート バッファーは、ディスクまたはデータベースに保存できる、再利用可能な個別のコンテンツ ナゲットのフラット化されたツリーになります。以下を置き換える小さなパーサーのような単純なものでも:

<h1>{{insert:shared_page_header}}</h1>

shared_page_header.txt 物事を分離しておくのに役立ちます。また、テンプレートに埋め込まれたロジックでも懸念事項の分離を検討する必要があります。 管理可能で再利用可能なあらゆるチャンク (動的かどうかに関係なく) 常に進むべき道です。テンプレートは評価されるまでは単なる文字列であるため、次のように扱います。 共有コンポーネントが統合されました big-dirty-string(TM) に変換して評価します。

幸運を

他のヒント

さらに詳しい情報があるので...コードを書くためにどのようなプログラムを使用していますか?

同じことを繰り返さないためのヒント:

何らかのテンプレートを使用します。 こうすることで、各ページにコンテンツを表示するためにコードを繰り返す必要がなくなります。I.E.20 ページあるサイトがあり、レイアウトを変更することにした場合、20 ページすべてを変更する必要はありません。

関数を使用します。 特定のタスクを実行するコードがある場合は、プログラム/ページ全体でそのコードを複数回記述しないでください。関数を作成し、そのタスクを実行する必要がある各場所でそれを呼び出します。そうすれば、変更が必要な場合は、その 1 つの関数を変更するだけで済み、そのタスクを実行したすべての場所を見つけるためにコードを検索する必要がなくなります。クラスとメソッド (メソッドはクラス内の関数です) について知っている場合、多くのタスクでは、データのカプセル化が提供され、関連する関数をグループ化して、将来そのクラスを含めることができるため、これはさらに優れています。必要に応じてプロジェクトを実行します。

if/else ステートメントが多くてコードが読みにくい場合は、次のような方法があります。

1.新しいエディタを試してみることを検討してください。 コードの折りたたみは必須です。一部のエディターには、インデントされたコードを強調表示して一致させる垂直線があるため、何がどのようなものであるかがわかります。まともな無料エディタが必要な場合は、これらの機能の両方を備えた Notepad++ をお勧めします (Google で検索してください。ここにはリンクを追加できません)。

2.ネストされた if ステートメントの数を減らすために使用できるテクニックがあります...

例 (このコード):

if (item1 == true) {
   if (item2 == true) {
      item3 = 5;
   }
   else {
      item3 = 10;
   }
}
else {
   if (item2 == true) {
      item3 = 15;
   }
   else {
      item3 = 20;
   }
}

次のように平坦化することもできます。

if (item1 == true && item2 == true) {
   item3 = 5;
}
else if (item1 == true && item2 == false) {
   item3 = 10;
}
else if (item1 == false && item2 == true) {
   item3 = 15;
}
else {
   item3 = 20;
}

したがって、ネストされた if/elses が 3 つまたは 4 つのレベルにあり、それらを平坦化したい場合は、上記のような複数の引数を使用した方がコードが読みやすくなる可能性があります。やることは同じですが、どちらの方法で行うかは好みの問題です。

ロジック (PHP を想定しています) と表示 (HTML/CSS を想定しています) を混合しないようにしてください。 これは必ずしも簡単なことではありませんが、テンプレートと CSS を使用すれば可能です。ユーザー名をウェルカム メッセージとして表示するホームページでこれを行う方法の実践的な例を示します。

インライン PHP (避けるようにしてください):

<html>
   <body>
      <?php
      if ($logged_in == true) {
         echo "Welcome ",$user->name(),"!";
      }
      else {
         echo "Welcome Guest!";
      }
      ?>
   </body>
</html>

ディスプレイからロジックを分離する (より良い):

<?php
if ($logged_in == true) {
   $greetingMessage = "Welcome ",$user->name(),"!";
}
else {
   $greetingMessage = "Welcome Guest!";
}
?>

<html>
   <body>
      <?php echo $greetingMessage; ?>
   </body>
</html>

^ ロジックをビュー (HTML) から分離しておくと、プロジェクトが非常に複雑になり始めたときに圧倒されないようにすることができます。混ぜないほうがいいですよ!:)

頑張れ!

あなたの質問の最初の文は、IMO、問題となっています。あなたは本当にあなたのビュー(すなわち、HTMLやCSS)を使用してコードを混合してはなりません。あなたがこれをしないのに役立ちますいくつかのPHPのMVCフレームワークがあります。 Zendのフレームワークはかなりまともですが、他にもあります。

あなたは、フレームワークを使用しない場合は、

、その後、私はこのようなコードを使用してバックエンド上のオブジェクトを呼び出さないためにあなたのページをリファクタリングお勧めしたいです。あなたのコードを混合し、素早く閲覧することは、のいずれかのの言語だけでなく、PHPでunmaintainableになります。

今、私はPHPを使用してOOPの概念を実装している馴染みがないかもしれませんが、これらのネストされた場合-else文をリファクタリングし、よくという名前の関数でそれらを置くことはDRY原則に追いついに多くのことができます。それに、DRY原則に固執すると、あなたのコードの保守性を作るんます。

スクリプト ファイルの例を使用すると、どこが間違っているかを指摘するのがはるかに簡単になりますが、達成しようとしていることによって役立つ場合と役に立たない場合があります。

  • 見てみると 制御構造の代替構文. 。主に HTML を含むファイルを作成する場合、出力する HTML セクションを決定するためにのみ PHP を使用して、このスタイルを使用することを好む人もいます。

  • コードの再利用可能なセクションを、後で含めることができるファイルに分割します。header.php、footer.phpなど。

  • コードの折りたたみをサポートする IDE の使用

幸運を

文は、論理文と見なされた場合は、

、彼らはビューに彼らはMVCの原則に違反するとして、できるだけ避けてください。

たとえば、代わりにヘルパーをビューに切り替えます:

class LoggedUsernameHelper
{
    protected $user;

    public function __construct(SomeUserObject $user)
    {
        $this->user=$user;
    }

    public function __toString()
    {
        return $user->isLogged() ? sprintf('Welcome %s', $user->getUsername()) :
            'Welcome guest';
    }
}

このコードは再利用可能で、テスト可能な、ドライあなたのコードを維持します。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top