REFACTR #1 — Раздутые функции

Как разложить раздутые функции

Итак, вы работали над новым приложением — может быть, с несколькими другими, а может и нет. В начале вы были полны страсти к своей концепции, оптимизма из-за выбранного вами стека технологий и стальной сосредоточенности на написании лучшего чертового кода.

Затем внутри этой функции была небольшая ошибка, и самым быстрым решением было просто передать ей другой параметр. Вы знаете, что не должны. Но вы сделали. Время-деньги в конце концов, верно?

Затем вам нужно было вызвать другую функцию из этой функции, поэтому вы просто передавали все параметры из текущей функции в эту.

А потом была еще одна ошибка, так что вы просто объединили две функции вместе.

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

Ваши намерения были благими, но поспешность взяла над вами верх.

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

Or……..

Как и я, вы унаследовали от кого-то огромную кодовую базу с огромным количеством раздутых взаимосвязанных функций, и ваша работа — срезать лишнее и худеть.

В любом случае — вот руководство, как это сделать! Мы собираемся реорганизовать следующую функцию:

Это на JavaScript, но не беспокойтесь о синтаксисе, если вы не очень разбираетесь в языке. Речь идет о концепциях, лежащих в основе того, что мы делаем с кодом, который имеет значение. И имейте в виду, что я намеренно сделал эти шаги по рефакторингу очевидными в этом примере; на практике требуется внимательный взгляд, чтобы определить способ применения многих из этих методов.

1. Используйте объекты для кластеров связанных данных

Первым шагом в декомпозиции является превращение кластеров связанных данных в объекты. Хотя, как вы можете видеть ниже, изначально он увеличивает длину каждой строки и затрудняет чтение кода, следующие два шага облегчаются. Здесь мы преобразовали как статистику персонажа, так и параметры персонажа в объекты:

2. Определите существующие точки сжатия без потерь

Предполагая, что ваш код аккуратно написан и удобочитаем, чем меньше строк и символов, тем лучше. Чем меньше нужно понимать, тем легче его поддерживать и расширять. Мне нравится называть области, в которых можно уменьшить количество символов без снижения удобочитаемости или запутывания логики точки сжатия без потерь. В идеале вы также хотите предотвратить потерю расширяемости. Однако в некоторых случаях имеет смысл пожертвовать расширяемостью, когда эта возможность вам не нужна.

Точки сжатия без потерь; Области, в которых можно уменьшить количество символов и улучшить расширяемость на месте.

Имейте в виду, что эти возможности меняются в зависимости от языка!

В этом коде есть две основные точки сжатия;

  1. Нам не нужно создавать пустой объект персонажа, поскольку каждая раса создает свой собственный «базовый» профиль.
  2. Создание «профиля персонажа» для каждого heroClass, а затем добавление свойств вместе делает систему более декларативной и устраняет необходимость в операторах if else if — то, что может стать утомительным при большом количестве heroClass.

3. Разделите функциональность на сгруппированные

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

Теперь, когда мы сгруппировали наши данные и уменьшили количество символов, я могу легко выделить четыре области сгруппированной функциональности;

  1. Селектор базового профиля персонажа, выбираемый по расе.
  2. Применение класса символов
  3. Множитель атрибута на основе уровня
  4. Мощный верх!

Итак, мы приходим к нашему окончательному решению;

Код несвязан, легко расширяем и декларативен без побочных эффектов!

Итак, подведем итоги;

  1. Кластеризовать связанные данные в объекты.
  2. Уменьшите количество слов в существующих точках сжатия без потерь.
  3. Разложите свою большую функцию, сгруппировав ее вместе. Каждая функция должна делать только одну новую вещь!

В качестве упражнения возьмите исходный файл кода, выполните на нем этот процесс и оставьте ссылку на собственные результаты в комментариях ниже!