3

特定のアプリケーションに取り組んでいると、非常によく似たクエリを何度も書き続けます。それらはまったく同じではありませんが、非常に似た形式であり、ほぼ同じコードのチャンクに埋め込まれています

$Mysqli = new mysqli;
if ($Stmt = $Mysqli->prepare("SELECT foo 
                              FROM tblFoo 
                              WHERE something = ?")) {
    $Stmt->bind_param('s', $this->_something);
    $Stmt->execute();
    if (0 != $Stmt->errno)
        throw new Exception("blah, blah, blah");
    $Stmt->bind_result($foo);
    while ($Stmt->fetch()){
        $this->_foos[] = new Foo($foo);
    }
    $Stmt->close();
    } else {
        throw new Exception("blah, blah, blah"););
    }
}

その後、別の場所で...

$Mysqli = new mysqli;
if ($Stmt = $Mysqli->prepare("SELECT bar, baz 
                              FROM tblBar 
                              WHERE somethingElse = ?")) {
    $Stmt->bind_param('s', $this->_somethingElse);
    $Stmt->execute();
    if (0 != $Stmt->errno)
        throw new Exception("blah, blah, blah");
    $Stmt->bind_result($bar, $baz);
    while ($Stmt->fetch()){
        // do something else with $bar and $baz
    }
    $Stmt->close();
    } else {
        throw new Exception("blah, blah, blah"););
    }
}

...そして別の場所で別の...など。

これは本当に DRY に違反しているのでしょうか? この種のクエリを実行するためのクラスを作成し (テーブル、列、バインドされた変数などのコンストラクターパラメーターまたはセッターを使用)、それをアプリ全体で再利用するのは意味がないようです。しかし同時に、自分自身を繰り返しているというしつこい気持ちを振り払うことはできません.

おそらく、単純なクエリを記述する方法が非常に多く、このような一定量の繰り返しが予想されるだけです。

考え?

4

3 に答える 3

1

言ってしまえば違反です。あなたのコードを一目見ただけで (何かが欠けていない限り)、これら 2 つのステートメントは文字列 "foo" と "bar" (数回繰り返されます) と実際のビジネス ロジックを除いて同一です。

少なくとも、それを抽出できます。さらに言えば、おそらくすべての SQL 文字列を抽出する必要があります。それらは常にコードというよりもデータのように思えてきました。SQL 文字列、テーブルなどの配列があれば、リファクタリングがより明確になりますか?

(コードから文字列やその他のデータを抽出することは、リファクタリングを開始するための優れた方法です)

1 つの可能性として、テーブル名を持つオブジェクトとビジネス ロジックを含むメソッドがある場合、それをすべてのボイラープレート (そこにある残りのすべてのコード) と共に "プロセッサ" に渡すことができます。

そのせいで乾燥しやすいかと思います。

(PS. 常に継承よりも構成を優先します。オブジェクトを「実行」できるクラスよりも継承を使用する利点はありません)

于 2009-02-27T02:02:46.100 に答える
1

多くの人がまさにこれを行っています。すべて同じクラスから継承する各テーブルを表すクラスを作成します。基本クラスは、データの読み込みと保存を処理できます。したがって、データをロードする場合は、load メソッドを呼び出すだけです。また、オブジェクトのプロパティによってフィールド値を設定およびアクセスできます。

多くの汚い仕事を処理するhibernateのようなライブラリもあります。

于 2009-02-27T01:59:05.657 に答える
0

モジュール化への最初の欲求の 1 つに遭遇しています。:-)

一般的な解決策は 2 つあります。1 つ目は、同様のクエリのすべて (またはほとんど) への呼び出しを抽象化することです。そして、別の一連のクエリに戻ります。そして、別のものに。等々。残念ながら、これにより、クエリを呼び出し、問題をチェックし、結果セットを組み立て、それを返すという同じことを行う多数のブロックが発生します。これは DAL ですが、一種のものです。また、スケーリングしません。

2 つ目の解決策は、クエリを作成して結果を返すプロセスを抽象化し、その上でデータ アクセスを抽象化することを検討することです (これは基本的に、SQL を組み立てるものを構築することを意味します)。これは、単純な DAL ではなく、適切な ORM になる可能性が高くなります。これをスケーリングする方がはるかに簡単です。

于 2009-02-27T03:43:38.463 に答える