Question

Maintenant, si vous lisez les conventions de nommage dans le MSDN C #, vous remarquerez qu'il indique que les propriétés sont toujours préférables aux champs publics et protégés. On m'a même dit par certaines personnes que vous ne devez jamais utiliser les champs publics ou protégés. Maintenant, je suis d'accord, je n'ai pas encore trouver une raison dans laquelle je dois avoir un champ public, mais sont protégés des champs vraiment si mauvais?

Je peux voir si vous devez vous assurer que certains contrôles de validation sont effectuées lors de l'obtention / réglage de la valeur mais beaucoup de temps, il semble que ce supplément frais généraux à mon avis. Je veux dire laisse dire que j'ai un gameitem de classe avec des champs pour baseName, prefixName et suffixName. Pourquoi devrais-je prendre la tête des deux créant les propriétés (C#) ou les méthodes accesseurs et la performance a frappé je NUL (si je le fais pour chaque champ unique dans une application, je suis sûr que ce serait additionne au moins un peu particulier dans certaines langues comme PHP ou certaines applications avec des performances est essentielle comme les jeux)?

Était-ce utile?

La solution

  

Sont membres protégés / champs vraiment si mauvais?

Non. Ils sont ainsi, bien pire.

Dès qu'un membre est plus accessible que private, vous faites des garanties aux autres classes sur la façon dont ce membre va se comporter. Étant donné qu'un champ est totalement incontrôlé, mettre « dans la nature » ouvre votre classe et des classes qui héritent de ou d'interagir avec votre classe au risque de bug plus élevé. Il n'y a aucun moyen de savoir quand un changement sur le terrain, aucun moyen de contrôler qui ou quels changements il.

Si maintenant, ou à un moment donné à l'avenir, tout de votre code jamais dépend d'un champ une certaine valeur, vous devez ajouter des contrôles de validité et une logique de repli au cas où il n'est pas la valeur attendue - tous les lieux que vous utilisez . C'est une énorme quantité d'efforts gaspillée lorsque vous auriez pu tout simplement fait un lieu bien foutue;)

meilleur façon de partager l'information avec les classes dérivées est en lecture seule propriété :

protected object MyProperty { get; }

Si vous absolument Vous pour le rendre lecture / écriture, non. Si vous avez vraiment, faut vraiment faire lecture-écriture, repenser votre conception. Si vous avez encore besoin d'être en lecture-écriture, des excuses à vos collègues et ne pas le faire à nouveau:)

Beaucoup de développeurs croient - et vous dire - que cela est trop stricte. Et il est vrai que vous pouvez get par très bien sans être cette stricte. Mais cette approche vous aidera à aller de passer juste un logiciel remarquablement robuste. Vous passerez beaucoup moins de temps corrections de bugs.

Et en ce qui concerne les préoccupations au sujet de la performance - ne pas. Je vous garantis que vous ne serez jamais, dans toute votre carrière, le code d'écriture si vite que le goulot d'étranglement est la pile d'appel lui-même.

Autres conseils

OK, le temps de downvote.

  • Tout d'abord, les propriétés seront les performances jamais mal (à condition qu'ils ne font pas grand-chose). C'est ce que tout le monde dit, et je suis d'accord.

  • Un autre point est que les propriétés sont bonnes en ce que vous pouvez placer en eux pour les points d'arrêt capture obtenir / réglage des événements et savoir d'où ils viennent.

Le reste des arguments me dérange pas de cette façon:

  • Ils sonnent comme "argument de prestige". Si MSDN dit, ou un célèbre développeur ou auteur que tout le monde aime le dit, il doit être.

  • Ils sont basés sur l'idée que les structures de données ont beaucoup d'états incohérents et doivent être protégés contre l'errance ou d'être placés dans ces états. Depuis (il me semble) des structures de données sont bien trop importantes dans l'enseignement actuel, puis généralement, ils ne besoin de ces protections. Beaucoup plus préférable est de réduisent au minimum la structure de données de sorte qu'il tend à normaliser et de ne pas avoir des états incohérents. Ensuite, si un membre d'une classe est modifiée, il est tout simplement changé plutôt que endommagé. Après tout, en quelque sorte beaucoup de bon logiciel a été / est écrit en C, et qui ne souffrent massivement d'un manque de protection.

  • Ils sont basés sur le codage poussé à l'extrême défensive. Il est basé sur l'idée que vos classes seront utilisées dans un monde où le code de personne d'autre ne peut faire confiance pas d'oie vos trucs. Je suis sûr qu'il ya des situations où cela est vrai, mais J'ai jamais vu. Ce que je Vous vu est des situations où choses ont été faites horriblement compliquées pour contourner les protections pour lesquelles il n'y avait pas besoin, et d'essayer de garder la cohérence des structures de données qui ont été horriblement trop compliquées et non normalisés .

En ce qui concerne les champs par rapport à des propriétés, je peux penser à deux raisons de propriétés dans l'interface préférant publique (protégée est également public dans le sens que quelqu'un d'autre que juste votre classe peut le voir).

  • L'exposition des propriétés vous donne un moyen de cacher la mise en œuvre. Il vous permet également de changer la mise en œuvre sans modifier le code qui l'utilise (par exemple si vous décidez de changer la façon dont les données sont stockées dans la classe)

  • De nombreux outils qui fonctionnent avec des classes utilisant la réflexion se concentrer uniquement sur les propriétés (par exemple, je pense que certaines bibliothèques pour le travail de sérialisation de cette façon). L'utilisation des propriétés rend toujours plus facile d'utiliser ces outils standards .NET.

En ce qui concerne les frais généraux:

  • Si le getter / setter est la pièce habituelle d'une ligne de code qui lit simplement / définit la valeur d'un champ, le JIT devrait pouvoir inline l'appel, donc il n'y a pas overhad de performance.

  • est en grande partie syntactique réduit ses frais généraux lorsque vous utilisez les propriétés implémentées automatiquement (C # 3.0 et plus récent), donc je ne pense pas que ce soit un problème:

    protected int SomeProperty { get; set; }
    

    En fait, ce qui vous permet de faire par exemple set protégé et public get très facilement, donc cela peut être encore plus élégant que l'utilisation des champs.

publique et / ou des champs protégés sont mauvais parce qu'ils peuvent être manipulés de l'extérieur de la classe déclarant sans validation; ainsi on peut dire de rompre le principe d'encapsulation de la programmation orientée objet.

Lorsque vous perdez l'encapsulation, vous perdez le contrat de la classe déclarant; vous ne pouvez pas garantir que les classes se comporte comme prévu ou attendu.

En utilisant une propriété ou une méthode pour accéder au champ permet de maintenir l'encapsulation et l'exécution du contrat du

classe de déclaration.

Je suis d'accord avec la réponse de la propriété en lecture seule. Mais pour jouer l'avocat du diable ici, cela dépend vraiment de ce que vous faites. Je serai heureux d'admettre que j'écrire du code avec les membres du public tout le temps (je fais aussi pas fait de commentaires, suivre les directives, ou l'une des formalités).

Mais quand je suis au travail qui est une autre histoire.

Cela dépend en fait si votre classe est une classe de données ou une classe de comportement.

Si vous garder votre comportement et des données à part, il est bien d'exposer les données de vos données des classes, tant qu'ils ont pas de comportement.

Si la classe est une classe de comportement, alors il ne doit pas exposer les données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top