Почему rubocop или руководство по стилю ruby ​​предпочитают не использовать get_ или set_?


person Harish Kayarohanam    schedule 29.09.2014    source источник
comment
Ради чисто любопытства, как называется метод?   -  person Unixmonkey    schedule 29.09.2014


Ответы (2)


Я думаю, что дело здесь в том, что разработчики ruby ​​​​предпочитают всегда думать о методах как о геттерах, поскольку они что-то возвращают и используют равные «синтаксический сахар» (например, в def self.dog=(params), который позволяет вам делать Class.dog = something). По сути, я всегда видел, что get и set избыточны и многословны.

В отличие от этого у вас есть get и set с несколькими аргументами, которые похожи на методы поиска (в частности, get; вспомните where ActiveRecord).

Имейте в виду, что «руководство по стилю» = чистое мнение. Последовательность — это высшая цель руководств по стилю в целом, поэтому, если что-то, возможно, не так или трудно читать, ваша цель должна быть больше в том, чтобы все было одинаково, а не в определенном типе. Вот почему рубокоп позволяет вам отключить это.

person Stefan Dorunga    schedule 29.09.2014
comment
Ok . это убедительно. могу ли я сделать так, чтобы рубиновый полицейский пропускал эту строку из проверки? - person Harish Kayarohanam; 29.09.2014
comment
Ну.. можно заставить пропускать файл или вообще убрать в конфиге. Таким образом, он никогда не будет жаловаться, но тогда он не будет уведомлять вас, когда вы используете get_ в любом из файлов. (С чем вы согласны?) Вы можете изменить его в своем rubocop файл конфигурации - person Stefan Dorunga; 02.10.2014
comment
Я не хочу делать это для всего приложения, поэтому я добавил комментарий # # rubocop:disable Style/AccessorMethodName # rubocop:enable Style/AccessorMethodName только для этого блока. - person Harish Kayarohanam; 06.10.2014

Другой способ увидеть это: парадигма getter/setter была, насколько я могу судить, в значительной степени специфическим соглашением в Java/C++ и т. д.; по крайней мере, я знал довольно много кодовых баз Java в очень туманном прошлом, когда Beans был замусорен огромным количеством get_-getters и set_-setters. В то время закрытый атрибут, скорее всего, будет называться «имя» с помощью «set_name()» и «get_name()»; поскольку сам атрибут назывался «имя», геттер также не мог быть «имя ()».

Следовательно, само существование «get_» и «set_» связано с (тривиальным) техническим недостатком языков, которые не допускают «=» в именах методов.

В Ruby у нас есть совсем другой набор возможностей:

  • Прежде всего, у нас есть name() и name=(), что сразу устраняет необходимость в синтаксисе get_ и set_. Итак, у нас есть геттеры и сеттеры, просто мы называем их иначе, чем в Java.

  • Кроме того, тогда атрибут будет не name, а @name, что также разрешает этот конфликт.

  • На самом деле у вас вообще нет атрибутов с простым синтаксисом «obj.name»! Например; в то время как Rails/ActiveRecord делает вид, что "person.name" является "атрибутом", на самом деле это просто пара автоматически сгенерированных геттера name() и сеттера name=(). Концептуально вызывающая сторона не должна заботиться о том, что такое «имя» (атрибут или метод), это деталь реализации класса.

  • Он сохраняет 4 или 3 нажатия клавиш для каждого вызова. Это может показаться шуткой, но написание краткого, но легко понятного кода является торговой маркой Ruby, в конце концов. :-)

person AnoE    schedule 14.01.2016
comment
Отличный ответ! Возможно, имеет смысл иметь set_ (установка глобальных состояний) и get_ (get_headers, post_headers, delete_headers (как HTTP-глаголы)). Но его определенно не следует использовать в качестве средств доступа в стиле Java (например, attr_accessor может это сделать: D) - person Dorian; 22.04.2017
comment
Хороший пример get_headers. Тогда #rubocop:disable пригодится. ;) @Дориан - person AnoE; 22.04.2017