10
votes

Quand devrions-nous envisager d'utiliser privé ou protégé?

Je me demandais, quand devrions-nous réellement utiliser privé ou protégé pour certaines méthodes dans le modèle?

Parfois, je ne peux pas ne pas être dérangé de grouper mes méthodes dans privé ni protégé . Je viens de le laisser tel quel. Mais je sais que cela doit être une mauvaise pratique, sinon ces 2 groupements ne seront pas créés dans la programmation.

merci.


0 commentaires

3 Réponses :


0
votes

Je ne sais pas Ruby comme cas particulier, mais je suppose que la réponse serait aussi la même que pour d'autres langues aussi, c'est pourquoi c'est ici:

Une méthode privée ne peut être consultée que par des membres de la même classe, tandis qu'une protection est également disponible pour un membre des classes qui étendent la classe de base où la méthode est déclarée.


5 commentaires

Yupp, c'est une question de programmation générale. J'ai lu ce que privé et protégé fait, mais quand ne devez-nous pas l'ignorer?


Voulez-vous dire le cas, où une méthode n'est pas déclarée publique, privée ou protégée du tout?


@Victor Vous n'ignorez pas l'encapsulation «ignorer», mais de manière générale, gardez des choses privées sauf indication contraire à eux d'être protégé ou public


@fkerber privé Les membres ne sont visibles que sur la classe, Les membres protégés sont visibles pour les enfants de cette classe et Les membres du public sont visibles à toutes les classes. Si ce sont des membres de l'instance, ils sont, et peut-être plus pertinemment, encapsulés dans l'instance de cette classe (c'est-à-dire un objet)


@Tom privé Les membres sont disponibles pour les sous-classes ainsi que dans Ruby.



15
votes
  • Si vous envisagez d'appeler une méthode externe, record.method () , puis "public"
  • S'il sera utilisé uniquement en interne, self.method () , puis "privé"
  • Si vous envisagez de l'utiliser en interne, mais aussi dans les descendants, self.method () # dans la sous-classe , puis "protégé"

2 commentaires

Cela me semble un peu ... votre 3ème point . Une sous-classe peut accéder aux méthodes privées de sa superclasse en interne. Une méthode est la possibilité de transmettre un objet de la même classe et d'exécuter des méthodes protégées sur cet objet.


weblog.jamisbuck.org/2007/2/23/Method- Les méthodes protégées de visibilité-in-ruby "peuvent être appelées à tout moment le récepteur est de la même classe que" Self '"



2
votes

Je vais donner mon avis , et peut-être que je vais avoir un coup de pied pour cela, mais je ne me préoccupe pas de protéger ni de privé dans Ruby. La réalité est que Ruby vous traite comme un adulte, si vous souhaitez exécuter une méthode privée de l'extérieur de la classe, vous pouvez (il sont façons ). Vous pouvez exécuter des méthodes protégées en dehors de la classe. Vous pouvez même réaffecter des constantes ... vous pouvez faire ce que vous voulez, fondamentalement.

Et c'est pourquoi j'aime bien, c'est votre responsabilité. Mon sentiment est que pour marquer quelque chose comme protégé ou privé, vous faites deux choses:

  1. indiquant que vous ne pensez pas un consommateur en aura besoin.
  2. Deuxième devinez ce que quelqu'un d'autre a besoin.

    Et en outre, vous rendant plus difficile à tester, car il peut s'agir d'une réelle douleur à tester des méthodes privées (voir Quelle est la meilleure façon de tester les méthodes protégées et privées d'unités à Ruby? pour les façons d'elle)

    Pour ces deux dernières raisons, je ne m'embête pas avec eux. Si vous vouliez vraiment une sorte de barrière entre vos classes / méthodes et les consommateurs (qu'elles soient du code ou des développeurs), il existe des moyens autres, plus efficaces (proxy, obscurpation, cryptage, méthodes protégées par mot de passe, etc.). Sinon, pourquoi ne pas leur donner accès aux mêmes outils que vous avez utilisés?


2 commentaires

+1 J'ai des pensées similaires. La seule raison pour laquelle I l'utiliser: RDOC a l'option - visibilité . Avec public, protégé et privé, je peux générer différentes versions de documentation avec plus ou moins de détails.


@knut C'est une idée intéressante, je vais devoir garder cela à l'esprit. J'ai tendance à utiliser yardoc et il a la balise @private , mais je n'ai jamais vu quelle utilisation il pourrait être. Merci.