Очередная интересная по программированию из нашего паблика Physics.Math.Code. Операторы goto и совместное использование кода в блоке else. Одна из возможных ситуаций, в которой некоторые программисты захотят использовать goto, — это случай, когда у вас есть две проверки условия и блок else и вы хотите выполнить код одного из условий и блока else. Вот пример варианта, который может кого-нибудь подвигнуть к использованию goto.
Это хороший, логически извилистый пример: его практически невозможно читать в том виде, в каком он есть, и тяжело правильно переписать без goto. Если вам кажется, что вы легко преобразуете его в вариант без goto, попросите кого-нибудь проверить ваш код! Несколько экспертов-программистов переписали его некорректно.
Вы можете изменить этот код разными способами. Можно продублировать код, вынести общий код в отдельный метод и вызывать его из двух мест или повторно проверять одно и то же условие. В большинстве языков новая версия будет больше и медленнее оригинала, но совсем не намного. Поэтому, если этот код не исключительно критичен к скорости и объему, перепишите его, не задумываясь об эффективности.
Лучший способ переписать этот код — вынести участок // Много кода в отдельный метод. После этого вы сможете вызывать его из тех мест, где раньше располагались goto и метка его перехода. Это позволит сохранить оригинальную структуру условного оператора. Но попробуйте переписать данный участок кода без использования отдельного метода.
Я тоже попробовал сделать эту задачку. В общем, код какой-то запутанный в случае с GoTo, хотя и небольшой. Чтобы не ошибиться во время переделывания на if-else ветки, решил сначала составить таблицу истинности для кода с goto, чтобы сразу бросалось в глаза что должно выполняться в зависимости от этих двух bool (boolean) переменных. Сидел на ноуте, на котором был только компилятор Pascal, так что написал на нем и проверил 4 различных комбинации. Всё совпало с таблицей истинности. Но мне даже показалось, что с goto это будет работать быстрее. В любом случае на уровне asm это всё превратится в goto переходы.
Не нужно думать, что использование данного оператора - это плохой тон. Всегда есть ситуации, где это действие оправдано. В большинстве случаев этого усложнения кода можно избежать.
Статья о том, что делать с оператором GoTo и так ли он плох, как его ругают бесполезные критики
Еще много полезного и интересного вы сможете найти на наших ресурсах: