web-dev-qa-db-fra.com

Une classe devrait-elle fournir des mutateurs publics pour tous ses domaines privés?

Je travaille sur le refactoring an Java Application basé sur un audit de distribution. L'un des critères indique que

À respecter OO concepts d'encapsulation, des champs privés doivent toujours être accessibles via des accesseurs

Jusqu'ici tout va bien. Cependant, l'audit met en évidence tous les champs privés de la classe qui n'ont aucun mutateur, quelle que soit leur utilisation.

Dans mon cas, ces champs ne sont accessibles que de l'intérieur de la classe.

Je pourrais fournir des accesseurs privés pour tous, mais pour fins de lisibilité , je ne pense pas que ce soit une bonne idée. En outre, Je ne vois pas comment fournir des getteurs privés pour des attributs privés améliore OO encapsulation.

Je pourrais aussi fournir mutateurs publics pour tous les champs s. Je l'ai vu fait dans de nombreuses applications. Venez penser à cela, la plupart des IDes fournissent une fonctionnalité qui génère automatiquement des mutateurs publics pour tous les attributs de classe ...

Mais je me demande, N'est-ce pas contre le principe même de l'encapsulation de fournir des accesseurs publics pour des attributs privés destinés à être utilisés uniquement à l'intérieur de la classe?

Edit: Ma question ne concerne pas l'utilisation d'accesseurs à l'intérieur de leur propre classe. Il s'agit de la pertinence de fournir des accesseurs publics pour tous champs privés de la classe, peu importe qu'ils sont utilisés en dehors de la classe ou non.

3
The Once-ler

Bien qu'il existe peu de règles difficiles et rapides dans la conception et le développement de logiciels, il y a une école de pensée que les mutateurs/getters/setters pour Chaque attribut d'une classe est un anti-motif ou à moins pas une bonne pratique pour OOP.

Au moins dans une certaine mesure, l'utilisation généralisée de getters/setters semble avoir été fortement influencée par JavaBeans , qui ne sont pas particulièrement axés sur des objets, ou du moins pas un cas général d'orientation d'objet. Certaines personnes sont allées aussi loin pour affirmer que getters/setters étaient "mal" (en 2003!) ou "considéré comme nocif" .

Je n'irais pas aussi loin, mais je pense que de nombreux getters/setters ont tendance à affaiblir ou à affaiblir des lignes directrices telles que dites, ne demandez pas et encapsulation. Si un attribut est un détail de mise en œuvre, un interne de la classe, pourquoi devrait-il être exposé via son interface?

Les getter/setters sont dans certains cas également un "artefact" historique de certaines cadres de persistance qui les utilisaient (ou au moins encourager leur utilisation) à persister/charger des objets vers et depuis le magasin de données. Dans ce cas, un détail technique a fini par encourager BAD OO Design.

Avec tout cela à l'esprit, je pense qu'une chose peut être dit: Non, une classe ne devrait pas fournir de mutateurs publics pour tous ses champs privés. Cela pourrait être nécessaire dans certains cas, mais comme principe général, ce n'est pas correct.

2
Andres F.

Alors j'ai fait du google. Voici la règle que vous citez:

À respecter OO concepts d'encapsulation, des champs privés doivent toujours être accessibles via des accesseurs

https://www.appmarq.com/public/changeababilité,4576.Provide-accessors-a-private-fields

Sa remédiation:

Écrivez un getter et un réglage sur chaque champ privé

Et une référence. Vraisemblablement pour la justification:

http://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html JavaBeans (TM) Spécification 1.01 Version finale - Paragraphe 8.3 Modèles de conception pour les propriétés P 55

Cependant, si vous vérifiez la référence, il ne dit rien du genre. Il s'agit de la manière dont les propriétés sont implémentées.

Cela, associé au site terrible Appmarq, qui empêche la sélection de texte, me conduit à croire que l'audit de distribution entière est fondamentalement sans valeur.

L'idée que chaque domaine privé devrait être une propriété est ridicule. Vraisemblablement ce qu'ils veulent réellement signifie est: "Utilisez des propriétés plutôt que des champs publics" ou peut-être "méfiez-vous d'objets étatiques!"

11
Ewan

Non, vous ne semblez pas avoir rien oublié. Cet audit semble mal guidé, entre autres choses qu'il implique des objets immuables, comme String, sont "contre OO".

7
Caleth

Pour un autre point de vue, certains affirment qu'il devrait y avoir Aucun getters ou setters . Du tout. IMO, c'est un peu trop fort, mais ils font d'excellents points que les getters et les réglages ont des inconvénients importants et doivent être évités.

En tout état de cause, l'audit de distribution, s'il signifie vraiment ajouter des accesseurs pour tous les champs privés, est de la merde. Je soupçonne que cela signifie vraiment "si vous souhaitez autoriser l'accès à un champ, faire une méthode d'accesseur", mais pas sûr.

Getters/Setters Evil Période

Pourquoi les méthodes getter et setter sont diaboliques

0
user949300