Cette question de savoir quand utiliser privé et quand utiliser protégé en classe m'a fait réfléchir. (Je vais également étendre cette question aux classes et méthodes finales, car elles sont liées. Je programme en Java, mais je pense que cela s'applique à tous les langages POO)
Une bonne règle est de rendre tout aussi privé que possible.
- Rendez toutes les classes finales, sauf si vous devez les sous-classer immédiatement.
- Définissez toutes les méthodes comme définitives, sauf si vous devez les sous-classer et les remplacer immédiatement.
- Rendez tous les paramètres de méthode définitifs, sauf si vous devez les modifier dans le corps de la méthode, ce qui est un peu gênant la plupart du temps de toute façon.
C'est assez simple et clair, mais que faire si j'écris principalement des bibliothèques (Open Source sur GitHub) au lieu d'applications?
Je pourrais nommer beaucoup de bibliothèques et de situations, où
- Une bibliothèque s'est agrandie d'une manière à laquelle les développeurs n'auraient jamais pensé
- Cela devait être fait avec "class loader magic" et d'autres hacks à cause des contraintes de visibilité
- Les bibliothèques ont été utilisées d'une manière pour laquelle elles n'étaient pas conçues et la fonctionnalité requise a été "piratée" dans
- Les bibliothèques n'ont pas pu être utilisées en raison d'un petit problème (bogue, fonctionnalité manquante, comportement "incorrect") qui n'a pas pu être modifié en raison d'une visibilité réduite
- Un problème qui n'a pas pu être résolu a conduit à des solutions de contournement énormes, laides et boguées où le remplacement d'une fonction simple (qui était privée ou finale) aurait pu aider
Et j'ai commencé à les nommer jusqu'à ce que la question devienne trop longue et j'ai décidé de les supprimer.
J'aime l'idée de ne pas avoir plus de code que nécessaire, plus de visibilité que nécessaire, plus d'abstraction que nécessaire. Et cela pourrait fonctionner lors de l'écriture d'une application pour l'utilisateur final, où le code n'est utilisé que par ceux qui l'écrivent. Mais comment cela peut-il tenir si le code est destiné à être utilisé par d'autres développeurs, où il est improbable que le développeur d'origine ait pensé à tous les cas d'utilisation possibles à l'avance et que les modifications / refactors soient difficiles / impossibles à faire?
Étant donné que les grandes bibliothèques open source ne sont pas une nouveauté, quelle est la façon la plus courante de gérer la visibilité dans de tels projets avec des langages orientés objet?