2017-10-18 17 views
2

次のコードは、いくつかのOOPの原則/パターンに違反していますか?特に抽象クラス内のインタフェース実装のチェックはアンチパターンですか?

Iは、車内 instanceofのチェックに興味:: whatCanDo()メソッド、サブクラスが特定のインターフェイスをimplents場合にチェック。

一見、リスコフの原則に違反しているように見えますが、実際には飛行機と車のクラスは交換可能であるため、実際にはそうではありません。

abstract class Vehicle { 

    public function whatCanDo() { 
    if ($this instanceof CanFly) { 
     echo "can fly"; 
    } 
    } 

} 

interface CanFly { 
} 

class Airplane extends Vehicle implements CanFly { 
} 

class Car extends Vehicle { 
} 

答えて

3

SOLIDを指している場合は、オープン/クローズの原則に違反します。新しいサブクラスを追加する必要がある場合は、スーパークラスを変更する必要があり、実際に間接的に他のすべてのサブクラスを変更する必要があります。

インスタンスがどのタイプのものであるかをテストすることも奇妙に思えます。それは「工場の方法」と同じ地雷畑を横断し、単一の責任原則違反を構成すると主張することができます。

あなたはスーパークラスを持っているので、出力バッファ(echoを使用)に書き込みます。

+1

私は、エコーがちょうど例であると推測することができました。私は –

+1

@RobbieAverillは難しいと思います。私は、クラスのコードにエコーを持つ人が非常に多くの人を見てきました。基本的に、StackOverflowで3番目ごとのPDOラッパー(これは実際には別の暴言が必要になります)を行います。 –

+0

@tereškoエコーそれはちょうど例です、クラス名もサンプルです、私の実際のコードは異なります。 – g4b0

関連する問題