web-dev-qa-db-fra.com

Où placer des méthodes privées dans Ruby?

La plupart des blogs, des tutoriels ou des livres ont des méthodes privées au bas de tout cours/module. Est-ce la meilleure pratique?

Je trouve plus pratique d'avoir des méthodes privées au besoin. Par exemple:

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

De cette façon, je trouve le code plus lisible au lieu de faire défiler de haut en bas ce qui est très irritant.

Y at-il quelque chose de terriblement faux dans cette approche? Avoir des méthodes privées à la base n'est-il pas simplement une pratique exemplaire et autre chose?

93
ZX12R

La meilleure pratique à mes yeux est d'aller séquentiellement et de déclarer vos méthodes sans rester privé.

A la fin, vous pouvez rendre n'importe quelle méthode privée en ajoutant simplement: private :xmethod

Exemple:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

Cela justifie-t-il votre question?

127
kiddorails

Il y a aussi l'option pour ajouter private à la définition de la méthode depuis Ruby 2.1.

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

En regardant la définition, vous savez instantanément si une méthode est privée, peu importe où elle est définie dans le fichier. C'est un peu plus de frappe (si vous ne complétez pas automatiquement) et tous vos defs ne seront pas bien alignés.

53
Dennis

Comme d'autres l'ont déjà souligné, la convention est de placer les méthodes privées au bas de la classe, sous un même cours privé. Cependant, vous devriez probablement savoir aussi que beaucoup de programmeurs utilisent une méthode à double retrait (4 espaces au lieu de 2) pour cela. La raison en est que bien souvent, vous ne verrez pas "privé" dans votre éditeur de texte et supposerez qu'ils pourraient être publics. Voir ci-dessous pour une illustration:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

    def some_private_method
    end

    def another_private method
    end

end

Cette méthode devrait vous éviter d'avoir à faire défiler de haut en bas et rendra les autres programmeurs plus à l'aise dans votre code.

51
Noah Clark

Je pense que les méthodes publiques sont une sorte d’interface de l’objet, et il est logique de les placer à l’endroit le plus visible, c’est-à-dire en haut du fichier.

15
Flexoid

Vous n'avez pas besoin de mettre public ou private au-dessus de chaque méthode. Je mets généralement toutes mes méthodes privées au bas de ma classe. De plus, n’avez pas à dire explicitement public car les méthodes sont publiques par défaut. Par exemple:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

  def some_private_method
  end

  def another_private method
  end

end
12
Kyle Decot

Je viens de l'arrière-plan Java et je déteste devoir faire défiler pour voir le type de méthode. Je pense qu'il est insensé de ne pas pouvoir spécifier la visibilité de méthode par méthode sans laideur. J'ai donc fini par mettre un commentaire. #private avant chaque méthode suck puis en déclarant private :....

6
akostadinov

C'est une question de goût, je suppose, mais je préférerais explicitement nommer chaque méthode privée sur la ligne après cette méthode, comme suit:

 class Example
   def cthulhu
   end

   def rlyeh
   end

   def foo
   end
   private :foo

   def bar
   end
   private :bar

   def baz
   end
   private :baz     
 end
4
crogers

Je n'aime pas avoir à spécifier public ou privé pour chaque méthode. Placer toutes les méthodes privées en bas me permet d’avoir une seule instance de "privé" par fichier. Je suppose que c'est une question de goût.

4
David

Un style consiste à regrouper les méthodes afin que vous n'utilisiez que private et protected au maximum une fois par classe. Un autre style consiste à spécifier la visibilité juste après la définition de la méthode:

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end

A partir de Ruby 2.1.0 def renvoie le nom de la méthode sous forme de symbole, un style plus simple est donc possible:

class Example
  private def my_private_method
  end

  def my_public_method
  end

  protected def my_protected_method
  end

  private_class_method def self.my_private_class_method
  end
end

(Notez que nous utilisons private_class_method pour les méthodes de classe - sinon, nous aurions NameError: undefined method depuis private attend une méthode d’instance. Même si vous l'utilisez comme une macro, comme dans l'exemple d'origine, cela affecte uniquement la visibilité des méthodes d'instance.)

J'aime mieux ce style de visibilité en ligne, car il vous permet d'organiser les méthodes à votre guise. Cela réduit le risque d'ajouter une nouvelle méthode au mauvais endroit et de la rendre privée par inadvertance.

En ce qui concerne la syntaxe de la méthode de classe, vous pouvez la gérer de cette façon:

class Example
  private def my_private_method
  end

  class << self
    private def my_private_class_method
    end
  end
end
4
devpuppy

Dennis avait la réponse parfaite, c’est-à-dire que, lorsque vous utilisez Ruby> = 2.1, préfixez simplement def avec private (ou protected, public)).

Mais je crois qu’il est maintenant aussi possible d’utiliser un bloc privé comme dans:

private begin
   def foo
   end
   def bar
   end
end

def Zip
end
1
edx

J'ordonne généralement mes méthodes comme suit:

  1. Constructeur
  2. Autres méthodes publiques, par ordre alphabétique
  3. private, écrit une seule fois
  4. Méthodes privées, par ordre alphabétique

J'utilise les fonctionnalités "Aller à la définition" de mon éditeur pour que cela ne nécessite pas beaucoup de défilement, et dans tous les cas, si la classe est suffisamment grande pour que le défilement devienne problématique, il devrait probablement être divisé en plusieurs classes.

0