Считаете ли вы эту технику "ПЛОХОЙ"? - PullRequest
20 голосов
/ 28 октября 2008

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

Так что я делаю трюк так:

do
{
   bool isGood = true;

   .... some code

   if(!isGood)
       break;

   .... some more code

   if(!isGood)
       break;

   .... some more code

 } while(false);

 ..... some other code, which has to be executed.

Я использую «фальшивый» цикл, который запускается один раз, и я могу прервать его, набрав break или continue .

Некоторым моим коллегам это не понравилось, и они назвали это «плохой практикой». Лично я нахожу такой подход довольно гладким. Но что ты думаешь?

Ответы [ 28 ]

1 голос
/ 28 октября 2008

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

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

1 голос
/ 28 октября 2008

Я бы сказал, что ваше решение может быть правильным, но это зависит. Пол Томблин опубликовал ответ, который лучше (серия трубок if) ... если его можно использовать.

Решение Павла не может быть использовано, когда в вашем цикле выполняются дорогостоящие инициализации объекта. Если созданные объекты используются на более поздних этапах, решение do while (0) лучше.

Тем не менее, именование переменных должно быть улучшено. Кроме того, зачем так часто использовать переменную escape? Вместо этого перехватывайте каждое отдельное условие ошибки и прерывайте цикл, чтобы было очевидно, что вызывает разрыв в каждой точке.

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

Другие считают, что это сложная для понимания идиома. Ну, во-первых, вы можете поместить комментарий, как предложено в верхней части цикла. Во-вторых, do-while (0) - это нормальная и распространенная идиома в макросах, которую все программисты на Си должны распознавать немедленно, поэтому я просто не покупаю это.

0 голосов
/ 28 октября 2008

Мета-комментарий: Когда вы пишете код, ваша цель должна быть в первую очередь ясным, поддерживаемым кодом. Вы не должны отказываться от разборчивости на алтаре эффективности, если вы не профилируете и не докажете, что это необходимо и что это действительно улучшает ситуацию. Трюки с джедаями следует избегать. Всегда думайте, что следующий парень, который будет поддерживать ваш код, это большой подлый психопат с вашим домашним адресом. Я, например.

0 голосов
/ 28 октября 2008

Это то, для чего нужны исключения. Вы не можете продолжать логику, потому что что-то пошло не так. Даже если выздоровление тривиально, оно все же является исключением. Если у вас есть действительно веская причина не использовать исключения, например, когда вы программируете на языке, который их не поддерживает, используйте условные блоки, а не циклы.

0 голосов
/ 28 октября 2008

Я думаю, что люди здесь не честны.

Если бы я, как руководитель вашей команды, увидел бы код, подобный этому, вы были бы на высоте один на один и помечены как потенциальная проблема для команды, поскольку этот фрагмент кода особенно ужасен.

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

0 голосов
/ 28 октября 2008

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

Почему бы просто не использовать

if(isGood)
{
...Execute more code
}

0 голосов
/ 28 октября 2008

Если разбить код между , если (! IsGood) разбить; на отдельные функции, можно получить десятки функций, содержащих всего пару строк, так что исполнители ничего не упростят. Я не мог использовать return , потому что я не готов покинуть функцию, есть еще штука, которую я хочу сделать там. Я согласен с тем, что, вероятно, мне следует просто согласиться на отдельное условие if (isGood) {...} для каждой части кода, которую я хочу выполнить, но иногда это приведет к МНОГО фигурных скобок. Но я полагаю, что я согласен с тем, что людям не очень нравится этот тип строительства, поэтому условия для всего крутятся!
Спасибо за ваши ответы.

0 голосов
/ 28 октября 2008

Я думаю, что в технике нет ничего плохого. Я думаю, что я бы удостоверился, что bool назван чем-то более наглядным, чем isGood. Хотя, теперь, когда я смотрю на это, почему бы не поместить весь код, который находится в цикле, в один блок if (! IsGood)? Цикл выполняется только один раз.

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