Блок кода if (hasTransform) аналогичными действиями превращается в метод:
Код AS3:
private function getRotation(node : XMLNode) : Number {
// parse for rotation specification
// hasRotate = getAttribute(node, "transform").indexOf("rotate");
// if (hasRotate > -1) {
var hasRotate:Boolean = getAttribute(node, "transform").indexOf("rotate") > -1;
if (hasRotate) {
var startRotate:Number = getAttribute(node, "transform").indexOf("(");
var endRotate:Number = getAttribute(node, "transform").indexOf(")");
return parseInt(getAttribute(node, "transform").substr(startRotate + 1, endRotate - startRotate));
}
return 0;
}
А вызов становится таким:
Код AS3:
if (hasTransform) {
rotation = getRotation(node);
} else {
rotation = 0;
}
В этом месте я отметил для себя странность: переменная rotation локальна, мы ее присваиваем, но нигде не используем. Перенесем ее объявление ближе к присвоению и всё вместе закомментируем:
Код AS3:
// var rotation:Number;
// if (hasTransform) {
// rotation = getRotation(node);
// } else {
// rotation = 0;
// }
Мы нашли странный участок кода и закомментировали его, тем самым убрав неиспользуемую логику из приложения. Этот участок кода мы обнаружили в процессе рефакторинга. Заметьте, что в логику метода мы не вдавались, мы лишь вынесли разные логические блоки в отдельные методы.
Рефакторинг в этом смысле очень похож на ситуацию, когда мы берем груду запчастей и начинаем их все раскладывать по полочкам, иногда вытирая пыль. В этом процессе нам достаточно в общем виде представлять зачем запчасть нужна, при этом нас совершенно не заботит как именно она делает свое дело.
Процесс рефакторинга не изменяет логику приложения, но, в итоге, дает нам возможность впоследствии сделать это точечно, сосредоточившись на изменении логики небольших методов.
Просто сравните каким был метод extractCommands и каким он стал сейчас. В данный момент его логика прозрачна и понятна. Логика каждого из вынесенных методов не требует семи пядей во лбу и может быть легко изменена или оптимизирована, если такая потребность возникнет.