1

Do n't-Repeat-Yourselfの原則を守りたいのですが、PHPをHTMLとCSSと一緒に作成するときに、同じコードをさまざまな状況で再利用すると、すぐにコードに非常に多くのコードが含まれるようになります。それ以外の場合、コードは簡単に保守できません。

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

そのような状況では、DRYに固執する方法はありますが、それでも優れた保守可能なコードがありますか?

4

6 に答える 6

4

詳細をお知らせします...コードの記述にどのプログラムを使用していますか?

繰り返さないためのヒント:

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

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

多くのif/elseステートメントやコードがあまり読みにくいという問題がある場合は、次のことができます。

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

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)から分離しておくと、プロジェクトが非常に複雑になり始めたときに圧倒されないようにするのに役立ちます。混ぜないのがベストです!:)

頑張ってね!

于 2009-06-02T04:03:40.970 に答える
3

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

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

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

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

幸運を

于 2009-06-01T23:03:46.840 に答える
0

あなたの質問の最初の文は問題、IMOです。実際には、コードをビュー(つまり、HTMLとCSS)と混合するべきではありません。これを行わないのに役立つPHPMVCフレームワークがいくつかあります。Zendフレームワークはかなりまともですが、他にもあります。

フレームワークを使用したくない場合は、このようなコードを使用せず、バックエンドでオブジェクトを呼び出すようにページをリファクタリングすることをお勧めします。コードとビューを混在させると、PHPだけでなく、どの言語でもすぐに保守できなくなります。

于 2009-06-01T23:04:15.717 に答える
0

PHPを使用したOOPの概念の実装にはあまり慣れていないかもしれませんが、ネストされたif-elseステートメントをリファクタリングし、適切な名前の関数に配置すると、DRYの原則に対応するのに大いに役立ちます。さらに、DRYの原則に固執することで、コードを保守しやすくなります。

于 2009-06-01T23:04:34.890 に答える
0

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

  • 制御構造の代替構文を見てみましょう。一部の人々は、主にHTMLを含むファイルを作成するときにこのスタイルを使用することを好みます。PHPは、出力するHTMLセクションを決定するためにのみ使用されます。

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

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

幸運を

于 2009-06-02T00:11:37.093 に答える
0

ステートメントが論理ステートメントであると見なされる場合、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';
    }
}

このコードは再利用可能でテスト可能であり、コードをドライに保ちます:)

于 2013-02-10T21:59:22.340 に答える