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 ?
Réponse
Trop de publicités?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.