в то время как (1).. повреждение вместо goto

Я любовь FLOSS Weekly . Другой Подкаст Упрека, где Leo и Randal Schwartz берут интервью у фанатов с открытым исходным кодом. Моим фаворитом было их интервью с Dan Ingalls (Известность Smalltalk/Squeak). Я также наслаждался их интервью Richard Hipp (SQLite).

17
задан Community 23 May 2017 в 11:58
поделиться

12 ответов

Когда я это делаю следующее

import sqlite3
dir(sqlite3)

Я не вижу ни одного из методов API резервного копирования .

Следовательно, ответ - нет; вы не можете получить доступ к API из модуля sqlite3. Похоже, что никто его не реализовал.

В некоторых случаях вам может потребоваться поэтапная очистка: например, когда вы открываете дескриптор файла, выделяете некоторую память, читаете из файла ... если чтение не удается, вам необходимо очистить malloc. Если malloc не работает, вам не нужно его очищать, но вам все равно нужно очистить дескриптор файла. С goto у вас может быть одна метка на этап очистки и переходить точно в нужную точку в зависимости от того, где произошла ваша ошибка.

По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро ​​Linux? Если да, то не может быть того плохого». Замените ядро ​​linux любым другим хорошим примером современной разработки программного обеспечения.

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

По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро ​​Linux? Если да, то не может быть того плохого». Замените ядро ​​linux любым другим хорошим примером современной разработки программного обеспечения.

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

По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро ​​Linux? Если да, то не может быть того плохого». Замените ядро ​​linux любым другим хорошим примером современной разработки программного обеспечения.

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

По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро ​​Linux? Если да, то не может быть того плохого». Замените ядро ​​linux любым другим хорошим примером современной разработки программного обеспечения.

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

По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро ​​Linux? Если да, то не может быть того плохого». Замените ядро ​​linux любым другим хорошим примером современной разработки программного обеспечения.

На мой взгляд, слепое избегание GOTO из-за широко распространенной ненависти к нему вреднее, чем тщательное обоснование случая его использования в каждом конкретном случае. Я использую эмпирическое правило: «делает ли это ядро ​​Linux? Если да, то не может быть того плохого». Замените ядро ​​linux любым другим хорошим примером современной разработки программного обеспечения.

На мой взгляд, слепое избегание GOTO из-за широко распространенной ненависти к нему вреднее, чем тщательное обоснование случая его использования в каждом конкретном случае. Я использую эмпирическое правило: «делает ли это ядро ​​Linux? Если да, то не может быть плохим». Замените ядро ​​linux любым другим хорошим примером современной разработки программного обеспечения.

33
ответ дан 30 November 2019 в 10:03
поделиться

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

10
ответ дан 30 November 2019 в 10:03
поделиться

Хотя использование goto обычно не рекомендуется, В некоторых редких ситуациях, подобных вашей, лучшие практики не являются лучшими.

Итак, если goto дает наиболее четкий код, я бы использовал его. использование цикла while (true) для имитации goto - это что-то неестественное. Что вам действительно нужно, так это goto!

7
ответ дан 30 November 2019 в 10:03
поделиться

Почему бы не использовать серию операторов if ? Я обычно пишу это так, так как считаю его более понятным, чем цикл:

bool ok = true;

do_something();
if (was_an_error()) ok = false;

if (ok)
{
    do_something_else();
    if (was_an_error()) ok = false;
}

if (ok)
{
    do_something_else_again();
    if (was_an_error()) ok = false;
}

[...]

[Cleanup code]

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

5
ответ дан 30 November 2019 в 10:03
поделиться

Используйте его, если вы не можете использовать goto по какой-либо причине

  • , запрещенной в соглашениях вашего проекта
  • , запрещенной вашим инструментом lint

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

#define DO_ONCE for (int _once_dummy = 0; _once_dummy < 1; _once_dummy++)
2
ответ дан 30 November 2019 в 10:03
поделиться

Обычно GOTO считаются плохими, но в некоторых местах, где есть только прямые переходы через GOTO, они не так плохи. Люди избегают GOTO, как чумы, но хорошо продуманное использование GOTO иногда оказывается лучшим решением, ИМХО.

3
ответ дан 30 November 2019 в 10:03
поделиться

Я думаю, что это использование (для управления ресурсами) goto является хорошо.

2
ответ дан 30 November 2019 в 10:03
поделиться

Никогда не используйте цикл условий с постоянно истинным условием. Поскольку условие всегда истинно, зачем использовать условный цикл?

Постоянно истинные условия наиболее непосредственно представлены оператором goto.

1
ответ дан 30 November 2019 в 10:03
поделиться

Мне нравится подход while (1). Сам пользуюсь. Особенно, когда цикл может повторяться при продолжении, например, когда элемент обрабатывается внутри такого цикла, и это выполняется несколькими способами.

1
ответ дан 30 November 2019 в 10:03
поделиться

Хотя использование "goto" для ситуаций обработки ошибок довольно распространено, я все же предпочитаю решение "while" (или "do while"). В случае "goto" компилятор может гарантировать гораздо меньше вещей. Если вы сделаете опечатку в названии метки, компилятор вам не поможет. Если кто-то использует другой переход к другой метке в этом блоке, есть большая вероятность, что код очистки не будет вызван. Когда вы используете более структурированные конструкции управления потоком, вам всегда гарантируется, какой код будет выполняться после завершения цикла.

0
ответ дан 30 November 2019 в 10:03
поделиться

«break» понимает семантику области видимости блока, в то время как «goto» не обращает на это внимания. Другими словами, «while-break» может быть переведено на функциональные языки, такие как Lisp, с хвостовой рекурсией, «goto» - нет.

5
ответ дан 30 November 2019 в 10:03
поделиться

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

error = (!error) && do_something1();
error = (!error) && do_something2();
error = (!error) && do_something3();

// Cleanup code
8
ответ дан 30 November 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: