Где разместить частные методы в Ruby?

Большинство блогов или учебников или книг имеют частные методы в нижней части любого класса/модуля. Это лучшая практика?

Я считаю, что частные методы как можно более удобны. Например:

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

Таким образом, я нахожу код более читаемым, а не постоянно прокручивающимся вверх и вниз, что очень раздражает.

Есть ли что-то ужасное в этом подходе? Имеет ли частные методы внизу не только лучшие практики и что-то еще?

Ответ 1

Лучшая практика в моей точке зрения состоит в том, чтобы последовательно следовать и объявлять ваши методы, не сохраняя конфиденциальность в точке зрения.

В конце вы можете сделать любой метод закрытым, просто добавив: private :xmethod

Пример:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

Оправдывает ли это ваш вопрос?

Ответ 2

Как уже отмечалось, конвенция заключается в том, чтобы поставить частные методы в нижней части под одним частным классом. Однако вам, вероятно, также следует знать, что для многих программистов для этого используется метод с двойным отступом (4 пробела вместо 2). Причина в том, что часто вы не видите "private" в текстовом редакторе и предполагаете, что они могут быть общедоступными. См. Ниже иллюстрацию:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

    def some_private_method
    end

    def another_private method
    end

end

Этот метод должен помешать вам прокручивать вверх и вниз и сделать других программистов более комфортными в вашем коде.

Ответ 3

Также существует возможность добавить private к определению метода с Ruby 2.1.

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

Глядя на определение, вы сразу же узнаете, является ли метод приватным, независимо от того, где в указанном файле. Это немного больше печатает (если вы не автозаполняете), и не все ваши def будут хорошо выровнены.

Ответ 4

Я думаю, что публичные методы - это какой-то интерфейс объекта, и логично разместить их на самом видном месте, то есть в верхней части файла.

Ответ 5

Вам не нужно помещать public или private над каждым методом. Обычно я использую все свои личные методы в нижней части моего класса. Кроме того, не нужно явно указывать public, поскольку методы являются общедоступными по умолчанию. Например:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

  def some_private_method
  end

  def another_private method
  end

end

Ответ 6

Я исхожу из java фона, и мне не нравится прокручивать, чтобы увидеть тип метода. Я считаю безумным, что нельзя указывать видимость метода на один метод без уродства. Поэтому я закончил тем, что добавил комментарий #private перед каждым методом suck, а затем объявлял private :....

Ответ 7

Мне не нравится указывать публичный или закрытый для каждого метода. Ввод всех частных методов внизу позволяет мне иметь один экземпляр "private" для каждого файла. Я думаю, это вопрос вкуса.

Ответ 8

Один стиль состоит в объединении методов вместе, чтобы вы максимально использовали private и protected один раз за класс. Другой стиль - указать видимость сразу после определения метода:

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end

Начиная с Ruby 2.1.0 def возвращает имя метода как символ, поэтому возможен более упорядоченный стиль:

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

(Обратите внимание, что мы используем private_class_method для методов класса - иначе мы бы получили NameError: undefined method, так как private ожидает метод экземпляра. Даже при использовании его в качестве макроса, как в исходном примере, это влияет только на видимость методов экземпляра.)

Мне нравится этот встроенный стиль видимости лучше всего, так как он позволяет вам организовывать методы по своему усмотрению. Это уменьшает риск добавления нового метода в неправильном месте и непреднамеренно делает его закрытым.

Что касается синтаксиса метода класса, вы можете обрабатывать его следующим образом:

class Example
  private def my_private_method
  end

  class << self
    private def my_private_class_method
    end
  end
end

Ответ 9

Это вопрос вкуса, я полагаю, но я предпочел бы явно называть каждый метод private на линии после указанного метода следующим образом:

 class Example
   def cthulhu
   end

   def rlyeh
   end

   def foo
   end
   private :foo

   def bar
   end
   private :bar

   def baz
   end
   private :baz     
 end

Ответ 10

У Денниса был отличный ответ, то есть при использовании ruby >= 2.1 просто префикс def с закрытым (или защищенным, общедоступным)

Но я считаю, что теперь также можно использовать private как блок как в:

private begin
   def foo
   end
   def bar
   end
end

def zip
end