Permettez-moi de commencer en disant que je parle ici principalement de l'accès aux méthodes et, dans une moindre mesure, du marquage des classes comme finales, et non de l' accès des membres.
La vieille sagesse
»
avait du sens à l'époque où il a été écrit, avant que l'open source ne domine l'espace des bibliothèques de développeurs et la gestion des VCS / dépendances. est devenu hyper collaboratif grâce à Github, Maven, etc. À l'époque, il y avait aussi de l'argent à gagner en limitant la ou les façons dont une bibliothèque pouvait être utilisée. J'ai passé probablement les 8 ou 9 premières années de ma carrière à adhérer strictement à cette «meilleure pratique».
Aujourd'hui, je pense que c'est un mauvais conseil. Parfois, il y a un argument raisonnable pour marquer une méthode comme privée ou une classe finale, mais c'est extrêmement rare, et même dans ce cas, cela n'améliore probablement rien.
As-tu déjà:
- Vous avez été déçu, surpris ou blessé par une bibliothèque, etc. qui avait un bogue qui aurait pu être corrigé avec l'héritage et quelques lignes de code, mais en raison de méthodes privées / finales et les classes ont été obligées d'attendre un correctif officiel qui pourrait ne jamais venir? J'ai.
- Vous vouliez utiliser une bibliothèque pour un cas d'utilisation légèrement différent de celui imaginé par les auteurs, mais vous n'avez pas pu le faire en raison de méthodes et de classes privées / finales? J'ai.
- Vous avez été déçu, surpris ou blessé par une bibliothèque, etc. trop permissive dans son extensibilité? Je n'ai pas.
Voici les trois plus grandes rationalisations que j'ai entendues pour le marquage des méthodes privées par défaut:
Rationalisation n ° 1: ce n'est pas sûr et il n'y a aucune raison de remplacer une méthode spécifique
Je ne peux pas compter le nombre de fois où je me suis trompé sur la nécessité ou non de remplacer une méthode spécifique que j'ai écrite. Ayant travaillé sur plusieurs bibliothèques open source populaires, j'ai appris à mes dépens le coût réel du marquage des choses privées. Il élimine souvent la seule solution pratique aux problèmes imprévus ou aux cas d'utilisation. À l'inverse, je n'ai jamais, en plus de 16 ans de développement professionnel, regretté d'avoir marqué une méthode protégée au lieu de privée pour des raisons liées à la sécurité des 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. période. Si c'est dangereux, notez-le dans la classe / méthode Javadocs, ne vous contentez pas de claquer aveuglément la porte.
Les méthodes de marquage protégées par défaut sont une atténuation pour l'un des problèmes majeurs du développement de logiciels modernes: l'échec de l'imagination.
Rationalisation n ° 2: elle garde les API / Javadocs publiques propres
Celui-ci est plus raisonnable, et en fonction du public cible, cela peut même être la bonne chose à faire, mais cela vaut la peine de considérer le coût de maintien de l'API "propre": l'extensibilité. Pour les raisons mentionnées ci-dessus, il est probablement plus judicieux de marquer les éléments protégés par défaut au cas où.
Rationalisation n ° 3: Mon logiciel est commercial et je dois limiter son utilisation.
C'est également raisonnable, mais en tant que consommateur, j'irais avec le concurrent le moins restrictif (en supposant qu'il n'y ait pas de différences de qualité significatives) à chaque fois.
Ne jamais dire jamais
Je ne dis pas de ne jamais marquer les méthodes comme privées. Je dis que la meilleure règle de base est de "rendre les méthodes protégées à moins qu'il n'y ait une bonne raison de ne pas le faire".
Ce conseil est le mieux adapté pour ceux qui travaillent sur des bibliothèques ou des projets à plus grande échelle qui ont été divisés en modules. Pour les projets plus petits ou plus monolithiques, cela n'a pas autant d'importance car vous contrôlez tout le code de toute façon et il est facile de changer le niveau d'accès de votre code si / quand vous en avez besoin. Même dans ce cas, je donnerais toujours le même conseil :-)