-2

あるプロセスでオブジェクトを受け取りましたが、このオブジェクトはその配色を理解する必要があります。たとえば、次のように保存されている配色があります。

class FirstScheme {
    public static $COLORS = array('1' => 'green', '2' => 'red', ...);
}
class SecondScheme {
    public static $COLORS = array('1' => 'red', '2' => 'green', ...);
}

事前にすべての配色スキームの名前を知っています。コードが変更された場合にのみ変更できます。ただし、各オブジェクトに使用される配色は、実行時にこのオブジェクトの属性を照合して決定する必要があります。

そして、ここで私は何をすべきかわかりません。Pythonでは、配色から名前へのマッピングを保持する dict を次のように定義します。

d = {'attr_value1': FirstScheme, 'attr_value2': SecondScheme, 'attr_value3': FirstScheme, ...}

そして、すべてのクラスに必要なため、「COLORS」変数にアクセスするだけです。しかし、PHP ではそのような方法でクラスを参照する方法はありません。複数の属性を同じ配色スキームにマップできることに注意してください。

4

3 に答える 3

2

すべてのクラスに色が必要な場合は、色を取得できるインターフェイスを定義します。

interface ColorsProvider {
    function getColors();
}
class FirstScheme implements ColorsProvider {
    public static COLORS = array('1' => 'green', '2' => 'red', ...);

    public function getColors() {
        return self::COLORS;
    }
}
class SecondScheme implements ColorsProvider {
    public static COLORS = array('1' => 'red', '2' => 'green', ...);

    public function getColors() {
        return self::COLORS;
    }
}

次に、Yout パラメータのスタックがある場所:

$a = array(
  'attr_value1' => new FirstScheme(),
  'attr_value2' => new SecondScheme(),
);

あなたは呼び出すことができます:

$param = 'attr_value1';

if(!isset($a[$param]))
    throw new Exception("undefined param");

if(!($a[$param] instanceof ColorsProvider))
    throw new Exception("Param should point to ColorsProvider");

$a[$param]->getColors();

完全客観的であることをご了承ください。PHP では、この効果を得るためのより簡単な方法がありますが、私の解決策は単純です。


もう1つのポイントは、インターフェイスが色のソースを完全に分離していることです。ファイル、データベース、xml、ハードコードなどからのものがあります。


デフォルトの実装は次のようになります。

abstract class DefaultColorsProviderImpl implements ColorsProvider             {
    protected static COLORS = array();

    public function getColors() {
        return self::COLORS;
    }
}

class FirstScheme extends DefaultColorsProviderImpl {
    protected static COLORS = array( ... );
}

ただし、ファイルの ex から色を返す一般的な実装を作成することはできます。

于 2013-05-25T11:54:41.400 に答える
1

もちろん、次のことができます。

$schemes = [
  'attr_value1' => FirstScheme::$COLORS,
  'attr_value2' => SecondScheme::$COLORS,
  ...
];

または実行時でも:

$schemes = [
  'attr_value1' => 'FirstScheme',
  'attr_value2' => 'SecondScheme',
  ...
];

その後:

$reflector = new ReflectionClass($schemes['attr_value1']);
$schema = $reflector->getStaticPropertyValue('COLORS');

しかし、これはまったく保守可能ではないようで、そのような情報をクラスの静的フィールドとしてハードコーディングせずに、適切なデータ層に格納したいと考えています [これは目的ではありません]。

于 2013-05-25T11:57:12.667 に答える
1

独自のクラスで色をハードコーディングする代わりに、次のアプローチがあります。

class ColorScheme {

   protected $colors;

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

   public function getColors() {
       return $this->colors;
   }

}

$scheme1 = new ColorScheme(array('red', 'blue', 'green'));
$scheme2 = new ColorScheme(array('yellow', 'pink', 'cyan'));

PHP の Python 辞書に相当するものは、連想配列です。だからあなたはこれを行うことができます:

$d = array (
    'values_1' => $scheme1->getColors(),
    'values_2' => $scheme2->getColors()
);
于 2013-05-25T11:54:26.280 に答える