Раз уж взялись за этот метод, доведем дело до конца.
Этот 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;
Хотя есть случаи, в которых использование пространств имен себя оправдывает, но это не наш случай.