Обзор темы [Рефакторинг кода]

Замена условия полиморфизмом

(Replace Conditional with Polymorphism)

Есть условие, зависящее от типа объекта, по которому выбирается соответствующие поведение.

Поместить каждую ветвь условного оператора в перегруженный метод в подклассе. Сделать исходный метод абстрактным.

 

double getSpeed() {

switch (_type) {

case EUROPEAN:

return getBaseSpeed();

case AFRICAN:

return getBaseSpeed() – getLoadFactor() * _numberOfCoconuts;

caseNORWEGIAN_BLUE:

return (_isNailed) ? 0 : getBaseSpeed(_voltage);

}

throw new RunTimeException (“Should be unreachable”)’

}

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