TOP

Что такое рефакторинг?

Описание

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


Преимущества рефакторинга:

Когда нужно делать рефакторинг:

Плохие запахи в коде (Smells Catalog) :

Возможные варианты рефакторинга

  1. Moving Features Between Objects (перенос целостного кода между объектами):

    • Move Method (выделение метода) – выделяем отдельный способ, если способ очень длинноватый, либо содержит код, требующий комментариев.
    • Move Field (перемещение поля) – осуществляется тогда, когда поле используется вторым классом чаще, а не в том, где оно определено.
  2. Organizing Data (Упорядочение данных):

    • Encapsulate Field (инкапсуляция поля) – одним из основных принципов ООП является инкапсуляция либо сокрытие данных. Если данные будут открыты, объекты могут читать и изменять их значения без ведома владельца этих данных. Потом делаем такое поле закрытым и обеспечиваем методы доступа.
    • Encapsulate Collection (инкапсуляция коллекции) – частенько в классе содержится коллекция экземпляров. Эта коллекция может быть массивом, списком, множеством или вектором. способ получения не обязан возвращать сам объект коллекции, так как это дозволило бы клиентам поменять содержание коллекции без ведома владеющего ею класса. Поэтому значение, возвращаемое способом, нужно сделать доступным лишь для чтения и сделать способы добавления/удаления частей.
  3. Composing Methods (выделение и объединение кода):

    • Extract Method (выделение метода) – если есть фрагмент кода, который можно сгруппировать, вынесите его в отдельный метод с названием, объясняющим его назначение. Таким образом, название метода будет заменено комментариями.
    • Inline Method (встроение метода) – время от времени полезно переместить тело способа в вызывающий его код. Бывает, что тела методов так же понятны, как и название самого метода. Также может быть ситуация когда есть много разных методов, структура которых неудачна и поэтому лучше их всех сбросить в один общий метод, а затем выделить методы вторым способом.
    • Inline Temp (встройка временной переменной) – замена временной переменной, которой присваивается простое выражение только один раз. Иногда такая переменная мешает проведению других рефакторингов.
    • Replace Temp with Query (Замена временной переменной вызовом метода) – используется когда временная переменная используется для сохранения значения какого-либо выражения. В таком случае, выражение заменяем методом и все ссылки в коде на эту переменную заменяем новым методом.
    • Split Temporary Variable (расщепление временной переменной) – применяется, если одна временная переменная употребляется для многократного присвоения разных результатов (если это не переменная, которая употребляется в цикле в цикле и не переменна для скопления результата). В этом случае создаем отдельную переменную для каждого присвоения.
  4. Simplifying Conditional Expressions (упрощение выражен с условиями):

    • Decompose Conditional (декомпозиция условного оператора) – выполняется, когда у нас есть условная цепочка проверок (if-then-else). Заменяем отдельными способами условия (if), части then и else. Способствует улучшению понимания причины ветвления, а имена методов объясняют назначение соответствующего фрагмента кода.
    • Consolidate Conditional Expression (консолидация условного выражения) – осуществляется, если существует ряд проверок условий, дающих одинаковый результат. Следует объединить все проверки в одно условное выражение или метод.
    • Consolidate Duplicate Conditional Fragments (консолидация дублированных условных фрагментов) – один и тот же фрагмент находится во всех ветвях условного выражения. Следует переместить этот фрагмент кода за пределы этого выражения.
    • Remove Control Flag (Удаление управляющего флага) – существует переменная, действующая как управляющий флажок для ряда логических выражений. Используем вместо него BREAK или RETURN.
    • Replace Conditional with Polymorphism (замена условного оператора полиморфизмом) – осуществляется, когда существует условный оператор, поведение которого зависит от типа объекта. Необходимо переместить каждую ветвь условного оператора в перегруженный способ подкласса. Сделайте исходный код абстрактным.