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

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

Раз уж взялись за этот метод, доведем дело до конца.
Этот switch мне очень не нравится. Что мы можем сделать, чтобы избавиться? Есть два пути: первый мы уже использовали в похожей ситуации: заменили условный выбор полиморфизмом в методе getShapes класса SVGDisplayInFlash.
Подойдет ли аналогичный способ для этого случая? Теоретически, мы можем загнать код в такие рамки. Но это неудобно и потребует существенного изменения логики приложения, чего мы избегаем на данном этапе.
Второй путь - применить пространства имен, его и попробуем применить.

Делаем небольшой тест:
- для начала создадим пространство имен
Код AS3:
private namespace MOVE_TO_ABSOLUTE = "M";
затем заменим пространство имен private у метода createMoveToCommand на созданное:
Код AS3:
MOVE_TO_ABSOLUTE function createMoveToCommand(svgCmds:Array, j:int) : int {...
И создадим тестовый код в соответствующем case:
Код AS3:
case FormatSVG.MOVE_TO_ABSOLUTE :
 
	var createMoveToCommand:*;
	var space:Namespace = Namespace(cmd);
	var method:Function = space::createMoveToCommand as Function;
	trace(space+ " >>> "+method);
 
	j = method(svgCmds, j);
	break;
Протестируем, всё работает.

Идея заключается в том, чтобы метод makeDrawCmds принял примерно такой вид:
Код AS3:
private function makeDrawCmds(svgCmds:Array):void {
 
	firstP = lastP = lastC = null;
	var j:Number = 0;
	var createDrawCommand:Function;
	var space:Namespace;
	var method:Function;
 
	do {
		space = Namespace(svgCmds[j++]);
		method = space::createDrawCommand as Function;
		j = method(svgCmds, j);
 
	}  while (j < svgCmds.length);
}
Для этого придется создать создать массу пространств имен и перенести в эти пространства имен методы create...Command и переименовать их все в createDrawCommand.
В итоге мы получим вполне симпатичный метод makeDrawCmds и... несколько неприятностей вдовесок.

Для объявления пространства имен мы не можем использовать константы, объявленные в классе FormatSVG. Мы должны обязательно их объявлять вот так:
Код AS3:
private namespace MOVE_TO_ABSOLUTE = "M";
но не можем применить ни один их этих вариантов:
Код AS3:
private namespace MOVE_TO_ABSOLUTE = new Namespace(FormatSVG.MOVE_TO_ABSOLUTE);
private namespace MOVE_TO_ABSOLUTE = FormatSVG.MOVE_TO_ABSOLUTE;
Это значит, что если вдруг нам понадобится изменить значение константы, то придется не забыть и изменить объявление пространства имен. Мы-то это знаем, но не те, кто будут править код после нас.

Второй неприятный довесок: FDT плохо поддерживает работу с пространствами имен. Например, чтобы избавиться от подсвечивания ошибки, нам пришлось объявлять переменную:
Код AS3:
var createMoveToCommand:Function;
Хотя есть случаи, в которых использование пространств имен себя оправдывает, но это не наш случай.
__________________
http://realaxy.com


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