Где разместить частные методы в 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