2

クラスには、使用可能な post/get 変数に基づいてアクションを実行する処理メソッドがあります。簡単な例を次に示します。

public function handleAll(array $vars) {
    if (isset($vars['var1'])) {
        $this->doThisAction($vars['var1']);
    } else if (isset($vars['var2'])) {
        $this->doAnotherAction($vars['var2']);
    }
}

したがって、実行時にメソッドをこのように呼び出すことができます$handler->handleAll($_POST)。問題は、$vars 配列に格納されている変数の名前を「var1」および「var2」などにする必要があることです。これは、処理コードが html フォーム要素の名前または URL の get 変数 (または実際にはのキー) と結合されていることを意味します。渡された任意の配列)。

任意の変数の配列を注入できるようにすると、メソッドが柔軟になります。これは、ポリモーフィックでもあるため必要です。クラスはこのメソッドを継承し、それを使用して独自のアクションを呼び出します。この結果、処理方法が機能するために何が必要かが外部からは明らかではありません。これは、実装を調べて、それが何をするかを調べる必要があることを意味します (愚かなコードを phpdoc にコピーしない限り)。

これを回避する方法がわかりません。(このような複数のクラスからの) インデックス ページに膨大な if/case ステートメントがすべて公開されていると、非常に厄介なコードになるため、これらすべてをメソッド内にカプセル化することをお勧めします。また、自身の状態を操作するアクションの呼び出しを担当するクラスのメソッドとして持つことも理にかなっています (責任駆動設計)。各変数をメソッドのパラメーターとして使用することを考えましたが、一部のクラスではパラメーター リストが非常に大きくなります。また、さまざまなクラスの多くの handleAll() メソッドを自動的に呼び出すことができないことを意味します。これは、呼び出しごとにすべてのパラメーターを明示的に注入する必要があり、ポリモーフィックな側面が取り除かれるからです。

要約すると、メソッドをポリモーフィックに保つ必要がありますが、HTML フォームまたは URL からのユーザー入力から処理コードを分離する何らかの方法が必要です。これを行う際に、インターフェイスを実装から分離する方法もあるかもしれません。これに対する解決策がまだ見つからないことに驚いています。これは一般的な問題のようです。

4

2 に答える 2

1

あなたが説明したことが回避できるかどうかはわかりません。

特定の引数を必要とするコードがある場合 (特定の値を含む配列の形式など)、その関数は常に引数が正しく入力されているかどうかに依存します。

がある場合はfunction foo($a, $b, $c)、常にパラメーターを入力する必要があります。それらが POST からのものである場合、POST から取得する必要があります。array('a' => ..., 'b' => ..., 'c' => ...)関数が代わりにを使用した場合でも同じことが言えます。

ただし、フォームをパラメーター リストから切り離したい場合は、単純な関数を使用して、POST 配列をハンドラー関数の 1 つが期待する形式に変換できます。ただし、必要がないのに複雑さを追加するのはなぜですか?

ハンドラーが必要とする配列の種類をより適切に定義したい場合は、代わりにオブジェクトを必要とするようにすることを検討できます。このアプローチは、パラメーター オブジェクトと呼ばれることもあります。

パラメーター オブジェクトを使用する利点は、コンストラクターで必要なパラメーターを簡単に設定し、オプションのパラメーターにはセッターを使用できることです。コードを使用する人は誰でも、オブジェクトのインターフェースを見るだけで、必要な値を確認できます。

ハンドラーが使用する値が実際に相互に関連している場合は、実際のビジネス ロジック タイプのオブジェクトを作成することを検討します。POST からのデータを使用して作成し、値を処理するコードをオブジェクト内のメソッドに移動します。

于 2012-04-06T23:47:24.703 に答える
0

ハンドリング方法の分離と自動化は、絞り込むのも面倒な方法です。ただし、すべてのハンドラーを作成する以外に、それほど多くのオプションはありません。ただし、何か追加していただきたいです。デフォルトを許可し、バリエーションをサポート

function handlePOST() {    }
function handleGET()  {    }
function handleArr()  {    }

現在、これらの関数は、代わりに関数のバリエーションを保持できます。

ただし、内部では、すべてのハンドラーをコーディングする以外に良い方法はありません。ただし、スイッチはそれらを短縮し、処理に別の関数を使用します。

switch($_POST['var1']) {
    case "value1": callPostValue1(); break;
    default: callPostDefaultHandler(); break;
}
于 2012-04-07T00:19:07.240 に答える