web-dev-qa-db-fra.com

Qu'est-ce que SOLID Principes est-ce que je brise ce code?

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?

2
NoName

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.

1
Martin Maat

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.

1
Ryathal