Ответ про goto

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


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


.


.


.


.


.


.


.


.


.


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

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


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

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


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

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

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

Ответ про goto Программирование, Javascript, Goto, Комментарии, Длиннопост
1
Автор поста оценил этот комментарий
меня больше раздражает ассинхронность.

А зря, это по моему единственное что в нем хорошо сделано:)


опошлили асинхронность люди которые делает калбеки для калбеков калбеков калбеков калбеков калбеков калбеков

А если они узнают что есть механизм промисов, то вообще вакханалия начинается

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

До использования промисов, судя по этому нерадостному списку, ещё лет 5, не меньше:)

Либо утяжелять страницы полифилами.

https://developer.mozilla.org/ru/docs/Web/JavaScript/Referen...
http://caniuse.com/#feat=promises

Иллюстрация к комментарию
Иллюстрация к комментарию
показать ответы
1
Автор поста оценил этот комментарий
По твоей ссылке только способ с while, ты наверное забыл прикрепить)

вместо вайл подставь метод на подобии checkServicesInHotel который также будет по ифу ретурн делать:)


Js ругать без толку, так как аналогов пока не предвидится и придётся всё равно писать на нём.

Сам js не плохой язык, у него стандарт и его реализация в некоторых браузерах плохая)

Его жидкая типизация позволяет делать некоторые вещи проще, но и она же позволяет по не внимателности отстрелить себе ногу. У всего есть цена:)

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

Типизация в js ещё пол-беды - меня больше раздражает ассинхронность.

Стоит вызвать какой-нибудь кроссдоменный или обычный ajax-запрос из метода - и очерёдность выполнения теряет предсказуемость. С моими знаниями js - это настоящий кошмар:)

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

показать ответы
1
Автор поста оценил этот комментарий
Но читаемость oneHotelsWithProstitutesInCity - откровенно снизилась.

как по мне "водопадик" из форов тоже так себе читается:)


ЗЫ: плюс используется Object.keys с не самой лучшей поддержкой:

ну это проблема жопных языков, в нормальных языках список ключей получить не проблема:)


Механизм меток есть в Java, Js и D

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

- для джавы нужно ставить виртуальную машину, компилировать исходник и по хитрому запускать.

забей в гугл "java\D\C++\anything online compiler"


PS: а второй способ какой?

Так их два там, через функции и через while, мне через функции больше нравится, while более громоздкий. Еще через рекурсию можно, но этот метод не для всех:)

раскрыть ветку (1)
1
DELETED
Автор поста оценил этот комментарий
в нормальных языках список ключей получить не проблема:)
В js поддержку для старых браузеров можно прикрутить (на mdn есть код полифила), или написать свой аналог на крайний случай. Если в треде js-ники появятся - может просвятят. Js ругать без толку, так как аналогов пока не предвидится и придётся всё равно писать на нём.
забей в гугл "java\D\C++\anything online compiler"
Я слишком развращён нормальными редакторами кода, для использования онлайновых:)
Так их два там, через функции и через while
По твоей ссылке только способ с while, ты наверное забыл прикрепить)
показать ответы
0
Автор поста оценил этот комментарий

как то так, сразу два способа не юзать гото

https://jsfiddle.net/h6spc2fL/1/


ну и как сказали ранее так никто не делает, такой фильтр на серваке на уровне запроса в бд делается) а никак не клиентом.

раскрыть ветку (1)
1
DELETED
Автор поста оценил этот комментарий
Функция checkServicesInHotel - неплохая.

Но читаемость oneHotelsWithProstitutesInCity - откровенно снизилась.
Плюс используется Object.keys с не самой лучшей поддержкой: https://developer.mozilla.org/ru/docs/Web/JavaScript/Referen...

Под мобильными браузерами вообще все вопросики стоят.


Js я выбрал только из-за "полулярности" и простоты проверки. Механизм меток есть в Java, Js и D - для джавы нужно ставить виртуальную машину, компилировать исходник и по хитрому запускать.

PS: а второй способ какой?

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

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

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

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

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

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

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

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

2
Автор поста оценил этот комментарий
а зачем искать проституток на клиенте, когда сервер может выдать сразу правильный набор данных? :-)
раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий

Ну хер знает.

Я выбрал, как самый простой для демонстрации - java код без Jvm не запустишь:)

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

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


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


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

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

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

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

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

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

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

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

показать ответы