Meilleures pratiques pour l'utilisation publique, protégée, privée?

12

Est-il juste de dire que c'est une bonne pratique de tout régler par défaut privatelors du codage de quelque chose?

Et ensuite ne la mettre à niveau que protectedsi une sous-classe en a besoin, ou publicsi une autre classe en a besoin?

AJJ
la source
2
Si vous créez une API, vous devez anticiper les fonctionnalités dont un appelant peut avoir besoin. Ainsi, vous devrez réfléchir davantage à vos modificateurs d'accès. Cela dépend de qui utilise le code que vous écrivez.
user2023861

Réponses:

10

Réponse courte: Oui

Réponse plus longue:

Oui, mais cela ne doit pas être interprété comme une suggestion de commencer par écrire vos cours avec tout ce qui est privé; cette approche implique la conception de classes en se concentrant sur les détails de l'implémentation avant de s'installer sur une interface.

L'un des aspects les plus importants à considérer lors de la conception d'une classe est la manière dont elle sera utilisée; ce qui implique de réfléchir à vos méthodes publiques avant de commencer à penser aux détails privés / d'implémentation.

De plus, cette approche manque généralement de chances de se demander "Comment pourrais-je écrire un test unitaire pour cette classe?" - qui est une question importante à poser même si vous n'écrivez pas réellement de tests unitaires. (Connexes: "Quels sont les principes de conception qui favorisent le code testable?" )

Donc, une fois que vous avez défini l'interface publique, alors c'est une bonne idée de mettre par défaut le reste en privé car la plupart de ces informations seront généralement des détails d'implémentation granuleux qui ne concernent rien en dehors de la classe.

Ben Cottrell
la source
Donc, si je devais essayer de résumer ce que vous vous dites (pour voir si je comprends), c'est une bonne idée de penser à la place à l'interface publique en premier (c'est-à-dire comment cette classe est-elle réellement utilisée par le dehors pour commencer?) et ensuite rendre tout le reste privé?
AJJ
1
@ArukaJ Une bonne approche consiste à écrire du code qui utilisera vos classes avant de construire l'implémentation. Cela peut être un peu un problème de poulet ou d'oeuf jusqu'à ce que vous commenciez à écrire les tests unitaires en premier.
JimmyJames
1
@ArukaJ Globalement oui; ce qui au premier abord peut sembler plus difficile à faire, bien que, comme le mentionne JimmyJames, cela semble beaucoup plus intuitif lorsque vous écrivez des tests unitaires. Cela peut impliquer un état d'esprit légèrement différent, mais le but est de réfléchir plus attentivement à ce que représente votre classe et à quoi ressemblent vos entrées / sorties - dans l'ensemble, c'est juste une façon beaucoup plus "OO" de penser la conception; plus susceptibles d'entraîner des classes soigneusement encapsulées avec une cohésion élevée.
Ben Cottrell
Je me méfie d'utiliser des tests unitaires pour concevoir votre classe, car ce ne sont pas eux qui vont vraiment l'utiliser. Cependant, ils sont définitivement meilleurs que rien pour penser à la façon dont la classe sera utilisée.
user949300
8

"Et puis ne le mettre à niveau en protégé si une sous-classe en a besoin, ou public si une autre classe en a besoin?"

C'est la mauvaise approche. Au moment de la conception, vous devez savoir quel accès public vous souhaitez accorder. Habituellement, vous donnez accès au public parce que c'est tout le but de votre classe. Et vous donnez un accès protégé parce que vous voulez que les sous - classes accèdent aux choses. Et vous utilisez le privé pour des choses qui ne sont l'affaire de personne d'autre.

Maintenant, si quelqu'un a besoin d' accéder à des choses auxquelles il n'a pas accès, alors vous devriez réfléchir sérieusement à ce besoin . Ils ne devraient pas avoir besoin de cet accès, sinon votre conception est incorrecte. Peut-être que votre conception est fausse et que quelque chose n'est pas public qui devrait l'être, alors vous changez cela. Mais si votre conception est correcte, il y a quelque chose qui ne va pas avec le besoin , donc vous corrigez cela au lieu d'endommager votre conception.

gnasher729
la source
Disons que vous avez une classe que vous ne l' intention de sous - classe à ce moment (et peut - être jamais besoin de) et une méthode que si vous étiez à votre classe sous - classe, serait utile / nécessaire pour / par la sous - classe. Souhaitez-vous faire cette méthode privateou protected?
lfk
Devrait être la réponse acceptée, rendre tout privé au premier abord semble que je ne veux pas penser / concevoir.
Niing
1

La clé pour comprendre cet aspect de la programmation orientée objet est le concept d' encapsulation des données . L'idée est de rendre une classe plus facile à comprendre en masquant ses détails d'implémentation. C'est ce qu'on appelle la dissimulation des données . Ainsi, nous voulons seulement exposer (rendre public) les fonctions qui sont nécessaires pour utiliser la classe. Ces fonctions sont l' interface avec la classe.

Pensez à une interface comme la roue d'une voiture. Vous décidez dans quelle direction la voiture va en tournant la roue, mais sous les capots il y a des valves rotatives, l'hydraulique, des poulies qui changent la rotation de vos roues, mais vous n'avez pas besoin d'être un ingénieur en mécanique pour conduire une voiture.

La réponse à votre question est donc oui. Vous souhaitez masquer autant de détails sur une classe que possible dans d'autres classes. Comprendre quand quelque chose doit être public, privé ou protégé est facile à apprendre mais difficile à maîtriser.

Chris Ghyzel
la source