Ответ про goto

Это бессмысленный длиннопост о программировании с задачей о пользе goto, создан как ответ на комментарий: #comment_79923933


Ставь минус и листай дальше:)


.


.


.


.


.


.


.


.


.


Выдуманная задача: данные полученны с сервера, допустим декодированны из Json.

Нужно получить ассоциативный массив (js-объект) одного отеля в каждом городе с сервисом "проституток", где ключ - имя города, значение - имя отеля. Если в отеле есть сервис "церковная кабинка" - проституток там гарантированно нет. Если в городе нет отелей с проститутками - вместо имени отеля заносится соответствующее сообщение.


Песочница: https://jsfiddle.net/dmcbnpp1/

HTML-страница с кодом: http://pastie.org/10991634


Скриншот в редакторе:

Ответ про goto Программирование, Javascript, Goto, Комментарии, Длиннопост

Результат в Firefox:

Ответ про goto Программирование, Javascript, Goto, Комментарии, Длиннопост
Вы смотрите срез комментариев. Показать все
3
Автор поста оценил этот комментарий

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


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


И ещё, небольшое замечание:

с той же вычислительной сложностью (без лишних итераций)

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

раскрыть ветку (4)
DELETED
Автор поста оценил этот комментарий

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

У меня проект не "реальный", а только в качестве примера. Меня несколько удивляют такие запреты - если в языке есть простой и понятный механизм, почему его запрещают использовать. Я понимаю, допустим для языка GO - там подобные best practice вроде в компилятор вшиты:)

Или другая крайность - C/C++. Но в этих языках (Java, Js) ограничение - только внутри циклов.

Если попаду в такую компанию на работу - первое время буду об стену головой стучаться.

раскрыть ветку (3)
2
Автор поста оценил этот комментарий

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

раскрыть ветку (2)
4
Автор поста оценил этот комментарий
Ответ простой: прыжки затрудняют

В примере автора не совсем гото, это инструмент для прерывания итерации верхних циклов из вложенных. как гото его использовать нельзя.

0
DELETED
Автор поста оценил этот комментарий

Так в том и суть, что это не тот goto, которого раньше боялись:)

Тут жёстко ограничен скоуп для действия - только внутри циклов, только c break/continue.

У него и название другое, label: https://developer.mozilla.org/ru/docs/Web/JavaScript/Referen...

Если не писать циклы длинной в 200 строк - никаких проблем не возникнет, даже теоретически.

Но настаивать не буду. Если на проекте/в компании будет требование без label - буду писать без label. Но мне эта языковая фича нравится.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку