Ошибка Rubocop "определение класса слишком длинное ruby"

Я получаю определение класса ошибки rubocop слишком длинное. [236/100]'. Мой класс выглядит следующим образом:

class SomeClassName
  include HelperModule
  attr_accessor :aaa, :bbb, :ccc

  .... methods .....
end

что может пойти не так? В rubocop документы ClassLength говорит "длина класса превышает некоторое максимальное значение". Что это значит?

4 ответов


Это, вероятно, означает, что ваше определение класса занимает более 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 с этим рабочим процессом, предполагая, что я сталкиваюсь с существующей базой кода с нагрузками предупреждений:

  1. Run rubocop --auto-gen-config для создания файла "TODO". Включите этот файл в основной файл конфигурации rubocop. См. их документацию для подробности. В вашем примере он будет генерировать конфигурацию, которая позволяет длинные классы (по крайней мере 236 строк или больше, если у вас есть большие классы).

  2. теперь, если вы запустите rubocop, он будет игнорировать все преступления, которые вы помещаете в свой файл TODO - то есть, теперь все будет выглядеть нормально. Только если вы введете больше ошибок / предупреждений (например, класс с 237 строками), он снова запустится. Итак, на данный момент,rubocop ничего не будет делать для вас, кроме как помешать вам сделать это хуже.

  3. время от времени, когда у меня есть время убить, я выбираю правило из файла TODO и работаю над ним. Есть три возможности:--10-->

    • удалите правило из файла TODO. Это восстановит исходное поведение rubocop.
    • ослабьте число, связанное с ним. Скажем, длина класса ограничена 250 прямо сейчас; я хотел бы установить его на (скажем) 100 строк, но я знаю, что у меня нет времени на рефакторинг многих классов прямо сейчас. Поэтому я установил 240. Это вызовет все классы, которые находятся между 240 и 250 строками; вероятно, только несколько, с которыми я могу легко справиться. Я чиню их и двигаюсь дальше. В другой день я, возможно, вернусь к нему и пойду от 240 до 230 и т. д.
    • иногда я решаю, что я не беспокоюсь о конкретном предупреждении. Затем я перемещаю конфигурацию из файла TODO в правильный .rubocop файл, позволяя ему постоянно.

итак, нет жестких и быстрых правила обо всем этом. Вы должны найти свои собственные ценности. Некоторые вещи, которые rubocop объекты полностью нормально со мной, так как они больше до стиля кодирования, чем правильность или что-то еще.

конкретный ответ

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

у меня, безусловно, есть максимальное количество строк, настроенных для мои файлы классов (а также для методов). Длина единицы кода (будь то класс или метод) - это очень простой, но эффективный "запах кода", который указывает на выращенный код и кандидатов на рефакторинг/расщепление.

Я выбрал несколько чисел для себя, и я придерживаюсь их. То есть, Я не постоянно перемещаю их вверх или вниз в соответствии с конкретным кодом, но если кусок кода растет "на 1 строку слишком большой", я принимаю меры. В большинстве случаев моя цель состоит в том, чтобы разделить его примерно пополам, что будет, в долгосрочной перспективе приведите к минимально необходимым усилиям.

если класс очень длинный, он обычно нарушает правило "одна ответственность за класс". Обычно полезно разбить его на части. Не просто случайные подклассы, а вполне оправданные, узорные конструкции.

если метод очень длинный, он иногда может указывать на принимаемые меры OO (т. е. вводимые классы или метод, разделяемый на существующие классы; особенно если метод состоит из большой if/else конструкции и особенно case утверждения), но чаще он требует простого старомодного рефакторинга в меньшие (вероятно, частные) методы.

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