13

Logger オブジェクトを挿入するサービスを開発していますが、2 種類のロガーを使用できます。syslog ロガーとキュー メッセージ システム ロガーを計画しています。これは可能ですか?

アイデアはインターフェースを持っています:

interface Loggable
{
    public function log() ;
}

およびそのインターフェイスを実装する 2 つのクラス:

class Syslogger implements Loggable
{
    public function log()
    {
        ...
    }
}

class QMSLogger implements Loggable
{
    public function log($queueName)
    {
        ...
    }
}

私ができる唯一の方法は、配列をパラメーターとして持ち、それをあるクラスで使用し、他のクラスでは使用しないことです...しかし、それは少し臭いです:P

4

4 に答える 4

21

あなたはそれが可能かどうか尋ねています: はい、可能ですが…</p>

インターフェイスを実装する場合は、その契約を尊重する必要があります。

interface Loggable
{
    public function log();
}

このインターフェースのコントラクトは、パラメーターなしで呼び出すことができるというlog()ことです。

それを尊重するために、パラメーターをオプションにすることができます。

class QMSLogger implements Loggable
{
    public function log($queueName = null)
    {
        ...
    }
}

これは完全に有効な PHPであり、Liskov Substitution Principle を尊重しています。もちろん、interface に対してコーディングするときにそのオプションのパラメーターを使用してはなりません。使用しないと、明らかにインターフェイスが壊れます。このようなパラメータは、実装を使用している場合にのみ役立ちます (たとえば、 に密結合されているコードの一部QMSLogger)。

ただし、これはおそらく$queueName構成値のように見えるため、問題の解決策ではなく、クラスのコンストラクターで渡す方がよい場合があります(他の回答で説明されているように)。

于 2015-10-13T19:45:18.117 に答える
18

コメントで述べたように、それは同じインターフェイスではありません。考えられるすべてのロガー実装でインターフェイスを一般化できない場合は、構成の違いをインスタンス コンストラクターの一部にします。

class QMSLogger implements Loggable {

    protected $queueName;

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

    public function log() {
        ...
    }

}
于 2012-12-20T10:46:51.003 に答える
1

パラメータを配列として渡すこともできます。このようにして、一方からコントラクトを尊重し、配列内に任意の量の値を柔軟に挿入できます。これを確認してください。

abstract class FeaturesAbstract
{
    /**
     * @param array $paramsArray
     *
     * @return mixed
     */
    abstract public function addExecute($paramsArray);
}

そして、実際にこのメソッドを使用するには、次のようにパラメーターを送信できます。

$this->abstract->addExecute(array('paramA' => $paramA, 'paramB' =>  $paramB));

そして、具体的な実装内で、次のようなパラメーターを取得します。

    /**
     * @param array $paramsArray
     *
     * @return void
     */
    public function addExecute($paramsArray) 
    {
        $a = $paramsArray['paramA'];
        $b = $paramsArray['paramB'];
        $c = ...
    }

幸運を :)

于 2016-10-07T13:32:25.057 に答える