Добро пожаловать на перепечатку, перепечатка с указанием автора оригинала и источника
Недавно при расширении существующего проекта я обнаружил, что его нужно изменить.классЭто766 строк, открытьОколо 40 общедоступных интерфейсов, я изменил его в слезах. Для того, чтобы со мной больше не повторилась такая трагедия, я считаю необходимым вести блог, чтобы большинство коллег-программистов знали о важности рефакторинга кода.
Если у вас есть обезьяна, которая пишет тысячи строк, обязательно перешлите ему эту статью
Почему занятия не могут быть слишком длинными?
Класс слишком длинный - не могу прочитать, не могу расширить
- Не могу прочитать - прокрутка непосредственно с помощью колеса прокрутки занимает несколько секунд. Даже у оригинального автора могут возникнуть трудности с пониманием всего класса через долгое время, не говоря уже о других читателях.
- Невозможно расширить — класс со слишком большим количеством интерфейсов может чрезвычайно затруднить расширение класса.
Классы слишком длинные — возможно, в них есть избыточный код.
В этот момент инженеры CV вели холодную войну
Избыточный код — это повторяющийся код, обычно от рук инженеров CV, которые для создания кода используют Ctrl + C и Ctrl + V. Избыточный код очень вреден:
- Избыточный код метода, слишком длинный класс, не простой
- Избыточный код приведет к расходящимся модификациям (когда необходимо изменить избыточный код, необходимо изменить каждое сочетание клавиш Ctrl+V)
Занятия слишком длинные - в основном из-за слишком большого количества обязанностей
Класс открывает десятки интерфейсов, и определенно существует проблема слишком большого количества обязанностей.Так же, как кот Том на картинке, существует огромная проблема со слишком большим количеством обязанностей класса:
-
Нарушение принципов проектирования -Принцип единой ответственности(Принцип единой ответственности требует, чтобы класс реализовывал только одну обязанность, например, Том, который выполняет только одно из подметания, мытья пола и стола, а реализация других вещей может быть передана собаке Спайку или толстому maid), что нарушает этот принцип, что приведет к проблемам с кодом, таким как расходящиеся изменения, расходящиеся модификации и слишком длинные классы. Это также затруднит расширение ваших классов и даже заставит других программистов думать, что вы непрофессиональны.
-
дивергентное изменение(ссылаясь на многие места, которые вызывают такие модификации), если у класса много обязанностей, у него должно быть много вееров (вызывающих), и модификация каждого вызывающего может заставить ваш класс изменить его, то есть расходящиеся изменения
Это означает, что независимо от того, что пойдет не так, ваш класс пострадает.
-
Дивергентная модификация(имеется в виду множество мест, где такие модификации ведут к модификациям), точно так же, если у класса много обязанностей, должно быть много подчиненных, поддерживающих его реализацию, то есть ответвлений (вызываемых). логика меняется, будут вызваны все подчиненные. возможно, придется модифицировать соответственно, то есть дивергентную модификацию
То есть с вашим классом есть проблема, и где бы вы ни находились, вы будете страдать.
-
Сложно масштабировать: Если у вас есть класс с большим количеством интерфейсов, как насчет его подклассов? А как насчет его класса-оболочки? Все ли они должны реализовывать так много интерфейсов и брать на себя одинаковое количество обязанностей? Это действительно громоздко, чтобы расширить
-
Триггер: [Ярость испытаний] [Ярость эксплуатации и обслуживания]
Я написал тысячи строк, что мне делать?
Рефакторинг — удаление лишнего кода
Извлечение избыточного кодаИзвлечь повторяющийся код в отдельный метод, при повторном использовании этого кода уже не нужны Ctrl+C, Ctrl+V, а напрямую вызывается соответствующий метод
Это также может сократить исходный метод, сделав исходный метод более кратким и понятным.
Что еще стоит упомянуть, так это то, что если этот код нужно изменить, его нужно изменить только в одном месте, а не везде по-разному.
Действительно убивает трех зайцев одним выстрелом
Используйте IDEA для извлечения избыточного кода
-
Обнаружен повторяющийся код
-
Выполните извлечение метода Щелкните правой кнопкой мыши -> выберите Рефакторинг -> Извлечение -> Метод (или напрямую используйте сочетание клавиш Ctrl + Alt + m)
Автоматически определять нюансы отдельных повторяющихся кодов. Некоторые коды могут изменять только одну или две переменные. IDEA автоматически обнаружит их и напомнит нам при извлечении методов. Выбор «Принять изменение подписи» слева может изменить метод извлечения. Автоматически заменить больше повторяющихся точек.
Вы можете заменить все повторяющиеся коды (их 18)
-
Рефакторинг — изменение сигнатур методов
Если вас не устраивает имя, параметр, возвращаемое значение или модификатор извлеченного метода, не используйте Ctrl+R для модификации, в IDEA предусмотрен метод рефакторинга - изменить сигнатуру (сочетание клавиш Ctrl+F6)
Примечание. Имя метода относится к тому, что метод делает, а не к тому, как он это делает, предпочтительноглагол + существительноеФормат
Например: Том.Sweep() √
Том. Подметание с метлой () ×
Том. Подметающая метла () ×
Рефакторинг - передача переменной-члена + функция (передача ответственности)
Переместите переменные-члены и функции, которыми вы не должны управлять
Затем необходимо рассмотреть два вопроса: кого следует перевести? Передать кому?
увидеть картинку
- На рисунке член [Partial A] дважды вызывается классом [A], но вызывается только один раз классом [слишком длинный класс], к которому он принадлежит, поэтому его следует передать в [A] для управления.
- Поскольку функция [Часть А] имеет высокую близость с членом [Часть А] (вызывается только [Часть А], она должна наступать и отступать вместе с [Частью А], идти и оставаться вместе, и передавать ее [ А]
- То же самое верно для элементов [частичный B] и функций [частичный B]
- Ответственность 1 (Функция [1] и элемент [Частичная ответственность 1]) и Ответственность 2 (Функция [2] и элемент [Частичная ответственность 2]) Поскольку невозможно передать подходящий класс, следует выделить новый класс
Обратите внимание, что вы решаете, какую переменную-член переместить первой, а затем какую функцию переместить.
Используйте IDEA для передачи переменных-членов и функций
-
Переместите переменную-член, выберите переменную-член с помощью мыши -> щелкните правой кнопкой мыши -> Рефакторинг -> Переместить, а затем выберите, в какой класс передать
-
Функция перемещения (тот же шаг, что и при перемещении переменной-члена)
Рефакторинг — извлечение классов
Когда вы обнаружите, что переменные-члены и функции должны быть переданы, вы не можете найти правильный класс (обязанности по передаче не могут найти следующий дом), если вы думаете об этом, это мир программы, и наша программа это категория класса и объект объекта.Создайте новый класс, пусть он разделит обязанности для нас (переменные-члены и функции)
Используйте IDEA для извлечения классов
-
Проведите рефакторинг и выберите перемещаемые переменные и функции-члены, щелкните правой кнопкой мыши->Рефакторинг->Извлечь->Делегировать (извлеките делегатора и доверьте ему управление этими переменными и функциями. Если есть только переменные или функции, вы можете извлечь объект параметра Объект параметра или объект метода)
Не рекомендуется извлекать объекты параметров, потому что обычно объекты параметров используются для методов с большим количеством параметров (заменяя длинный список параметров объектами параметров), и если переменные-члены извлекаются, не затрагивая никаких функций, это бесполезный объект. Просто удалите их
-
Дайте новому классу имя, выберите пакет
-
Обратите внимание, что извлеченные функции и члены должны соответствовать принципу, то есть количество раз, когда извлеченные функции используют извлеченные члены, должно быть больше, чем количество оставшихся функций, в противном случае нарушается принцип близости (члены должны принадлежать класс, который называет это больше всего, у вас нет причин использовать больше, чем я, и позволить мне управлять им)
-
некоторые мелкие проблемы
Рефакторинг завершается неудачно, потому что извлеченная функция напрямую использует неизвлеченный объект, который включает другой рефакторинг (с использованием метода get вместо прямого использования закрытых переменных-членов), который можно разрешить с помощью этого рефакторинга.
Технологии не разделены на области, идеи находятся в одном ряду, добро пожаловать в гостиБлог Orange FungusЭта статья опубликована в блогеOpenWriteвыпуск!