Вот плохо написанная функция изменения цены товара, учитывающая множество разных условий. Нужно рефакторить, так как сама функция жутко нечитабельна. С чего начать рефакторинг или какие методы использовать для начала рефакторинга?
Обычно рефакторинг начинается с написания модульного теста который полностью покрывает все кейсы улучшаемой функции. Без этого шага начинать рефакторинг рисковано. В противном случае ты можешь что-то сломать и долго не знать об этом.
После того как модульный тест написан - можно смотреть на функцию. Что в ней видно невооруженным глазом? Видно большое количество повторяющихся действий. Например одна и та-же функция реплейса по регуляке.
.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ')
встречается 4 раза. Ее можно обработать через extract function. После этого кода станет визуально меньше.
Далее - повторяющийся code-block с обновлением update_price. Его брат-близнец отличается только
аргументом option_price. На этом можно сыграть и тоже сделать некоторое упрощение.
if (prefix == '+') {
update_price = current + Number(option_price);
} else {
update_price = current - Number(option_price);
}
Некоторые фрагменты кода напрашиваются на introduce temporary variable.
Например следующий сниппет
option_sizes.find('input[type="hidden"]')
был использован дважды. И первый раз он нашел какое-то значение и был использован.
И в следующей строке этот поиск был вызван снова. Хотя операция find как-бы подсказывает
нам что она имеет complexity близкое к линейному. Тоесть нужно ценить процессорное
время и не грузить его повторными поисками. Тут - как-бы смысл двойной. И перформанс
и нормализация кода. Тоесть явное указание что этот результат нам еще понадобиться.
Очень сильно в рефакторинге помогает типизация. Тоесть если переписать код с JavaScript на TypeScript
то будут более очевидны некоторые инварианты.
Вот на этом пожалуй хватит. Надо сделать эти рефакторинги и возможно дальше откроется видение других.