1

だから私はとDataBaseの間のカプセル化層になるクラスを書いています。PHP ControllerMySQL View

interface iDataBase {
    public function drug($action, $drug);
    public function company($action, $company);
    public function activeIngredient($action, $activeIngredient);
}

最初は、getAllDrugs()、updateDrug()、removeDrug()、getForUpdate()、getDrug() などのようにすべてのセッターとゲッターを分離することを考えていましたが、あまりにも多くの関数でデータベース インターフェイスを汚染していることに気付きました。さらに、これは非常に小規模なバージョンです。さらに多くのクラスと機能を追加することを検討しています。したがって、多くの関数を使用する代わりに、3. に落ち着きました。$actionユーザーが特定のクラスでどのようなことをしたいかを決定します。したがって、今のところ、可能なアクションは次のとおりです。"add", "getAll", "getForUpdate", "update", "remove"

しかし、マスクされたこれらの関数$actionは異なる処理を行うため、それらの戻り値は異なり、2 番目の引数も異なる場合があります。

私の解決策は良い習慣ですか?同じ悩みを抱えている方も多いと思いますが、どのように解決されましたか?考えられる問題はありますか?

PSDrug, Company, ActiveIngredientはすべてのクラスです

4

4 に答える 4

3

関数には、明確に定義された最小限のリターンタイプを使用して、明確に定義された狭い責任が必要です。渡す引数に応じてすべてを実行し、キッチンが沈む「神の関数」を作成し始めると、スパゲッティコードを維持するのが難しい領域に深く入り込むことになります。Xを渡すとAを実行してBを返す関数は必要ありませんが、Yなどを渡すとCを実行してDを返す関数は必要ありません。

同様のパターンが出現するのを見て、具体的に始めて、時間をかけて一般化することをお勧めします。したがって、実際に必要なメソッドを作成します。

public function findUserById($id)
public function findUserByEmail($email)
public function updateCompanyName($id, $newName)

これらの関数間でコードを共有していることがわかった場合は、バックグラウンドでコードを統合して、DRYを維持します。

public function findUserById($id) {
    return $this->find('SELECT * FROM user WHERE id = ?', $id);
}

public function findUserByEmail($email) {
    return $this->find('SELECT * FROM user WHERE email = ?', $email);
}

protected function find($query, $arg) {
    ...
}

逆に始めないでください。「X、Y、Zだけが必要」と考えて、1つのメソッドに統合するのに十分似ているように見えます。その後、X、Y、Zの間に小さな違いがあることを確認し、コードを散らかします。それぞれの特別な場合。それは、巨大な、または非常に一般的な機能につながるだけであり、基本的にはそれ自体では何もしません。

于 2012-10-24T11:33:33.077 に答える
2

あなたが探している可能性が高いのは、TableDataGateway (強調鉱山)と呼ばれるものです。

テーブル データ ゲートウェイは、単一のテーブルまたはビューにアクセスするためのすべての SQL (選択、挿入、更新、および削除) を保持します。他のコードは、データベースとのすべての対話に対してそのメソッドを呼び出します。

これは、たとえば PDO オブジェクトなど、1 つの汎用データベース アダプターを使用することを意味します。これをさまざまな TDG に注入します。次に、TDG はそのアダプターを使用して、データベースからデータを CRUD します。

class CompanyTableGateway
{
    private $dbAdapter;

    public function __construct(DBAdapter $dbAdapter)
    {
        $this->dbAdapter = $dbAdapter;
    }

    public function create($name, $street, $whatever)
    {
        $this->dbAdapter->exec( 'INSERT INTO companies …' );
    }

    public function findById($id) 
    {
        return $this->dbAdapter->exec(
            sprintf('SELECT * from companies where id = %d', $id)
        );
    }

    // more methods …
}

これらのゲートウェイが複数ある場合は、一般的な CRUD ロジックを抽象クラスに抽象化し、そこから具体的なゲートウェイを拡張できます。

次に、TableModuleまたは同様の他のオブジェクトを使用して、個々のゲートウェイでメソッドを呼び出します。

于 2012-10-24T12:10:34.467 に答える
1

関心の分離と単一責任の原則に関する終わりのない議論。

  • 関心の分離(SoC)–コンピュータープログラムを、機能の重複をできるだけ少なくする別個の機能に分割するプロセスです。懸念事項は、プログラムの関心や焦点です。通常、懸念事項は機能または動作と同義です。 http://en.wikipedia.org/wiki/Separation_of_concerns

  • 単一責任原則(SRP)–すべてのオブジェクトには単一の責任が必要であり、そのすべてのサービスはその責任と厳密に連携している必要があります。あるレベルでは、凝集度はSRPの同義語と見なされます。http://en.wikipedia.org/wiki/Single_responsibility_principle

両方を最大限に活用し、それに応じてクラスをモデル化してください。

于 2012-10-24T11:32:20.050 に答える
1

私がお勧めするのは、データベースの基本的な入出力を制御するグローバルデータベースクラスを実行し、これを各テーブルに拡張することです。

この例として、Usersテーブルがあります。このテーブルにできることは

  1. 作成
  2. アップデート
  3. 消去

次に、スーパーデータベースクラスをUsersクラスで拡張します。このクラスには、必要な関数ごとにゲッターとセッターがあります。

class Users extends DatabaseClass {
    public function update ( $params )
    {
        // Make the code for an update, and let the SuperClass execute the code.
        ...
    }

    public function add ( $params )
    {
        ...
    }

    public function delete ( $params )
    {
        ...
    }
}

これにより、後で、Usersテーブルに機能を簡単に追加し、使用しているテーブル/データ専用のクエリを最適化できます。

于 2012-10-24T11:40:17.420 に答える