Упростить логику вложенных циклов - PullRequest
0 голосов
/ 23 февраля 2011

У меня возникли проблемы при попытке упростить некоторую логику, содержащуюся во вложенных циклах

Ниже я предоставил некоторый псевдокод, который является основой того, с чем я имею дело.Фактический код является более сложным и содержит несколько структур вложенных циклов.

Я отвечаю за поддержание этого кода, я не являюсь его первоначальным автором

Будет ли это место, в котором действует goto.

while(CONDITION)
{
  while(CONDITITION2)
  {
    if(CONDITION3)
      break CONDITION2

    if(CONDITION4)
      break CONDITION
  }
}

Существует много сложностей с выполнением этих разрывов кода.

Мне не разрешено использовать goto, но я думаю, что это будетбыть более простым решением, чем то, что я сейчас пытаюсь сделать.Должен ли я попытаться оправдать использование goto в этом случае.спасибо

ПРАШАНТ:)

Ответы [ 6 ]

3 голосов
/ 23 февраля 2011

Введите переменную

bool breakOuter = false;
while(CONDITION)
{
  while(CONDITITION2)
  {
    if(CONDITION3)
      break;

    if(CONDITION4)
    {
      breakOuter = true;
      break;
    }
  }
  if(breakOuter)
    break;
}
1 голос
/ 23 февраля 2011

Даже не зная контекста полностью, я могу сказать, что не хотел бы быть следующим программистом в этом коде.

LINQ, возможно, несколько упростит его.Если вы используете ReSharper, он предложит вам это, если сможет.

Помимо этого, я бы еще немного подумал о том, как мне добраться до этих вложенных циклов и попытаться избавиться от них.как можно больше.Лучшая объектная модель или разумное использование шаблонов может дать вам лучшее и более удобное решение.

1 голос
/ 23 февраля 2011

Вы настраиваете себя на грязный и сложный код. Рассмотрим LINQ, если это возможно (сами циклы практически пахнут в наши дни, особенно сложными), в противном случае рассмотрим рефакторинг внутреннего цикла в отдельный метод и использование return;.

Редактировать: отличный пост Эрика Липперта с критикой различных альтернатив для этой проблемы: http://blogs.msdn.com/b/ericlippert/archive/2010/01/11/continuing-to-an-outer-loop.aspx

1 голос
/ 23 февраля 2011

Когда Java (не C #, но релевантный) принял решение запретить goto, они обнаружили в профилировании кода, что 90% всех goto были использованы для циклов, а остальные использовались для действительно плохих вещей.

Перерыв и продолжить все еще существуют, потому что они законные, локализованные gotos, которые работают.Обязательно задокументируйте, куда они идут и почему они это делают, но они все еще очень полезны.

Похоже, вы используете их наиболее эффективным способом.

1 голос
/ 23 февраля 2011

Используйте переменную для условия 1:

bool condition1 = true;
while (CONDITION && condition1)
{
    while (CONDITION2)
    {
        if (CONDITION3)
            break;
        if (CONDITION4)
        {
            condition1 = false;
            break;
        }
    }
}
0 голосов
/ 23 февраля 2011

Как насчет:

while(CONDITION)
{
  while(CONDITITION2)
  {
    if(CONDITION3)
      break CONDITION2

    if(CONDITION4)
      break CONDITION2
  }
  if(CONDITION4)
    break CONDITION
}

Вы также можете попытаться перевести условия прерывания в условия while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...