0

基本的な前提は次のとおりです。私は db オブジェクトにアクティブ レコード パターンを使用しています。これらのクラスを編成する方法について何らかの方向性が必要だと思います。また、一般的に、クラス構造を潜在的に分割する方法についても説明します。うまくいけば、私はこれをあまりひどく説明しません。構成パターンが進むべき道である場合、それを実装する方法について少し手を握る必要があるかもしれません。

ActiveRecordトーテム ポールの下部に、オブジェクトを db にマッピングし、db をオブジェクトにマッピングする基本クラスがあるとします。

の子ActiveRecordは一種のジェネリックUserクラスであり、ユーザー セッション、ログイン、保存時のパスワード フィールドの暗号化などを処理します。

の別の子ActiveRecordActiveRecordButSlightlyMoreAdvancedクラスです。通常、このクラスは とは何の関係もありませんUserが、ここに私の問題があります。

User基本的に と の組み合わせになりたいサブクラスが必要ActiveRecordButSlightlyMoreAdvancedです。UserButSlightlyMoreAdvancedからすべてのメソッドをコピーして貼り付ける必要はありませんUserUserを拡張するActiveRecordButSlightlyMoreAdvancedのは意味がありませんUser. UserButSlightlyMoreAdvancedを拡張するのは理にかなってActiveRecordButSlightlyMoreAdvancedいますが、 からたくさんのメソッドをコピーして貼り付ける必要がありますUser

写真の方がよく考える人もいると思いますので、ここに構造を示します。

ベース

class ActiveRecord
{
    ....
}

class User extends ActiveRecord
{
    ....
}

また子供

class ActiveRecordButSlightlyMoreAdvanced extends ActiveRecord
{
    ....
}

問題

class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced
{
        :( :( :(
}

私はこの問題について約1か月考えてきましたが、オブジェクトの1つが保存を実装する方法に変更があった場合、オブジェクトを二重に維持する負担を負わない解決策は考えられません。今後数日間でいくつかの解決策を試し、この状況で最善と思われるものを投稿する予定です。

4

2 に答える 2

1

私の推測では、あなたは次のように言うつもりでした。

class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced 
{
    :) :) :)
}

その場合は、traits http://php.net/manual/en/language.oop5.traits.phpを調べてください。

于 2012-10-11T21:44:50.840 に答える
0

戦略パターンを使用してみてください。この場合、クラスを作成します。

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
{
    private $_strategy;

    public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
        $this->_strategy = $s;
    }
}

戦略クラスを作成します。

interface ActiveRecordButSlightlyMoreAdvancedStrategy
{
        // Define what this should do here
}

上記のインターフェースを実装する戦略クラスを作成します。

class ActiveRecordButSlightlyMoreAdvanced implements ActiveRecordButSlightlyMoreAdvancedStrategry {
    // Do stuff here
}

これらの高度なメソッドを呼び出すと、両方のクラスが同じインターフェースを実装しますが、 UserButSlightlyMoreAdvanced クラスはリクエストを戦略オブジェクトに渡すだけです。

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
    {
        private $_strategy;

        public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
            $this->_strategy = $s;
        }

        public function someSlightlyMoreAdvancedFunction () {
             return $this->_strategy->someSlightlyMoreAdvancedFunction():
        }
    }

それが役立つことを願っています。

于 2012-10-11T21:55:13.320 に答える