variables publiques vs variables privées avec accesseurs

Est-ce que quelqu’un d’autre a vu des gens faire ceci:

private ssortingng _name; public ssortingng Name{ get{ return _name; } set{ _name = value;}} 

Si je comprends bien, utilisez des accesseurs si vous souhaitez exercer un contrôle sur la manière dont les parameters sont configurés ou sur une fonction quelconque lorsqu’il ya un get. Mais si vous voulez simplement faire cela, pourquoi ne pas simplement commencer par rendre publique la variable? Est-ce que je manque quelque chose?

Si vous faites du membre un champ public, vous ne pourrez plus le refactoriser ultérieurement dans une propriété sans changer l’interface en votre classe. Si vous l’exposez comme une propriété dès le début, vous pouvez apporter toutes les modifications nécessaires aux fonctions d’access de la propriété et l’interface de la classe rest inchangée.

Notez qu’à partir de C # 3.0, vous pouvez implémenter une propriété sans créer de champ de sauvegarde, par exemple:

 public ssortingng Name { get; set; } 

Cela supprime ce qui est à peu près la seule justification pour ne pas implémenter de champs publics en tant que propriétés.

Si vous définissez une interface publique avec une propriété dans l’assembly A, vous pouvez ensuite utiliser cette interface dans l’assembly B.

Vous pouvez maintenant modifier l’implémentation de la propriété (par exemple, extraire la valeur d’une firebase database au lieu de la stocker dans un champ). Ensuite, vous pouvez recomstackr l’ensemble A et remplacer un ancien. L’Assemblée B fonctionnerait bien car l’interface n’aurait pas changé.

Cependant, si vous aviez initialement commencé avec un champ public et décidé que cela ne convenait pas et que vous souhaitiez modifier la mise en œuvre et que vous deviez le convertir en propriété, vous devrez alors modifier interface publique de l’assemblage A. Tous les clients de cette interface (y compris l’assemblage B) devront également être recompilés et remplacés pour pouvoir fonctionner avec cette nouvelle interface.

Vous feriez donc mieux de commencer par une propriété. Ceci encapsule l’implémentation de la propriété, vous laissant libre de le changer à l’avenir sans avoir à vous soucier des clients (y compris l’assemblage B) qui sont déjà dans le monde utilisant l’assemblage A. Parce que, s’il y a déjà des clients dans le monde en utilisant l’assemblage A, changer l’interface casserait tous les clients. S’ils sont utilisés par une autre équipe de votre entreprise ou par une autre entreprise, ils ne seront pas contents si vous cassez leurs assemblages en modifiant l’interface de la vôtre!

L’idée est que si vous utilisez des accesseurs, l’implémentation sous-jacente peut être modifiée sans changer l’API. Par exemple, si vous décidez que lorsque vous définissez le nom, vous devez également mettre à jour une zone de texte ou une autre variable, aucun code client ne doit être modifié.

Il convient de noter que DataBinding dans .NET refuse également de travailler sur des champs publics et exige des propriétés. Donc, cela pourrait être une autre raison.

Bonne pratique de programmation. Il s’agit d’un modèle très courant qui convient aux méthodologies de conception OO. En exposant un champ public, vous exposez les éléments internes de la manière dont ces données sont stockées. L’utilisation d’une propriété publique vous permet davantage de flexibilité pour modifier la façon dont les données sont stockées en interne et ne pas casser l’interface publique. Cela vous permet également de mieux contrôler ce qui se passe lors de l’access aux données (initialisation différée, contrôles nuls, etc.).

Les variables font partie de l’implémentation d’une classe. Les propriétés en représentent plus logiquement l’interface. Avec C # 3.0, les propriétés automatiquement implémentées en font un jeu d’enfant à faire depuis le début.

J’ai écrit plus de reflections à ce sujet, notamment sur les différentes manières dont le passage d’une variable à une propriété rompt non seulement la compatibilité binary, mais également la compatibilité de source, dans un article sur le sujet .

Préparation. Vous ne savez jamais quand vous voudrez supprimer l’accesseur d’ensemble par la suite, effectuer des opérations supplémentaires dans le configurateur ou modifier la source de données pour le get.

Les membres accessibles au public doivent généralement être des méthodes et non des champs. C’est juste une bonne pratique, et cette pratique vous permet de vous assurer que l’état encapsulé de vos objects est toujours sous votre contrôle.

Pour l’encapsulation, il n’est pas recommandé d’utiliser des champs publics.

http://my.safaribooksonline.com/9780321578815/ch05lev1sec5?displaygrbooks=0

Comme Chris Anderson l’a dit plus tard dans ce livre, l’idéal serait que l’appelant soit aveugle à la différence de terrain et de propriété.

Pour conserver un degré d’extensibilité élevé sans avoir à recomstackr tous vos assemblages, vous souhaitez utiliser des propriétés publiques en tant qu’accesseurs. En suivant un “contrat” ​​ou un mécanisme défini décrivant la manière dont vos objects échangeront des données, un ensemble de règles sera mis en place. Ce contrat est appliqué avec une interface et rempli par les getters et les setters de votre classe qui héritent de cette interface.

Par la suite, si vous créez des classes supplémentaires à partir de cette interface, vous avez la possibilité de respecter le contrat en utilisant les propriétés. vouloir, au fur et à mesure qu’il renvoie le type attendu par le “contrat”.