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

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

Вернемся в класс Math2.

Здесь мы видим сиротливо приютившийся метод getQuadBez_RP и мы понимаем, что из-за его завистливости к данным других объектов и вселенского одиночества в классе, он обречен на перемещение, а класс будет удален.

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

Итак, приступим.
Перемещаем метод вместе с комментариями в класс CubicBezierSVG, сохраняем все документы и идем исправлять образовавшиеся ошибки в окне Problems. Не буду расписывать - вы и сами знаете что делать.
Тестируем. Затем удаляем класс Math2, при этом мысленно благодарим его за труд, который он делал в течение своей короткой, но очень яркой и полезной жизни.

Возвращаемся к методу getQuadBez_RP.
Как и в предыдущем случае, нам вначале потребуется избавиться от зависимости кода от аргументов метода, которые мы будем заменять на объект CubicBezierSVG.
Для этого вначале метода создаем экземпляр класса CubicBezierSVG:
Код AS3:
const source:CubicBezierSVG = new CubicBezierSVG(point1, control1, control2, point2);
И везде в коде метода вместо обращения к аргументам используем доступ через объект source.
Чтобы гарантировать себя от невнимательности, действуем по простой схеме:
- переименовываем аргумент;
- новое имя используем только в инициализации объекта source;
- остальные обращения заменяем на доступ через объект source.

Вот что в итоге получилось:
Код AS3:
public static function getQuadBez_RP(start:Point, startControl:Point, endControl:Point, end:Point, k:Number, qcurves:Array):void {
	const source:CubicBezierSVG = new CubicBezierSVG(start, startControl, endControl, end);
	// find intersection between bezier arms
	var startArm : LineSVG = new LineSVG(source.start, source.startControl);
	var endArm : LineSVG = new LineSVG(source.endControl, source.end);
	var s:Point = startArm.getLineIntersection(endArm);
	// find distance between the midpoints
	var dx:Number = (source.start.x + source.end.x + s.x * 4 - (source.startControl.x + source.endControl.x) * 3) * .125;
	var dy:Number = (source.start.y + source.end.y + s.y * 4 - (source.startControl.y + source.endControl.y) * 3) * .125;
	// split curve if the quadratic isn't close enough
	if (dx*dx + dy*dy > k) {
		var sourceBezier : CubicBezierSVG = new CubicBezierSVG(source.start, source.startControl, source.endControl, source.end);
		var halves:Array = sourceBezier.split();
 
		var firstHalf:CubicBezierSVG = halves[0] as CubicBezierSVG; 
		var secondHalf:CubicBezierSVG = halves[1] as CubicBezierSVG;
		// recursive call to subdivide curve
		getQuadBez_RP (source.start, firstHalf.startControl, firstHalf.endControl, firstHalf.end, k, qcurves);
		getQuadBez_RP(secondHalf.start, secondHalf.startControl, secondHalf.endControl, source.end,    k, qcurves);
	} else {
		// end recursion by saving points
		qcurves.push({p1x:source.start.x, p1y:source.start.y, cx:s.x, cy:s.y, p2x:source.end.x, p2y:source.end.y});
	}
}
Следующий шаг, как вы помните, переход от статичного метода к методу экземпляра класса.
Удаляем ключевое слово static, сохраняемся и идем исправлять ошибки.
Принцип, как всегда прост:
- вначале метода объявляем переменную:
Код AS3:
var source:CubicBezierSVG;
- в коде, перед ошибочной строкой создаем экземпляр класса CubicBezierSVG:
Код AS3:
source = new CubicBezierSVG();
- копируем первые четыре аргумента метода getQuadBez_RP в аргументы конструктора CubicBezierSVG.
- заменяем обращение к статическому методу на обращение через экземпляр source.
- переходим к следующей ошибке, пока они не иссякнут.
- тестируем проект.
- не забываем радоваться тому, как у нас ловко всё получается.
__________________
http://realaxy.com


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