2017-10-18 3 views
2

Le code suivant viole-t-il un principe/modèle de POO?La vérification de l'implémentation de l'interface dans une classe abstraite est-elle un anti-pattern?

En particulier, je suis intéressé par le instanceof chèque à l'intérieur du véhicule :: whatCanDo() méthode, qui contrôle si une sous-classe implents une interface spécifique. À première vue, cela semble aller à l'encontre du principe de Liskov, mais ce n'est pas le cas, car les classes avion et voiture sont toujours interchangeables.

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 { 
} 

Répondre

3

Si vous faites référence à SOLID, cela enfreint le principe ouvert/fermé. Si vous devez ajouter une nouvelle sous-classe, vous devrez modifier la superclasse et provoquer indirectement toutes les autres sous-classes.

Il semble également étrange qu'une instance teste quel type il est. Cela traverse le même champ de mines que les "méthodes d'usine" et pourrait être considéré comme constituant une violation du principe de responsabilité unique.

Et c'est juste un mauvais code en général, puisque vous avez une super-classe, qui écrit dans le tampon de sortie (utilise echo).

+1

Nous pourrions supposer que l'écho est juste par exemple, je suppose –

+1

@RobbieAverill difficile à dire. J'ai vu beaucoup trop de gens ayant des échos dans leur code 'class'. Fondamentalement, chaque troisième wrapper PDO (ce qui aurait effectivement besoin d'une diatribe séparée) sur StackOverflow le fait. –

+0

@ tereško l'écho c'est juste par exemple, aussi les noms de classes sont des samples, mon vrai code est différent. – g4b0