10

私は現在、コアシステムが多くの異なるクライアントに分散されているプロジェクトに取り組んでいます-そして、クライアントが変更を要求した場合、各システムで個別に変更する必要があります。つまり、最終的にコアコードはクライアントごとに異なります。また、最新の状態に保ち、システム全体に新しい機能をコピーすることは困難です。

私は、コードの外部スケルトン構造を持つ「オーバーライドモデル」(私が呼んでいるもの)に移行することを提案しました。やや好き:

|- controllers
|- models
|- views
|- core
    |- controllers
         |- Controller1.php
    |- models
    |- views

その後、Controller1.phpに変更を加えたい場合は、それを外部構造にコピーして変更を加えます。オートローダーは、最初にスケルトン構造をチェックして、適切なファイルが存在する場合はそれらをロードします。

Loader::controller('Controller1');

ただし、それよりも少し先に進むことができるかどうか疑問に思いました。変更が必要な場合は、コントローラーをすべてうまくオーバーライドできますが、将来のコアの追加や修正は追加されない可能性があります。したがって、作成できる可能性があると思いました。ファイルのコピーを作成し、単一のメソッド呼び出しのみをオーバーライドします。私が言っていることの半例は次のとおりです。

class Override {

public function __call($method, $args) {
    return call_user_func_array(array('Something', $method), $args); 
}

public static function __callStatic($method, $args){
    return call_user_func_array(array('Something', $method), $args);
    }

}

// Core class
class Something {

    static function doTest() {
        echo "Class something <br/>";
    }

    static function doOtherTest() {
        echo "That works <br/>";
        self::doTest();
    }

}


// Overriding class - named differently for ease of example and reasons explained later
class SomethingElse extends Override {

    private static function doTest() {
        echo "Success <br/>";
    }

 }

 // Actual function calling
 SomethingElse::doTest();
 SomethingElse::doOtherTest();

一般的な考え方は、メソッドが元のクラスに存在しない場合は、「親」クラス(ここではハードコーディングされています)からアクションを実行することです。ただし、この方法には2つの問題があります。

  • クラスの名前が同じだと困ると思います
  • 親クラスが後で呼び出すメソッドをオーバーライドしようとすると、オーバーライドしようとしているメソッドではなく、独自のバージョンのメソッドが使用されます。
    • 「単純な」解決策は、組み合わせているすべてのメソッドをオーバーライドする必要があるということですが、後日さらに追加される可能性があります。

現在、ローダーを使用してフルクラスオーバーライドの初期ソリューションを実行しようとしています。これは機能し、それほど複雑ではありません。

ただし、StackOverflowの優れた頭脳の誰かが、メソッドオーバーライドのアイデアの問題に対処するのに役立つ可能性のある回答や設定を知っているのではないかと思いました-スケルトンですが、既存のシステム設定で作業していることを覚えておいてください構造のアイデアは、変更されたものを何らかの形で「制御」するために実装しようとしているものです。理想的には、誰かがメソッドなどをオーバーライドしたい場合、コア内の何も変更されません(少なくともそれほどではありません)。

4

2 に答える 2

3

さて、私たちはちょうどそれを解決しました。特徴です!

しかし、真剣に、バージョン管理されたコードをトレイトに変換し、上記の構造のバージョン管理されていないファイルでそれらを呼び出すことによって。これにより、ローダークラスやその他の衝突防止レイヤーの必要性がなくなり、クライアントごとのカスタムコードに影響を与えることなく、コアコードを更新、テスト、コミットできるようになります。

于 2012-12-21T11:04:11.770 に答える
1

厳密なOOの種類のソリューションは、コントローラーを抽象的なインターフェイスとして広めることです。これは、いくつかの異なる実世界のアプローチで実装でき、継承の原則を超えた構成によってまとめることができます。

私が理解しているように、あなたはここにあなたがオーバーライドまたは拡張しようとしている既存のコードを持っています。PHPバージョンでTraitsを使用できる場合は、これも役立つ可能性があります。

PHP 5.4:クラスが異なるシグネチャでトレイトメソッドをオーバーライドできるのはなぜですか?

于 2012-12-20T13:13:23.047 に答える