Ответ 1
Вероятно, это означает, что определение вашего класса занимает более 100 строк кода.
Я получаю ошибку rubocop. Определение класса слишком велико. [236/100]. Мой класс выглядит следующим образом:
class SomeClassName
include HelperModule
attr_accessor :aaa, :bbb, :ccc
.... methods .....
end
Что может пойти не так? В документах rubocop ClassLength говорится, что "длина класса превышает некоторое максимальное значение". Что это значит?
Вероятно, это означает, что определение вашего класса занимает более 100 строк кода.
Да, это потому, что общие линии считаются слишком большими rubucop. Я согласен, что классы не должны затягиваться слишком долго, но думаю, что в конечном итоге это должно быть определено: у класса есть отдельная ответственность, методы достаточно кратки, есть методы, которые можно использовать через модуль и т.д. Число/предупреждение однако это большое предупреждение. Если что-то в классе выглядит нормально, вы можете добавить # rubocop:disable ClassLength
непосредственно над определением класса.
(Здесь уже много полезной информации, но я пришел к этому ответу, ища синтаксис для указания максимальных строк для каждого класса в Rubocop, и я полагаю, что другие могут прийти сюда и для этого.)
В .rubocop.yml
# Allow classes longer than 100 lines of code
ClassLength:
Max: 250 # or whatever ends up being appropriate
Нужно ли отключать этот коп, если я хочу, чтобы мой класс был больше 100 или здесь нужно настроить максимальную длину. Что ты предлагаешь?
Я использую rubocop с этим документооборотом, предполагая, что я столкнулся с уже существующей базой кода с множеством предупреждений:
Запустите rubocop --auto-gen-config
, чтобы создать файл "TODO". Включите этот файл в основной файл конфигурации rubocop. Подробнее см. В их документации. В вашем примере это создаст конфигурацию, которая позволяет использовать длинные классы (не менее 236 строк или более, если у вас более крупные классы).
Теперь, если вы запустите rubocop
, он будет игнорировать все правонарушения, которые вы вложили в ваш TODO файл, то есть теперь все будет выглядеть нормально. Только если вы введете больше ошибок/предупреждений (например, класс с 237 строками), он снова запустится. Итак, на данный момент rubocop
ничего не сделает для вас, кроме как предотвратить вас, чтобы сделать его хуже.
Время от времени, когда у меня есть время, чтобы убить, я выбираю правило из файла TODO и работаю над ним. Существует три возможности:
rubocop
.Итак, нет никаких жестких и быстрых правил обо всем этом. Вы должны найти свои собственные ценности. Некоторые вещи, с которыми сталкиваются объекты rubocop, полностью соответствуют мне, поскольку они более соответствуют стилю кодирования, чем правильность или что-то еще.
Нужно ли отключать этот коп, если я хочу, чтобы мой класс был больше 100 или здесь нужно настроить максимальную длину. Что ты предлагаешь?
У меня наверняка есть максимальное количество строк, настроенных для моих файлов классов (а также для методов). Длина единицы кода (будь то класс или метод) - очень простой, но эффективный "запах кода", который указывает на выраженный код и кандидатов на рефакторинг/разделение.
Я выбрал для себя некоторые цифры, и я придерживаюсь их. I.e., я не постоянно перемещаю их вверх или вниз, чтобы соответствовать конкретному коду, но если часть кода вырастает "1 строка слишком большая", я принимаю меры. В большинстве случаев моя цель состоит в том, чтобы разбить ее примерно наполовину, что в конечном итоге приведет к минимальным требуемым усилиям.
Если класс очень длинный, он обычно нарушает правило "одна ответственность за класс". Обычно полезно разбить его на части. Не только случайные подклассы, но и actully OO-оправданные, узорные, конструкции.
Если метод очень длинный, он иногда может указывать на принимаемые меры OO (т.е. введенные классы или метод разбивается на существующие классы, особенно если метод состоит из больших конструкций if/else
или особенно case
), но чаще всего он требует простого старомодного рефакторинга в более мелкие (вероятно, частные) методы.
Удачи в поиске ваших любимых настроек в rubocop, это потрясающе.