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

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

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

Подсвечиваются всего три ошибки: в методе shrinkSequencesOf не задана типизация локальных переменных. Зададим ее:
Код AS3:
var len:int = s.length;
var idx:int = 0;
var idx2:int = 0;
var rs:String = "";
Затем все объявления var заменим на const (пользуйтесь возможностью автоматического поиска и замены). Затем все переменные, которые подсветили ошибку присвоения, обратно заменим на var.

Займемся именованием. Для начала заменим имена аргументов функции. Думать тут особо не надо, поскольку автор позаботилась о комментариях: s заменяем на originalString, ch заменяем на characterToBeFound.

Затем, поскольку сокращений мы не любим, заменим:
len на length
idx на startIndex
idx2 на endIndex
rs на resultString

Также добавим фигурные скобки вложенному while.

Давайте сравним, что было и что стало:

Код AS3:
 // БЫЛО
public static function shrinkSequencesOf(s:String, ch:String):String {
	var len = s.length;
	var idx = 0;
	var idx2 = 0;
	var rs = "";
 
	while ((idx2 = s.indexOf(ch, idx) + 1) != 0) {
		// include string up to first character in sequence
		rs += s.substring(idx, idx2);
		idx = idx2;
 
		// remove all subsequent characters in sequence
		while ((s.charAt(idx) == ch) && (idx < len)) idx++;
	}
	return rs + s.substring(idx, len);	
}
 
// СТАЛО
public static function shrinkSequencesOf(originalString:String, characterToBeFound:String):String {
	const length:uint = originalString.length;
	var startIndex:int = 0;
	var endIndex:int = 0;
	var resultString:String = "";
 
	while ((endIndex = originalString.indexOf(characterToBeFound, startIndex) + 1) != 0) {
		// include string up to first character in sequence
		resultString += originalString.substring(startIndex, endIndex);
		startIndex = endIndex;
 
		// remove all subsequent characters in sequence
		while ((originalString.charAt(startIndex) == characterToBeFound) && (startIndex < length)) { 
			startIndex++;
		}
	}
	return resultString + originalString.substring(startIndex, length);	
}
Да, новый метод не так лаконичен. Он более объемен, но и более читабелен.
Обратите внимание на еще один положительный фактор: в процессе мы всё еще не изменяли логику программы, но уже начали более детально знакомиться с проектом.
К тому моменту, когда мы закончим рефакторинг мы будем довольно неплохо представлять что в проекте имеется, где находится и как примерно работает.
__________________
http://realaxy.com


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