2

モジュラー CMS システムでオブジェクトを設計する方法についてアドバイスをお願いします。私は何時間も探していましたが、正しい答えを見つけることができませんでした.

物事との相互作用のためのクラスをどのように設計するのですか? これらのクラスがあるとしましょう:

cDb() // for database interactions
cUser() // for all user actions
cSession() // for interactions with session data.
cAnotherObject // multiple another objects from future modules

どうにかしてそれらすべてを拡張する必要があるので、最終的には次のような 1 つのオブジェクトになります。

$myvar = new cLatestClass(); 

[cSession は cDb を拡張し、cUser は cSession を拡張します ... など]

もしそうなら、モジュールに動的にロードされたクラスでそれを行う方法は? varオブジェクトを保持する複数の を使用する方が良いですか?

$user = new cUser(); 
$session = new cSessions();
 ... etc.

ここの誰かが私に答えてくれることを本当に願っています。うまくいけば、それを正しく行う方法を教えてくれます。

4

2 に答える 2

3

まず、一歩下がって、オブジェクト指向とは何かを学ぶことをお勧めします。「オブジェクト指向プログラミング」という用語を生み出した Alan Kay は、かつて次のように説明しました。

オブジェクトは、ネットワーク上の生体細胞や個々のコンピューターのようなもので、メッセージでのみ通信できると考えました。 (ソース)

PHP (およびほとんどのオブジェクト指向言語) では、これらのメッセージは通常、メソッド呼び出しであるか、パブリック プロパティの場合は値の取得と設定です。

したがって、システム内のオブジェクトは、必要なすべての動作を 1 つのオブジェクトにまとめようとするのではなく、より大きな目標を達成するために協力する、より大きな生物の個々の細胞と考えてください。

これは大きなトピックであり、多くの本が書かれていますが、あなたが質問で言及したオブジェクトに関して、まずそれらが分類されるさまざまなカテゴリを区別します。データベースまたはセッション オブジェクトは、他のオブジェクト (たとえば、MVC フレームワークを使用している場合はコントローラー) が依存する "サービス" の一種と考えることができます。他の人が述べたように、依存性注入はそのようなサービスを処理するための優れたソリューションですが、ほとんどの場合、ユーザーごとに1つのインスタンスが必要なユーザークラスのようなものに使用することはお勧めしません(もちろん文字通りではありません-あなた特定の要求を処理するために必要な特定のユーザー オブジェクトのみをメモリにロードします。多くの場合、現在のユーザーのインスタンスのみです)。

依存性注入の詳細については、Martin Fowler がこの用語を作り出したこの記事をお勧めします。また、Service Locator と呼ばれる依存性注入コンテナーのより簡単な代替手段についても言及しています。

(依存性注入コンテナーのアプローチはより堅牢ですが、より複雑でもあります。幸いなことに、そのための優れたオープンソース ライブラリがあります)。

ユーザー、記事、およびカテゴリはすべて、CMSのドメイン オブジェクトの例です。これらは、MVC (ドメイン モデルとも呼ばれる) の "M" (モデル) の一部です。もちろん、これらのオブジェクトをデータベースに出し入れする方法も必要なので、おそらく、ある種の Repository または Query クラスも必要になるでしょう (Repository クラスはサービスと見なすことができます)。すべての PHP システムが真のドメイン オブジェクトを持っているわけではありません。多くは、配列または stdClass オブジェクト (次のように作成された単純な匿名オブジェクト$someObj = new stdClass) を返すリポジトリのようなクラスを持っています。

オブジェクト指向プログラミングの本当の目的は、私が上で述べたことよりもさらに深いところにあります。つまり、システム内のオブジェクトを、私たちのメンタル モデル (エンド ユーザーとプログラマーの両方の視点を含む共同のメンタル モデル) を反映するように設計することです。 . これは、MVC パターンを発明した Trygve Reenskaug からの別の良い引用です。

手続き指向プログラミングとオブジェクト指向プログラミングの違いは、手続き指向が「何が起こるか」という質問に答える点にあると私は考えています。オブジェクト指向は、「誰がそれを行うのか?」という追加の質問に答えます。(ソース

最後に、PHP でのオブジェクト指向プログラミングを具体的に扱った本を読むことをお勧めします。Matt Zandstra によるPHP Objects, Patterns and Practiceは非常に優れたものです。

于 2013-06-23T02:04:17.377 に答える
1

どうにかしてそれらすべてを拡張する必要があるので、最終的には次のような 1 つのオブジェクトになります。

いいえ、絶対にすべきではありません。クラスを拡張するときは、is-aリレーションが必要です。

セッションはデータベースではありません。そして、ユーザーは確かにセッションではありません。あなたが探しているのは、依存性注入である可能性があります。

Userクラスにデータベース接続が必要だとしましょう。それは次のようになります。

class User
{
    private $dbConnection;

    public function __construct(\PDO $dbConnection)
    {
        $this->dbConnection = $dbConnection;
    }

    public function doSomethingWithDb()
    {
        $this->dbConnection->query('SELECT...');
    }
}

$dbConnection = new PDO('/* dsn string */', 'user', 'pass');
$user = new User($dbConnection);

Userデータベース クエリをクラスから切り離して、データベースをすべて使用することに縛られないようにすると、さらに良いでしょう。

また、CS のメモとして: クラスの先頭に を付けるのはなぜcですか?

モジュールシステムについて。それは、モジュールをどのようにセットアップするかによって異なりますが、動的モジュールを結び付けるために依存性注入コンテナーを調べる必要がある場合があります。

于 2013-06-23T01:31:31.747 に答える