Wikipédia dit
"les entités logicielles (classes, modules, fonctions, etc.) devraient être ouvertes pour l'extension, mais fermées pour la modification"
Le mot fonctions a attiré mon attention, et je me demande maintenant si nous pouvons supposer que la création d'une surcharge pour une méthode peut être considérée comme un exemple du principe ouvert / fermé ou non?
Permettez-moi d'expliquer un exemple. Considérez que vous avez une méthode dans votre couche de service, qui est utilisée dans près de 1000 emplacements. La méthode obtient userId et détermine si l'utilisateur est administrateur ou non:
bool IsAdmin(userId)
Considérez maintenant que quelque part, il est nécessaire de déterminer si l'utilisateur est administrateur ou non, en fonction du nom d'utilisateur et non de l'ID utilisateur. Si nous changeons la signature de la méthode mentionnée ci-dessus, alors nous avons cassé le code à 1000 endroits (les fonctions devraient être fermées à la modification). Ainsi, nous pouvons créer une surcharge pour obtenir le nom d'utilisateur, trouver l'ID utilisateur basé sur le nom d'utilisateur et la méthode d'origine:
public bool IsAdmin(string username)
{
int userId = UserManager.GetUser(username).Id;
return IsAdmin(userId);
}
De cette façon, nous avons étendu notre fonction en créant une surcharge pour elle (les fonctions doivent être ouvertes à l'extension).
Est-ce un exemple de principe ouvert / fermé?
la source
En surchargeant votre méthode, vous étendez les fonctionnalités du module existant, répondant ainsi aux nouveaux besoins de votre application
Vous n'apportez aucune modification à une méthode existante, vous ne violez donc pas la deuxième règle.
Je serais intéressé d'entendre ce que les autres ont à dire concernant l'interdiction de changer la méthode d'origine. Oui, vous pouvez mettre des modificateurs d'accès appropriés et appliquer l'encapsulation, mais que faire d'autre?
Réf: http://www.objectmentor.com/resources/articles/ocp.pdf
la source
Le principe ouvert-fermé est un objectif, un cas idéal, pas toujours une réalité. En particulier lorsque vous cherchez à refactoriser l'ancien code, la première étape est souvent une modification lourde afin de rendre l'OCP possible. La racine du principe est que le code de travail fonctionne déjà et que la modification introduit éventuellement des bogues. Par conséquent, le meilleur scénario n'est pas de modifier le code existant, mais simplement d'ajouter un nouveau code.
Mais disons que vous aviez une fonction appelée
BigContrivedMethod(int1, int2, string1)
.BigContrivedMethod
fait trois choses: chose1, chose2 et chose3. À ce stade, la réutilisation de BCM est probablement difficile, car elle en fait trop. Le refactoriser (si possible) enContrivedFunction1(int)
,ContrivedFunction2(int)
etContrivedFunction3(string)
vous donne trois méthodes plus petites et plus ciblées que vous pouvez combiner plus facilement.Et c'est la clé de l'OCP en ce qui concerne les méthodes / fonctions: la composition. Vous "étendez" les fonctions en les appelant à partir d'autres fonctions.
N'oubliez pas que l'OCP fait partie de 5 autres principes, les directives SOLID. Cette première est la clé, la responsabilité unique. Si tout dans votre base de code ne faisait que la seule chose spécifique qu'il devait faire, vous n'auriez jamais besoin de modifier le code. Il vous suffirait d'ajouter du nouveau code ou de combiner l'ancien code ensemble de nouvelles façons. Étant donné que le vrai code respecte rarement cette directive, vous devez souvent le modifier pour obtenir SRP avant de pouvoir obtenir OCP.
la source
Vous suivez le principe ouvert-fermé si vous modifiez le comportement de votre programme en écrivant du nouveau code plutôt qu'en modifiant l'ancien code.
Comme il est quasiment impossible d'écrire du code ouvert à tous les changements possibles (et vous ne le souhaitez pas car vous entrez dans la paralysie de l'analyse), vous écrivez du code qui répond à tous les comportements différents sur lesquels vous travaillez actuellement par extension plutôt que par modification.
Lorsque vous rencontrez quelque chose que vous devez changer, au lieu de simplement modifier quelque chose pour autoriser le nouveau comportement, vous déterminez quel est le point de changement, restructurez votre programme sans modifier son comportement afin de pouvoir ensuite modifier ce comportement en écrivant un nouveau code .
Alors, comment cela s'applique à votre cas:
Si vous ajoutez de nouvelles fonctions à votre classe, votre classe n'est pas ouverte / fermée, mais les clients de la fonction que vous surchargez le sont.
Si vous ajoutez simplement de nouvelles fonctions qui fonctionnent SUR votre classe, alors elle et les clients de votre fonction sont ouverts / fermés.
la source