8

私は平凡で独学の PHP スキルを使って質素な Web サイトに取り組んでおり、現在のインターフェース構造は次のようになっています。

<?php
  if (A) {
    $output = someFunc(A);
  } else if (B) {
    $output = anotherFunc(B);
  } else if (C) {
    $output = yetAnotherFunc(C);
  } else {
    $output = 'default stuff';
  }
?>
<html template top half>

<?php echo $output; ?>

</html template bottom half>

これは最初は問題なく機能し、かなりよく整理されているように見えましたが、必要な機能が 10 倍に増加し、急速に保守不可能で厄介な混乱に変わりつつあり、どうすれば抜け出せるのかわかりません。

それぞれの状況で呼び出される関数はかなりよく書かれており、集中しているように感じますが、ユーザーとレイアウトを作成してリターンを処理する関数の間の中間ステップをどのように処理するかについて途方に暮れています。

MVC は 1 つの解決策だと思いますか? でもここからあそこへの行き方が分からなくて困ってます…

上記のコードが引き起こしたかもしれない頭痛や不快な思い出についてお詫び申し上げます。お時間をいただきありがとうございます。

4

3 に答える 3

5

あなたは、多くの人が行うように、大きな if 文や case 文を始めたようで、それは成長し続けています。これらのすべての「if」チェックには時間がかかる場合があります。MVC は間違いなく優れた方法ですが、実装する方法はたくさんあります。MVC で一般的に使用される Front Controller デザイン パターンも参照することをお勧めします。

実行方法を変更する 1 つの方法は、連想配列を使用して定義済みの「アクション」リストに切り替えることです。そして、関数をインクルードに変更します。次に、複数の関数、変数、およびその他の処理コードを使用できます。

$actions = array(
'A'=>'action1.php',
'B'=>'action2.php',
'C'=>'action3.php',
'default'=>'action_default.php'
);
if ( isset( $actions[ $_GET['action'] ] ) ) {
    include( $actions[ $_GET['action'] ] );
} else {
    include( $actions['default'] );
}

次に、「インデックス」ファイルは単なるルーティングツールであり、これはほとんどフロントコントローラーの概念です.

于 2010-07-28T01:24:53.460 に答える
4

オブジェクト指向のコードでは、一連の if/else または case ステートメントを目にするときはいつでも、if if/else/else の束よりも、オブジェクト階層によって処理する方がよいことがよくあります。

あなたの特定のケースでは、代わりに A、B、および C に対して 3 つの異なるクラスを持つことができます。そして、単一の $obj->doit() メソッドを呼び出すだけです。A、B、および C は、それぞれ doit() メソッドの実装が異なります。

マンネリから抜け出したい場合は、デザイン パターンに関する本を読むことをお勧めします。PHP のデザイン パターンの例を次に示します: http://www.fluffycat.com/PHP-Design-Patterns/

この特定の種類の問題で特に関心のあるパターンは次のとおりです。

  • ストラテジー。
  • 指示。
  • 工場。

PHP の例を含むこれらのパターンの説明は、上記のリンクにあります。他の場所で設計パターンについて詳しく読むことをお勧めしますが、そのリンクには PHP の例があります。

私は実際に、あなたが説明しているものと同様または同一の状況でコードをきれいに整理するために、これらの 3 つを一緒に日常的に使用しています。次のように機能します: - 戦略。これは、クッキーカッターまたは Mad Libs スタイルのもののようなものです。機能の実行に関連する基本を設定します。ユーザー (基本クラスを使用するプログラマー) は、必要に応じて特定のものをオーバーライドできますが、作業を行うための基本はすべて整っています。例: ビジネス プロセスを実行する必要があります。通常、これにはトランザクションの開始、作業の「要」の実行、クリーンアップとログの実行が含まれます。ここで Stragegy/cookie-cutter パターンを使用するのはおそらくやり過ぎに思えますが、多くの場合そうではありません。コードの「肉」にエラーや例外がスローされた場合でも、クリーンアップを行うことを忘れないでください。

  • コマンド: 上で述べた戦略パターンのアイデアと組み合わせると、実際の作業を行う関数内のボイラープレート コードが少なくなります。

  • 工場。ファクトリ メソッドを使用して、直面している状況に適した種類のコマンドを生成します。

これら 3 つの設計パターンを組み合わせると、この種の状況では非常にうまく機能し、同じことを繰り返さない非常にクリーンなコードにつながる可能性があります。

以下の maschka は、合理的なアイデアである Smarty の使用を推奨しています。アプリケーションによっては、MVC フレームワークを使用することをお勧めします。PHP を使い続けるという考えにコミットしているなら、CakePHP をお勧めします。CakePHP で大きな成功を収めています。コードを非常に適切な方法でレイアウトし、問題を回避するのに役立ちます。

于 2010-07-28T01:34:08.877 に答える
0

一般的な提案: Smartyを見たことがありますか? かなり便利なテンプレート エンジンであることがわかりました。おそらくある程度の学習が必要ですが、長期的には価値があるかもしれません。

于 2010-07-28T01:26:22.153 に答える