Показать сообщение отдельно
Старый 11.03.2008, 21:53
Iv вне форума Посмотреть профиль Отправить личное сообщение для Iv Посетить домашнюю страницу Iv Найти все сообщения от Iv
  № 10  
Iv
 
Аватар для Iv

Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
По умолчанию рефакторинг класса PathToArray

Следующий класс для причесывания - PathToArray. Он хоть и дает большое количество ошибок, однако подавляющее большинство - по одинаковой причине, и их можно исправить без существенных усилий.

В методе extractCmds динамически создается объект, содержащий перечень значений стандартных цветов. Эти цвета неизменны, а объект может быть использован неоднократно. Это прекрасный повод сделать объект статической константой и инициализировать его в теле класса. Так и поступим.
Вырезаем из метода всю инициализацию объекта colors, до строчки yellowgreen : 0x9acd32 включительно и вставляем с тело класса непосредственно после объявления класса.
Затем изменяем объявления и переносим закрывающую скобку в конец присвоений значений цветам. Должно получиться так:

Код AS3:
private static const colors:Object = {
	colors.blue=0x0000ff;
	........
	colors.yellowgreen=0x9acd32;
}
Разумеется, это неверно, и мы поиском и заменой (но не используя replace all) вначале удаляем строку "colors.", затем заменяем "=" на ":" и, в конце ";" на ",".

В итоге должно получиться так:

Код AS3:
private static const colors:Object = {
	blue:0x0000ff,
	........
	yellowgreen:0x9acd32
}
Теперь, нас этот объект не очень интересует и, если нажать волшебное сочетание клавиш SHIFT+CTRL+F, то всё перечисление из столбца превратится в одну строку и не будет занимать три экрана.

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

Код AS3:
private function getAttribute(node:XMLNode, attributeName:String) : String {
	return node.attributes[attributeName];
}
Процесс может оказаться утомительным и подверженым ошибкам. Чтобы этого избежать изучаем обращения к объекту attributes и видим, что строка кода всегда выглядит как "node.attributes.". Это дает нам возможность применить автозамену:
заменяем "node.attributes." (с точкой на конце!) на "getAttribute(node, ", в результате чего редактор расцветет массой ошибок. Это очень хорошо. Кликая на красные точки справа от скроллера мы переходим от ошибки к ошибке и ставим закрывающую скобку сразу после первого слова, следующего за "node". Заодно берем это слово в кавычки, поскольку это имя атрибута.

В процессе мы обнаруживаем еще одну прелесть рефакторинга: мы обнаружили ошибку несоответствия типов в строке:
Код AS3:
hasRotate = getAttribute(node, "transform").indexOf("rotate");
Обратите внимание, что за внешне безобидным отсутствием типа пряталась куда более серьезная ошибка - несоответствие типа. Игнорирование малой ошибки может повлечь за собой большую.

При обнаружении ошибки нужно четко понимать, что процесс рефакторинга останавливается и начинается другой процесс - исправление ошибки логики.
Обнаружение ошибки - серьезное происшествие и очень хорошее: будучи скрытой мы могли голову сломать откуда она берется и найти только с большим трудом.

В данном случае это локальная ошибка, не влекущая за собой цепочку других. Но всё-таки рассмотрим ее отдельно.
__________________
http://realaxy.com


Последний раз редактировалось iNils; 20.12.2010 в 13:20.