Обещай мне, перестань писать тысячи строк классов, ладно?

Java
Обещай мне, перестань писать тысячи строк классов, ладно?

Добро пожаловать на перепечатку, перепечатка с указанием автора оригинала и источника

Недавно при расширении существующего проекта я обнаружил, что его нужно изменить.классЭто766 строк, открытьОколо 40 общедоступных интерфейсов, я изменил его в слезах. Для того, чтобы со мной больше не повторилась такая трагедия, я считаю необходимым вести блог, чтобы большинство коллег-программистов знали о важности рефакторинга кода.

Если у вас есть обезьяна, которая пишет тысячи строк, обязательно перешлите ему эту статью

Почему занятия не могут быть слишком длинными?

Класс слишком длинный - не могу прочитать, не могу расширить

  • Не могу прочитать - прокрутка непосредственно с помощью колеса прокрутки занимает несколько секунд. Даже у оригинального автора могут возникнуть трудности с пониманием всего класса через долгое время, не говоря уже о других читателях.
  • Невозможно расширить — класс со слишком большим количеством интерфейсов может чрезвычайно затруднить расширение класса.

Классы слишком длинные — возможно, в них есть избыточный код.

В этот момент инженеры CV вели холодную войну

Избыточный код — это повторяющийся код, обычно от рук инженеров CV, которые для создания кода используют Ctrl + C и Ctrl + V. Избыточный код очень вреден:

  1. Избыточный код метода, слишком длинный класс, не простой
  2. Избыточный код приведет к расходящимся модификациям (когда необходимо изменить избыточный код, необходимо изменить каждое сочетание клавиш Ctrl+V)

Занятия слишком длинные - в основном из-за слишком большого количества обязанностей

Класс открывает десятки интерфейсов, и определенно существует проблема слишком большого количества обязанностей.Так же, как кот Том на картинке, существует огромная проблема со слишком большим количеством обязанностей класса:

  1. Нарушение принципов проектирования -Принцип единой ответственности(Принцип единой ответственности требует, чтобы класс реализовывал только одну обязанность, например, Том, который выполняет только одно из подметания, мытья пола и стола, а реализация других вещей может быть передана собаке Спайку или толстому maid), что нарушает этот принцип, что приведет к проблемам с кодом, таким как расходящиеся изменения, расходящиеся модификации и слишком длинные классы. Это также затруднит расширение ваших классов и даже заставит других программистов думать, что вы непрофессиональны.

  2. дивергентное изменение(ссылаясь на многие места, которые вызывают такие модификации), если у класса много обязанностей, у него должно быть много вееров (вызывающих), и модификация каждого вызывающего может заставить ваш класс изменить его, то есть расходящиеся изменения

    Это означает, что независимо от того, что пойдет не так, ваш класс пострадает.

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

    То есть с вашим классом есть проблема, и где бы вы ни находились, вы будете страдать.

  4. Сложно масштабировать: Если у вас есть класс с большим количеством интерфейсов, как насчет его подклассов? А как насчет его класса-оболочки? Все ли они должны реализовывать так много интерфейсов и брать на себя одинаковое количество обязанностей? Это действительно громоздко, чтобы расширить

  5. Триггер: [Ярость испытаний] [Ярость эксплуатации и обслуживания]

Я написал тысячи строк, что мне делать?

Рефакторинг — удаление лишнего кода

Извлечение избыточного кодаИзвлечь повторяющийся код в отдельный метод, при повторном использовании этого кода уже не нужны Ctrl+C, Ctrl+V, а напрямую вызывается соответствующий метод

Это также может сократить исходный метод, сделав исходный метод более кратким и понятным.

Что еще стоит упомянуть, так это то, что если этот код нужно изменить, его нужно изменить только в одном месте, а не везде по-разному.

Действительно убивает трех зайцев одним выстрелом

Используйте IDEA для извлечения избыточного кода

  1. Обнаружен повторяющийся код

  2. Выполните извлечение метода Щелкните правой кнопкой мыши -> выберите Рефакторинг -> Извлечение -> Метод (или напрямую используйте сочетание клавиш Ctrl + Alt + m)

    Автоматически определять нюансы отдельных повторяющихся кодов. Некоторые коды могут изменять только одну или две переменные. IDEA автоматически обнаружит их и напомнит нам при извлечении методов. Выбор «Принять изменение подписи» слева может изменить метод извлечения. Автоматически заменить больше повторяющихся точек.

    Вы можете заменить все повторяющиеся коды (их 18)

  3. Рефакторинг — изменение сигнатур методов

    Если вас не устраивает имя, параметр, возвращаемое значение или модификатор извлеченного метода, не используйте Ctrl+R для модификации, в IDEA предусмотрен метод рефакторинга - изменить сигнатуру (сочетание клавиш Ctrl+F6)

    Примечание. Имя метода относится к тому, что метод делает, а не к тому, как он это делает, предпочтительноглагол + существительноеФормат

    Например: Том.Sweep() √

    Том. Подметание с метлой () ×

    Том. Подметающая метла () ×

Рефакторинг - передача переменной-члена + функция (передача ответственности)

Переместите переменные-члены и функции, которыми вы не должны управлять

Затем необходимо рассмотреть два вопроса: кого следует перевести? Передать кому?

увидеть картинку

  1. На рисунке член [Partial A] дважды вызывается классом [A], но вызывается только один раз классом [слишком длинный класс], к которому он принадлежит, поэтому его следует передать в [A] для управления.
  2. Поскольку функция [Часть А] имеет высокую близость с членом [Часть А] (вызывается только [Часть А], она должна наступать и отступать вместе с [Частью А], идти и оставаться вместе, и передавать ее [ А]
  3. То же самое верно для элементов [частичный B] и функций [частичный B]
  4. Ответственность 1 (Функция [1] и элемент [Частичная ответственность 1]) и Ответственность 2 (Функция [2] и элемент [Частичная ответственность 2]) Поскольку невозможно передать подходящий класс, следует выделить новый класс

Обратите внимание, что вы решаете, какую переменную-член переместить первой, а затем какую функцию переместить.

Используйте IDEA для передачи переменных-членов и функций

  1. Переместите переменную-член, выберите переменную-член с помощью мыши -> щелкните правой кнопкой мыши -> Рефакторинг -> Переместить, а затем выберите, в какой класс передать

  2. Функция перемещения (тот же шаг, что и при перемещении переменной-члена)

Рефакторинг — извлечение классов

Когда вы обнаружите, что переменные-члены и функции должны быть переданы, вы не можете найти правильный класс (обязанности по передаче не могут найти следующий дом), если вы думаете об этом, это мир программы, и наша программа это категория класса и объект объекта.Создайте новый класс, пусть он разделит обязанности для нас (переменные-члены и функции)

Используйте IDEA для извлечения классов

  1. Проведите рефакторинг и выберите перемещаемые переменные и функции-члены, щелкните правой кнопкой мыши->Рефакторинг->Извлечь->Делегировать (извлеките делегатора и доверьте ему управление этими переменными и функциями. Если есть только переменные или функции, вы можете извлечь объект параметра Объект параметра или объект метода)

    Не рекомендуется извлекать объекты параметров, потому что обычно объекты параметров используются для методов с большим количеством параметров (заменяя длинный список параметров объектами параметров), и если переменные-члены извлекаются, не затрагивая никаких функций, это бесполезный объект. Просто удалите их

  2. Дайте новому классу имя, выберите пакет

  3. Обратите внимание, что извлеченные функции и члены должны соответствовать принципу, то есть количество раз, когда извлеченные функции используют извлеченные члены, должно быть больше, чем количество оставшихся функций, в противном случае нарушается принцип близости (члены должны принадлежать класс, который называет это больше всего, у вас нет причин использовать больше, чем я, и позволить мне управлять им)

  4. некоторые мелкие проблемы

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

Технологии не разделены на области, идеи находятся в одном ряду, добро пожаловать в гостиБлог Orange FungusЭта статья опубликована в блогеOpenWriteвыпуск!