2011-01-02 13 views
1

私は、単純な暗号化と文字列を復号化するこの2つのクラスを書いた:ある私やりたい何2つのクラスを1つに使う:設計ミス?

 
Encode.php 

    class Encode { 
     protected funcion do_encode($string) { .. } 
    } 


Decode.php 

    class Decode { 
     protected funcion do_decode($string) { .. } 
    } 

を:

 
Encrypt.php 

    class Encrypt extends Encode, Decode { 
     protected $stuff_for_parents; 

     function __construct($configs) { 
      $this->stuff_for_parents = $configs['SomeConf']; 
     } 

     public function encode($string) { $this->do_encode($string); } 
     public function decode($string) { $this->do_decode($string); } 
    } 

しかし、我々はそう、複数のクラスを含めることはできません。失敗。
今質問があります:

  1. デザインに問題はありますか?このシナリオは私には奇妙に見えないのですから?
  2. 異なるクラスの両方の関数を使用する1つのオブジェクトを持つ別の方法はありますか?並べ替え$encrypt->encode($str);$encrypt->decode($str);
+2

私は最初から1つのクラスしか使用しません。 –

答えて

5

:しかし、あなたはおそらく欲しいの構図ではなく、継承です。例:

<? 
class Encrypt { 
    private $encoder; 
    private $decoder; 
    public function __construct() { 
    $this->encoder = new Encode(); 
    $this->decoder = new Decode(); 
    } 
    public function encode($string) { 
    return $this->encoder->encode($string); 
    } 
    public function decode($string) { 
    return $this->decoder->decode($string); 
    } 
} 
?> 

この例では、エンコードとデコードは具象クラスでなければなりません。しかし、代わりにインターフェースを使うことを検討したいかもしれません。異なる状況で異なるタイプのEncodeオブジェクトとDecodeオブジェクトを使用する必要があると思われる場合は、インターフェイスが便利です。たとえば、TripleDESEncodeクラスとBlowfishEncodeクラスがあるとします。その場合

<? 
interface IEncode { 
    public function encode($string); 
} 
class TripleDESEncode implements IEncode { 
    public function encode($string) {...} 
} 
class BlowfishEncode implements IEncode { 
    public function encode($string) {...} 
} 
?> 

は、あなたが最初に使用したい特定のインスタンスを作成する場合があり、その後、暗号化のコンストラクタに渡す:彼らはこのように、共通のインタフェースを実装することができます両方。これは依存性注入と呼ばれます。

<? 
class Encrypt { 
    public function __construct(IEncode $encoder, IDecode $decoder) { 
    $this->encoder = $encoder; 
    $this->decoder = $decoder; 
    } 
    ... 
} 

$myEncrypt = new Encrypt(new BlowfishEncode(), new BlowfishDecode()); 
echo $myEncrypt->encode('test'); 
?> 
+0

ああ、それは私が探していたヒントのようなものだった;)ありがとう! – eij

+0

また、私がこれをやっていたら、エンコードとデコードの両方のメソッド(IEncryptionAlgorithmなど)に単一のインターフェイス/オブジェクトを使用していると思います。一致しない暗号化と復号化メソッドの使用にはあまり意味がありません。 –

0

私は暗号化クラスの2つのメソッド/関数を作成する必要があると思います。それは非常に論理的です。

これは意味がありますが、プログラミング言語で許される方法で実行できます。エンコードのデコードは、暗号化クラスが実行する必要があるさまざまな機能であり、これらはメソッドでなければなりません。別々のクラスにあなたのアルゴリズムをカプセル化することには何も問題は(あなたがこれらを変更する柔軟性をご希望の場合は、実際に、それは特に、実行時に、良い習慣です)はありません

class Encrypt 
{ 
    protected $stuff_for_parents; 

    function __construct($configs) { 
     $this->stuff_for_parents = $configs['SomeConf']; 
    } 

    protected funcion encode($string) 
    { 
    } 

    protected funcion decode($string) 
    { 
    } 
} 
+0

これは単なる例ですが、分割して1つのクラスに参加させたいということは他にもいくつかあります。このように(この例の後に)、私は、SecurityStuffがEncodeを拡張するなど、別の拡張のためにそれを使用するかもしれません。しかし、私はちょうどパラノイアLOLを推測する – eij

+0

あなたは私も混乱してしまった:)しかし、我々はその方法すべての方法が自分のクラスになることができると思う場合。右? –

+0

ええ、それはかなりピッタだろう;)そのようなことをするより良い方法があればちょうど奉仕だった – eij

0

は次のように気にいらないですあなたはエンコードとデコードは別々のクラスになりたい場合は、暗号化内でそれらのインスタンスを作成することができます

class Encrypt { 
    private $encoder; 
    private $decoder; 
    protected $stuff_for_parents; 

    function __construct($configs, $encoder, $decoder) { 
     $this->stuff_for_parents = $configs['SomeConf']; 
     $this->encoder = $encoder; 
     $this->decoder = $decoder; 
    } 

    public function encode($string) { $this->encoder->do_encode($string); } 
    public function decode($string) { $this->decoder->do_decode($string); } 
} 
2

:私は書くでしょう

+0

私はすでにこのように書かれているので、それを書く方法を知っている。私の質問はより一般的です。それは、2つのクラスを1つにする必要があります(これはできません)。あるいはそれは理にかなっていますが、それを行う他の方法がありますか? – eij

関連する問題