0

データベース テーブル構造の概要を示すクラスや、アプリケーションの構成の概要を示すクラスなど、プログラムの実行中に状態がまったく変化しないクラスがいくつかあります。私は現在、これらのクラスをシングルトンとして持っており、情報を取得したいクラスはクラス インスタンスを要求し (たとえば、一般的な getInstance() メソッドから)、必要な情報を取得します。これは機能しますが、構成に関してはより多くのモジュール性を許可することを望んでいましたが、これが私が立ち往生しているところです。

私の主な目標は、コードの読みやすさを維持しながら、モジュラー構成で簡単にデバッグできるようにすることです。構成設定を使用するクラスが適切な構成インスタンスを取得できるYet Another Singleton(tm)を含めずに、デバッグのために構成を交換する機能をどのように許可するかはわかりません。

これは PHP Web アプリケーション用ですが、ソリューションが言語に依存しない可能性が高いと推測しているため、そのようにタグ付けされていません。

編集:私の質問への回答に関する限り、依存性注入が私の空想をくすぐっていますが、私の質問を明確にするために、(おそらく単純化しすぎた)例を提供させてください。

Configシングルトンで識別された接続情報を単純に使用するPHPのMysqliクラスのラッパーがあるとしましょう...

class Mysql {
    // ...
    private $mysqli;

    public function __construct() {
        $conf = Config::getInstance(); // Get the configuration
        $this->mysqli = new Mysqli(
            $conf->getHost(),
            $conf->getUsername(),
            $conf->getPassword()
        );
        // ...
    }
    // ...
}

この例では、Mysql クラスは Config に含まれている設定のみを受け入れ、Config に含まれている設定以外の設定を使用することはできません。この例では、単にホスト/ユーザー名/パスワード/その他のものをコンストラクターに貼り付ける方が理にかなっているかもしれませんが、Mysql クラスを使用して構成シングルトンから取得するクライアントに当てはまり、多くの場合に問題が再び現れます。より多くのクラス。最終的には常に Config から依存関係を取得するため、この設定でさまざまな設定を簡単に試すことはできません。

ここのすばらしいコメントを含むいくつかの場所で読んだことから、依存性注入が私の最善の策であるように思えます。将来の読者のために、PHP に関する依存性注入に関する 1 つの素晴らしい記事を見つけまし

4

1 に答える 1

1

これは、依存性注入の主要な教訓です。アイデアは、実行時にクラスの 1 つのインスタンスを注入することです。テスト中に、同じインターフェースを持つ別のものを注入します。これは、ダミー クラス、モック オブジェクト、または期待される状態でテストによって作成された通常のインスタンスである可能性があります。

于 2009-01-14T04:23:46.480 に答える