Une des premières choses que je fais quand je sous-classe une classe est de changer un tas de méthodes privées en protégées
Quelques raisonnements sur les méthodesprivate
vs :protected
private
méthodes empêchent la réutilisation du code. Une sous-classe ne peut pas utiliser le code dans la méthode privée et peut être amenée à le réimplémenter - ou à réimplémenter la ou les méthodes qui dépendent à l'origine de la méthode privée & c.
Par ailleurs, toute méthode qui ne le serait pasprivate
peut être vue comme une API fournie par "" au monde extérieur ", en ce sens que les sous-classes tierces sont également considérées comme" monde extérieur ", comme quelqu'un d'autre l'a suggéré dans sa réponse. déjà.
Est-ce une mauvaise chose? - Je ne pense pas.
Bien sûr, une API (pseudo-) publique verrouille le programmeur d'origine et empêche le refactoring de ces interfaces. Mais à l'inverse, pourquoi un programmeur ne devrait-il pas concevoir ses propres "détails d'implémentation" d'une manière aussi propre et stable que son API publique? Devrait-il utiliser private
pour qu'il puisse être négligent dans la structuration de son code "privé"? Pensant peut-être qu'il pourrait le nettoyer plus tard, parce que personne ne le remarquera? - Non.
Le programmeur devrait également réfléchir un peu à son code "privé" afin de le structurer de manière à permettre ou même de promouvoir la réutilisation de la plus grande partie possible. Ensuite, les parties non privées risquent de ne plus devenir un fardeau dans le futur que certains le craignent.
Beaucoup de code (cadre) Je vois adopte une utilisation incohérente de private
: protected
, les méthodes non-finales qui ne peine quelque chose de plus que de déléguer à une méthode privée trouve couramment. protected
, méthodes non finales dont le contrat ne peut être rempli qu’avec un accès direct à des champs privés.
Ces méthodes ne peuvent pas être logiquement surchargées / améliorées, bien que techniquement, rien ne la rende évidente (pour le compilateur).
Vous voulez l'extensibilité et l'héritage? Ne faites pas vos méthodes private
.
Vous ne voulez pas que certains comportements de votre classe soient modifiés? Faites vos méthodes final
.
Vous ne pouvez vraiment pas appeler votre méthode en dehors d’un certain contexte bien défini? Rendez votre méthode private
et / ou réfléchissez à la manière dont vous pouvez rendre le contexte bien défini requis disponible pour une réutilisation via une autre protected
méthode d'encapsulation.
C'est pourquoi je préconise une utilisation private
modérée. Et à ne pas confondre private
avec final
. - Si la mise en œuvre d'une méthode est vitale pour le contrat général de la classe et qu'elle ne doit donc pas être remplacée / annulée, faites-la final
!
Pour les champs, ce private
n'est pas vraiment mauvais. Tant que le (s) champ (s) peuvent être raisonnablement "utilisés" via des méthodes appropriées (ce n'est pas getXX()
ou setXX()
!).