Avec le pseudo-code ci-dessous? Suis-je casse-t-il SOLID Principes?
interface i_pet
string get_name()
string get_species()
color get_fur_color()
end interface
interface i_cat implements i_pet
end interface
interface i_fish implements i_pet
bool get_is_fresh_water()
end interface
class cat implements i_cat
string name
string species
color fur_color
cat(string name, string species, color fur_color):
this.name = name
this.species = species
this.fur_color = fur color
string get_species():
return species
string get_name():
return name
color get_fur_color:
return fur_color
end class
class fish implements i_fish
string name
string species
bool is_fresh_water
string get_species():
return species
string get_name():
return name
color get_fur_color():
throw exception
bool get_is_fresh_water():
return is_fresh_water
end class
class pet_printer
print_pet_name(i_pet pet):
print pet.get_name()
print_fur_color(i_pet pet):
print pet.get_fur_color()
print_pet_species(i_pet pet):
print pet.get_species()
print_pet_type(i_pet pet):
switch type of pet:
case i_fish:
print "Fish";
case i_cat:
print "Cat";
default:
print "Unkown";
end switch
end class
Je pense que je brise le Interface segregation principle
avec i_pet avoir get_fur_color
Mais je ne peux pas identifier d'autres problèmes?
Vous enfreignez le fournisseur de services Internet mais pas tant à cause d'une méthode hors de lieu.
L'idée derrière le fournisseur de services Internet est de garder des interfaces petites, ce qui signifie vraiment qu'ils devraient définir un seul aspect comportemental. Cela implique que ICAT et IFISH sont sous-optimaux et inutiles d'une perspective ISP.
Au lieu de icat, vous devriez avoir des interfaces comme Iscrattre, iJumper, imeaetager et mettre en œuvre ceux de chat.
Au lieu d'Ifish, vous devriez avoir Iswimmer et IunderwaterBeather.
Comme écrit, vous rompez le principe de substitution de Liskov et principe de ségrégation d'interface. Tout ce qui implémente i_pet doit pouvoir être substitué sans rien ne rien briser. La classe de poisson provoque que cela échoue avec GET_FUR_COLOR () non mis en œuvre. En outre, le PET_PRINTER est en train de casser le problème ouvert principe fermé Le problème ici est si le nom imprimé pour les changements de poisson ou de CAT, cette classe non liée doit également modifier, et si le chien est ajouté, il doit être modifié à nouveau. L'interface vide de I_CAT est un exemple de violation de la [~ # ~ # ~] [~ # ~ ~] principe, ce qui pourrait entraîner des problèmes supplémentaires si l'interface est naïvement mise en œuvre ou modifiée.
La correction du premier problème peut être aussi simple que de modifier un nom de méthode à getcolor () qui est plus général et peut fonctionner avec n'importe quel animal de compagnie. La classe de couleurs serait responsable de la manière de gérer les couleurs primaires et secondaires si cette partie devient pertinente. Pour résoudre le problème avec la classe d'imprimante PET, le type peut devenir une chaîne en lecture seule qui fait partie de l'interface I_PET qui peut simplement être renvoyée par une méthode getType (). Cela aide non seulement à résoudre le problème avec le principe ouvert fermé, il suit ne pas demander que chaque implémentation indique maintenant son propre type au lieu d'un objet extérieur posant et d'agir sur cette information.