Méthodes privées et protégées Ruby: Comprendre la visibilité de la méthode

Qu’est-ce qu’une méthode privée dans Ruby?

C’est un type de méthode que vous ne pouvez appeler QUE depuis l’intérieur de la classe où il est défini.

Cela vous permet de contrôler l’accès à vos méthodes.

Une méthode Ruby peut être:

  • privé
  • public (par défaut)
  • protégé

Par défaut, TOUTES vos méthodes sont public.

Tout le monde peut les utiliser!

Mais vous pouvez changer cela en créant une méthode private ou protected.

Pourquoi est-ce utile?

Parce que vous pouvez rendre ces méthodes plus faciles à modifier.

Imaginez que vous écrivez une bibliothèque de code qui va être utilisée dans quelques projets différents au travail.

Lorsque ces projets implémentent votre bibliothèque, ils vont appeler des méthodes sur les classes que vous avez créées.

Maintenant:

Vous publiez une nouvelle version

Mais vous avez décidé de changer le nom sur une méthode public.

Cela va produire des erreurs sur chaque projet qui utilise cette méthode!

Rappelez-vous ceci:

En ayant MOINS de méthodes publiques, vous AUGMENTEZ la liberté de changement au sein de votre classe.

Voyons quelques exemples de code !

Comprendre les méthodes privées dans Ruby

Avez-vous déjà vu le message d’erreur « méthode privée appelée »?

Celui-ci:

self.puts 123# NoMethodError: private method `puts' called

Ensuite, vous avez essayé d’utiliser une méthode private de manière incorrecte.

Vous ne pouvez utiliser une méthode privée que par elle-même.

Exemple:

puts 123

C’est la même méthode, mais il faut l’appeler comme ça.

Les méthodes privées sont toujours appelées dans le contexte de self.

En d’autres termes…

Vous ne pouvez utiliser des méthodes privées qu’avec:

  • Autres méthodes de la même classe
  • Méthodes héritées de la classe parente
  • Méthodes incluses à partir d’un module

Cela signifie que vous ne pouvez pas appeler de méthodes privées à partir de l’extérieur de la classe qui les définit.

Car cela nécessiterait un « récepteur explicite ».

Sauf si…

Vous utilisez une méthode comme send pour contourner cette règle.

send(:puts, "apple")

Comment définissez-vous une méthode private?

def bacon "private bacon"endprivate :bacon

Le mot private lui-même n’est pas un mot-clé, c’est une méthode définie sur le module Kernel.

Où placer Vos Méthodes privées

Il est normal qu’une classe ait plus d’une méthode privée.

Où placez-vous ces méthodes?

Faites ceci:

class Food def public_method end private def bacon end def orange end def coconut endend

Chaque méthode d’instance après private devient une méthode privée.

Vous pouvez utiliser private_class_method :method_name si vous souhaitez définir une méthode de classe comme privée

Il est courant de définir d’abord toutes vos méthodes publiques, puis de définir vos méthodes private ensemble à la fin de la classe.

Méthodes publiques

Public est la visibilité de la méthode par défaut dans Ruby.

Voici un exemple:

def orange "Vitamin C"end

Si vous avez un objet food qui définit orange, vous pouvez l’appeler comme ceci:

food.orange

Si une méthode a été rendue privée ou protégée, vous pouvez la rendre publique à nouveau.

public :orange

Qu’est-ce qu’Une Méthode Protégée ?

Les méthodes protégées sont moins courantes.

Ce sont comme des méthodes private, mais vous pouvez les appeler sur un objet & pas seulement directement.

Si vous essayez cet exemple avec private, vous obtiendrez une erreur:

class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food

Vous obtenez l’erreur car name serait privé, vous ne pouvez donc pas faire other.name.

Mais avec protected ce code fonctionne!

Méthodes privées vs protégées

C’est la différence, le fait que protected conserve la méthode private, mais cela vous permet également d’appeler cette méthode sur un objet.

Avec privé, vous ne pouvez faire que name, avec protégé, vous pouvez faire object.name.

Quand devriez-vous utiliser protected?

Uniquement si vous avez un cas très spécifique, comme la méthode equals (==).

La documentation Ruby recommande d’utiliser private au lieu de protected dans la mesure du possible.

Et il y a cette note:

 » Une méthode protégée est lente car elle ne peut pas utiliser de cache en ligne. »

J’étais curieux à ce sujet alors j’ai couru quelques repères:

public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s

C’est une différence de performance de 8,5%.

Tutoriel vidéo

Résumé

Vous avez appris sur la visibilité de la méthode Ruby, les méthodes protégées publiques et privées &. Ce ne sont pas des mots-clés Ruby, ce sont des méthodes elles-mêmes définies sur la classe Module.



+