Евгений Темиргалеев писал(а):
Правка даст альтернативную версию (изменёны исходники) с нулевым различием по функционалу:
- не ошибка
- не оптимизация (разницу в скорости компиляции никто не увидет)
Т.е. в ней просто нет смысла.
У меня есть что сказать по этому поводу. Начну издалека.
Вчера вечером на работе наткнулся на следующий код:
Код:
private string ParseDestination (string sParse)
{
bool bFirstEnterence = true;
string sReturnText = String.Empty;
string sCutText = String.Empty;
for (int i = 0; i < sParse.Length; i++)
{
sCutText = sParse.Substring(i, 1);
if (!new Regex("^[0-9]+$").IsMatch(sCutText) && bFirstEnterence)
{
continue;
}
else
{
bFirstEnterence = false;
if (new Regex("^[0-9]+$").IsMatch(sCutText))
sReturnText += sCutText;
else break;
}
}
return sReturnText;
}
По замыслу автора этот алгоритм извлекает из строки непрерывную последовательность цифр отбрасывая нецифровой заголовок и хвост если они есть. Немного поясню, что тут написано для тех кто с C# не очень хорошо знаком. Здесь в цикле из строки извлекалась одна буква, создавалась (размещалась в динамической памяти) новая строка длины 1 из этой буквы. Создавалась (размещалась в динамической памяти) машина распознавания регулярных выражений. Эта машина использовалась один раз и выбрасывалась. Использовалась она для того, чтобы узнать состоит ли новая строка из цифр или нет (это при том, что эта строка всего из одной буквы). Так для каждой буквы заголовка. Когда нецифровой заголовок строки наконец пропускался, то срабатывал флаг bFirstEnterence и управление отныне всегда передавалось на вторую ветвь условного оператора внутри тела цикла. Однако, так как проверка флага осуществлялась во вторую очередь, то теперь машина распознавания регулярных выражений создавалась, использовалась и выбрасывалась уже по два раза на каждую букву и в if и в else блоках. Результат побуквенно присовокуплялся к строке sReturnText причём каждое такое присовокупление приводило к созданию (размещению в динамической памяти) нового экземпляра строки в силу иммутабельности строк в дотнете. Понятно, что создавая множество временных (паразитных) объектов этот код ещё и лишний раз жестоко напрягал сборщик мусора.
Что надо было сделать?
- Для начала убедиться что строка не пуста: if (!string.IsNullOrEmpty(s))
- Пропустить нецифровой заголовок: int i = 0; while ((i < n) && !IsDigit(s[i])) { i++; }
- Если последовательность цифр найдена if (i < n) тогда:
- Запомнить её начало: int start = i;
- Пропустить все цифры последовательности (найти начало нецифрового хвоста): while ((i < n) && IsDigit(s[i])) { i++; }
- Вычислить количество цифр в найденной последовательности: int count = i - start;
- Извлечь ответ: result = s.Substring(start, count);
Код:
private string ParseDestination (string s)
{
string result = string.Empty;
if (!string.IsNullOrEmpty(s))
{
int n = s.Length;
int i = 0;
while ((i < n) && !IsDigit(s[i])) { i++; }
if (i < n)
{
int start = i;
while ((i < n) && IsDigit(s[i])) { i++; }
int count = i - start;
result = s.Substring(start, count);
}
}
return result;
}
private static bool IsDigit (char c)
{
return ('0' <= c) && (c <= '9');
}
И каков сухой остаток? А никакой:
- не ошибка
- не оптимизация (разницу в скорости работы всей программы никто не увидет, так как не каждый раз этот говнокод вызывается)
Т. е. в моей правке просто нет смысла