Рефакторинг: избавляемся от очевидных функций
В прошлой статье про рефакторинг я обещал рассмотреть такой прием рефакторинга, как «Группировка кода в отдельную функцию», но я решил немного повременить с этим, чтобы рассмотреть несколько более мелких приемов, необходимых зачастую перед проведением группировки кода в отдельную функцию.
А сегодня мы поговорим о такой элементарной вещи, как избавление от функции, тело которой настолько понятно, что отражает имя этой функции. Речь идет преимущественно о функциях, состоящих из одной строки.
Ну правильно, нам же не стоит выделять всего одну строку в отдельную функцию, имя и тело которой по смыслу совпадают. Признайтесь, при чтении такого кода это немного раздражает.
Не знаю, как правильнее назвать этот прием Давайте назовем его «Избавление от очевидных функций». Только учтите, что под функциями тут будем подразумевать любые функции, т.е. методы классов в том числе.
Итак, пример:
function getRating() { return (moreThanFiveLateDeliveries()) ? 2 : 1; } function moreThanFiveLateDeliveries() { return _numberOfLateDeliveries > 5; }
Здесь конечно очевидно, что функцию можно удалить, а на ее место вызова поставить то, что она возвращает:
function getRating() { return (_numberOfLateDeliveries > 5) ? 2 : 1; }
В самом первом предложении этого поста я написал про группировку кода в отдельную функцию. Так вот, прием избавления от очевидных функций используется не только для того, чтобы избавиться от мелких функций. Иногда нам нужно несколько функций, вызываемых в функции А, «развернуть» с помощью этого приема, т.е. тела этих функций как бы подставить на те места, где они вызываются.
После этого получившаяся функция А снова рефакторится путем приема перегруппировки. А есть еще другой прием, о котором я тоже расскажу в одной из следующих статей - «Замена метода объектом». Так вот наш прием обычно применяется перед заменой метода объектом. Но не буду пока забегать вперед.
Я описал этот прием довольно просто, но, конечно, его не всегда возможно применить (например, в рекурсивных функциях или если функция-член является полиморфной). Но любой прием рефакторинга применяется там, где он бы облегчил чтение и понимание кода. Поэтому, выбор, применять или не применять, остается за Вами.
Пример, по-моему, совсем не очевидный.