Многие люди недавно обвиняли меня в том, что я упомянул только одно слово - "goto".
Меня удивляет, почему это считается таким противным словом.
Мне известно о нескольких предыдущих обсуждениях этой темы,но это не убеждает меня - s ome ответов просто говорит "это плохо", даже не пытаясь объяснить , а некоторые приводят причины, не относящиеся к языкам сценариев, таким как PHP, IMO .
В любом случае, я собираюсь задать очень конкретный вопрос:
Давайте сравним goto
и throw
заявления.
Оба, на мой взгляд, делают одно и то же: избегая выполнения некоторыхчасть кода, основанная на некотором условии.
Если это так - имеют ли throw
те же недостатки, что и goto?(если есть)?
Если нет - то какая разница?
Кто-нибудь достаточно опытный, кто может сказать фундаментальную , концептуальную разницу между структурами кода двух следующих фрагментов кода?
Относительно этих самых фрагментов кода, а не "в теории" или "в общем "или" вот хороший комикс XKCD! ".
Почему первый считается блестящим, а второй - самым смертельным из грехов?
#$a=1;
#$b=2;
/* SNIPPET #1 */
try {
if (!isset($a)) {
throw new Exception('$a is not set');
}
if (!isset($b)) {
throw new Exception('$b is not set');
}
echo '$a + $b = '.($a + $b)."<br>\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "<br>\n";
}
/* SNIPPET #2 */
if (!isset($a)) {
$message = '$a is not set';
goto end;
}
if (!isset($b)) {
$message = '$b is not set';
goto end;
}
echo '$a + $b = '.($a + $b)."<br>\n";
end:
if (!empty($message)) {
echo 'Caught exception: ', $message, "<br>\n";
}
Обратите внимание, что мне известен тот факт, что бросок более силен и гибок в приготовлении спагетти .Это не имеет принципиального значения для меня.Это вопрос использования, а не концепции.
РЕДАКТИРОВАТЬ
Многие люди говорили мне, что первый пример должен быть более новым.
Причина: следует использовать исключенияобрабатывать только ошибки, а не реализовывать бизнес-логику.
Это выглядит разумно.
Таким образом, единственный способ остановить бесполезное выполнение кода - это перейти к (не говоря уже о некоторых подстановках, таких как while, return и т. д.), что такое же дело, но сложнее реализовать)?