Accesseurs vs membres du public

J’ai une classe avec beaucoup de membres de type intégrés avec un access en lecture / écriture. Devrais-je en faire des membres publics et fournir des méthodes get / set pour chacun? Qu’en est-il des structures?

S’il y a des invariants que vous devez conserver, alors oui. Sinon, ne vous embêtez pas.

La raison d’avoir des accesseurs (getters) et des modificateurs (setters) est de vous fournir un niveau supplémentaire d’indirection.

Ce niveau supplémentaire d’indirection vous permet de fournir une vue en lecture seule de votre variable à une interface publique, sans permettre à votre membre de données d’être modifié. Vous pouvez toujours utiliser un passeur privé ou protégé.

Les setters vous permettent de vérifier les erreurs, de valider et de corriger les erreurs quand une valeur est définie. Par exemple, setDirectory (const std :: ssortingng & strPath), vous pouvez vous assurer qu’il existe une barre oblique de fin si l’utilisateur n’en a pas spécifié. Cela garantit que votre état de classe sera toujours valide.

Les accesseurs peuvent également empêcher vos membres de les exposer afin de leur permettre d’être dirigés vers eux. En n’autorisant pas les pointeurs sur l’extérieur, vous pouvez vous assurer que si votre object sort de la scope, cela ne provoquera pas de blocage.

Le niveau supplémentaire d’indirection pour les getters / setters vous permet également de pouvoir modifier le membre de données qu’ils encapsulent.

Avec un getter, vous pouvez également obtenir différentes vues de vos données, par exemple: getMinutes, lorsque votre membre de données est réellement stocké en quelques secondes.

Ce n’est pas la raison pour les utiliser, mais un effet secondaire intéressant de l’utilisation des getters et des setters est que vous pouvez définir un point d’arrêt à l’intérieur de votre modificateur, par exemple pour voir exactement quand il est modifié.

Que vous les utilisiez ou non, le jugement dépend de vos besoins. Si vous avez tellement de membres qu’il est très pénible de fournir des accesseurs et des parameters, vous pouvez envisager de stocker les membres de données dans une structure et d’utiliser cette structure dans votre classe. Vous pouvez même fournir des getters / setters pour un object pour l’ensemble de la structure à la fois.

Premièrement, si votre classe a beaucoup de données, elle n’est probablement pas bien conçue. Vous devrez peut-être envisager de le scinder en plusieurs classes ou de stocker les données dans des structures telles que des cartes.

En ce qui concerne la fourniture d’accesseurs, la question est de savoir si vous souhaitez modifier l’access, éventuellement l’empêcher. Si la réponse est oui, alors vous avez besoin de fonctions d’access. D’autre part, si votre classe n’est en réalité qu’un sac de bits, sans comportement, faites-en une structure.

Vous devez utiliser uniquement des membres publics

  • dans les structures, que vous n’exposez pas au code client (par exemple, les foncteurs de type bind) – il est inutile de protéger des structures que personne ne pourra jamais obtenir à l’extérieur
  • si leurs types encapsulent la logique de leur définition / obtention (par exemple, si vous créez une classe ObservableAtsortingbute)
  • si ce sont des membres constants dans une structure immuable (vous ne pouvez pas faire grand chose sauf les lire s’ils sont immuables)

Si vous créez un membre de données public, vous devez vous assurer que sa valeur est parfaitement orthogonale par rapport aux autres membres de la classe. Par exemple, vous désactivez les possibilités futures de

  • observer les changements chez le membre
  • faire en sorte que le membre joue un rôle dans l’invariant de la classe
  • désactiver l’access au membre
  • changer l’implémentation du membre (par exemple, calculée, mise en cache ou stockée) si les performances en ont besoin

L’utilisation de méthodes get / set pour les membres de données privés / protégés est une mauvaise conception.

Cela fait que le code client dépend des détails d’implémentation de votre classe.

Les modifications de votre classe entraînent des modifications du code client.

Cependant, les méthodes get / set pour les membres publics peuvent être utilisées. Mais il est toujours bon de les éviter.