4 votes

La méthode Array.Add enfreint-elle la PSL ?

Array La classe met en œuvre IList qui possède une interface Add membre. Array.Add l'invocation lance NotSupportedException . S'agit-il d'une violation de la Le principe de substitution de Liskov ou Le principe de séparation des interfaces ou les deux ?

6voto

anaximander Points 2554

Il s'agit sans aucun doute d'une violation du principe de séparation des interfaces. Ce principe stipule que les composants ne doivent dépendre que des interfaces dont ils ont réellement besoin. Array met en œuvre IList mais n'a manifestement pas besoin ou ne veut pas de toutes les méthodes définies par IList parce qu'il choisit de lancer une exception pour expliquer qu'il ne prend pas en charge la fonction Add . En outre, tout ce qui a besoin d'un Array dispose désormais d'un IList même s'il n'a pas besoin de toutes ses méthodes (parce que tout ce qui veut un tableau ne se préoccupe manifestement pas de Add puisque cela ne fonctionne pas de toute façon). Ne pas supporter une opération que votre interface vous suggère d'implémenter est clairement une violation des PSI ; forcer un code consommateur à dépendre d'une interface alors qu'il n'en a pas besoin dans sa totalité est également une violation des PSI.

Le présent peut conduisent à une violation du principe de substitution de Liskov. Si le code dépend d'un IList Le FSL déclare qu'il devrait fonctionner correctement lorsqu'il est transmis. tous la mise en œuvre de IList . Toutefois, lorsqu'on lui transmet un Array ce code lèvera désormais une exception chaque fois qu'il essaiera d'appeler la fonction Add .

La question de savoir s'il s'agit d'une violation de la législation sur les droits de l'homme dépend de la façon dont vous considérez les exceptions en matière de droits de l'homme. Si vous considérez que les exceptions font partie du contrat attendu, alors tout va bien. La méthode est conforme à son contrat, et tout code qui appelle Add sans tenir compte de la possibilité d'une exception est fautif de ne pas l'avoir fait.

Si vous êtes plutôt d'avis que NotSupportedException est considéré comme une erreur ou un échec, il s'agit alors d'une violation manifeste du LSP. Personnellement, je trouve que les principes SOLID se soutiennent mutuellement et sont plus difficiles à traiter dans le vide, donc en utilisant le principe de ségrégation de l'interface comme sauvegarde, je dirais que l'interface dit "je peux faire ces choses", donc dire "en fait, je ne peux pas faire cette chose" est une erreur, et donc ne devrait probablement pas être considéré comme faisant partie d'un contrat valide. Si l'exception ne fait pas partie du contrat, alors il faut en lancer une, Array viole Add Il rompt donc le contrat du FSL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X