Сокращение очень длинного определения класса в Ruby

Я проснулся от реализации Rubocop и наткнулся на строку, похожую на эту в кодовой базе:

class ThisIsAVerlyLongClassName < JSONAPI::SomeOtherModule::AnotherClassWithAnInsaneName

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

Не вдаваясь в споры о стиле кодирования в целом, как лучше всего заставить Rubocop перестать жаловаться на длину строки, не делая исключений в.rubocop.yml или редактируя имена классов и модулей?

4 ответа

Решение

Я только что узнал, что определение класса можно разбить на несколько строк, например:

class ThisIsAVerlyLongClassName <
  JSONAPI::SomeOtherModule::AnotherClassWithAnInsaneName

Он нарушает подсветку синтаксиса в Atom для 2-й строки, но код запускается и все тесты проходят!

В то время как тела определения класса имеют свою собственную не вложенную лексическую область (например, тела определения метода), выражение суперкласса оценивается в содержащей области. Другими словами: вы можете просто использовать локальную переменную:

superclass = JSONAPI::SomeOtherModule::AnotherClassWithAnInsaneName
class ThisIsAVerlyLongClassName < superclass

Обычно вы можете отключить конкретное предупреждение Rubocop в определенной строке, добавив к этой строке комментарий, подобный следующему:

class A < B::C::D # rubocop:disable Metrics/LineLength

Каков наилучший способ заставить Rubocop перестать жаловаться на длину строки, не делая исключений в.rubocop.yml или редактируя имена классов и модулей?

Спасения нет. Если вы хотите исправить эту жалобу, вы должны либо:

  • отключите его явно, установив переопределение в.rubocop.yml или для этого конкретного файла
  • решить проблему, следовательно переименовать класс
Другие вопросы по тегам