И еще раз о goto
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.04.13 14:49
Оценка: 8 (3) -2
Нашелся прикльный примерчик где использование goto выглядит как минимум не хуже альтернативного варианта.

Вопросов два:
1. Какой вариант вам нравится больше?
2. Можно предложить какой-то другой варинат который был бы лучше чем два предложенных?

Производительность имеет значение, так что вариант на класса/лямбдах/дополнительных функциях/использующий лишние проверки не принимается (не приветствуется).

Вариант с goto:
void AddResult(int startPos, int endPos, int startState, int stackLevel, RecoveryStackFrame stackFrame, string text, int fail)
{
  _bestResultsCount++;

  if (_bestResult == null)                 goto good;
  if (endPos     > _bestResult.EndPos)     goto good;
  if (endPos     < _bestResult.EndPos)     return;
  if (startPos   < _bestResult.StartPos)   goto good;
  if (startPos   > _bestResult.StartPos)   return;
  if (stackLevel < _bestResult.StackLevel) goto good;
  if (stackLevel > _bestResult.StackLevel) return;
  if (startState < _bestResult.StartState) goto good;
  return;
good:
  _bestResult = new RecoveryResult(startPos, endPos, startState, stackLevel, stackFrame, text, fail);

}

Вариант без goto:
void AddResult(int startPos, int endPos, int startState, int stackLevel, RecoveryStackFrame stackFrame, string text, int fail)
{
  _bestResultsCount++;

  if (this._bestResult != null)
  {
    if (endPos <= this._bestResult.EndPos)
    {
      if (endPos < this._bestResult.EndPos)
        return;
      if (startPos >= this._bestResult.StartPos)
      {
        if (startPos > this._bestResult.StartPos)
          return;
        if (stackLevel >= this._bestResult.StackLevel)
        {
          if (stackLevel > this._bestResult.StackLevel)
            return;
          if (startState >= this._bestResult.StartState)
            return;
        }
      }
    }
  }

  _bestResult = new RecoveryResult(startPos, endPos, startState, stackLevel, stackFrame, text, fail);
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.