Permettez-moi de préciser que je parle principalement de l'accès aux méthodes ici, et dans une moindre mesure, de marquer les classes finales, pas l'accès aux membres.
L'ancienne sagesse
"marquez-le privé à moins d'avoir une bonne raison de ne pas le faire"
avait du sens à l'époque où elle a été écrite, avant que l'open source ne domine l'espace des bibliothèques de développeurs et que la gestion des dépendances devienne hyper-collaborative grâce à Github, Maven, etc. À l'époque, il y avait aussi de l'argent à gagner en restreignant la manière dont une bibliothèque pouvait être utilisée. J'ai probablement passé les 8 ou 9 premières années de ma carrière à suivre strictement cette "meilleure pratique".
Aujourd'hui, je crois que c'est un mauvais conseil. Parfois, il peut y avoir un argument raisonnable pour marquer une méthode privée, ou une classe finale, mais c'est extrêmement rare, et même alors, cela ne va probablement pas améliorer grand-chose.
Avez-vous déjà :
- Été déçu, surpris ou blessé par une bibliothèque, etc., qui avait un bug qui aurait pu être corrigé avec l'héritage et quelques lignes de code, mais à cause de méthodes et classes privées/finales, vous avez dû attendre un correctif officiel qui pourrait ne jamais venir ? Moi si.
- Eu envie d'utiliser une bibliothèque pour un cas d'utilisation légèrement différent de celui imaginé par les auteurs mais n'avez pas pu le faire à cause des méthodes et classes privées/finales ? Moi si.
- Été déçu, surpris ou blessé par une bibliothèque, etc., qui était trop permissive dans son extensibilité ? Moi non.
Voici les trois plus grandes rationalisations que j'ai entendues pour marquer les méthodes comme privées par défaut :
Rationalisation #1 : C'est risqué et il n'y a aucune raison de remplacer une méthode spécifique
Je ne compte plus le nombre de fois où je me suis trompé sur la nécessité de remplacer une méthode spécifique que j'ai écrite. Ayant travaillé sur plusieurs libs open source populaires, j'ai appris à mes dépens le coût réel de marquer les choses comme privées. Cela élimine souvent la seule solution pratique aux problèmes ou cas d'utilisation imprévus. Au contraire, je n'ai jamais en 16+ années de développement professionnel regretté d'avoir marqué une méthode comme protégée plutôt que privée pour des raisons de sécurité de l'API. Lorsqu'un développeur choisit d'étendre une classe et de remplacer une méthode, il dit consciemment "Je sais ce que je fais." et pour des raisons de productivité, cela devrait suffire. Point. Si c'est dangereux, notez-le dans la Javadoc de la classe/méthode, ne fermez pas simplement aveuglément la porte.
Marquer les méthodes comme protégées par défaut est une atténuation pour l'un des principaux problèmes du développement logiciel moderne : l'échec de l'imagination.
Rationalisation #2 : Cela garde l'API publique / la Javadoc propre
Celle-ci est plus raisonnable, et en fonction du public cible, cela pourrait même être la bonne chose à faire, mais il faut considérer quel est le coût de maintenir l'API "propre" : l'extensibilité. Pour les raisons évoquées ci-dessus, il est probablement plus judicieux de marquer les choses comme protégées par défaut, au cas où.
Rationalisation #3 : Mon logiciel est commercial et j'ai besoin de restreindre son utilisation.
Cela est également raisonnable, mais en tant que consommateur, je choisirais toujours le concurrent moins restrictif (en supposant qu'il n'y ait pas de différences significatives de qualité).
Jamais dire jamais
Je ne dis pas de ne jamais marquer les méthodes comme privées. Je dis que la meilleure règle à suivre est de "rendre les méthodes protégées à moins d'avoir une bonne raison de ne pas le faire".
Ce conseil est mieux adapté aux personnes travaillant sur des bibliothèques ou des projets à plus grande échelle qui ont été divisés en modules. Pour des projets plus petits ou plus monolithiques, cela ne tend pas à avoir autant d'importance puisque vous contrôlez de toute façon tout le code et il est facile de changer le niveau d'accès de votre code si/n quand vous en avez besoin. Même dans ce cas, je donnerais toujours le même conseil :-)
34 votes
Est-ce que cela importe? Toute langue avec un support OOP a cette préoccupation. Je programme en PHP, mais je pense que la question s'applique à n'importe quelle langue supportant l'OOP.
2 votes
D'accord, juste pour savoir si vous aviez oublié de taguer. Maintenant je vois la balise oop.
0 votes
Je dois définir la visibilité (privée/publique/protégée) pour chaque propriété de la classe? Ou seulement certaines ont besoin d'avoir un type de visibilité? Si oui, comment décider quelle propriété doit avoir une visibilité définie en haut de la classe?
1 votes
De prime abord, la différence entre protégé et privé semble évidente. Utilisez protégé si les sous-classes utiliseront la méthode/variable, sinon utilisez privé. Plus précisément, si les sous-classes devaient redéfinir une variable privée très similaire dans la classe parent, simplement la rendre protégée.
0 votes
Il y a un autre spécificateur d'accès
internal
dans le langage C# qui restreint le niveau d'accès d'une classe ou de ses membres au sein d'une assembly physique. Cependant, je ne suis pas sûr de son support ou de quelque chose de similaire dans d'autres langages.