Здравствуйте, Философ, Вы писали:
Ф>Если можете предложить лучшее решение — предлагайте.
У выс тут два вопроса:
— можно ли предложить лучшее решение
— нужно ли избегать goto
Ответ на первый вопрос — да, можно. Выше уже предложили.
Ответ на второй — лучше избегать, если это не влечёт больших накладных расходов.
Технически без Goto можно написать всегда. Но иногда (очень редко) с goto получается сильно понятнее.
В современных языках для наиболее частых случаев применения goto придумали специализированные операторы (continue, break). Они обладают теми же недостатками, что goto, но эти недостатки в них смягчены тем, что по причине чётко определённой семантики они меньше вводят в заблуждение.
Пример случая, где goto на мой взгляд уместен — несколько вложенных циклов, внутри самого внутреннего проверяется какое-то условие, по которому должен быть выход из всех циклов сразу. Конечно, можно выделить эти циклы в отдельную функцию и сделать return из середины, но чем это лучше goto?
Здравствуйте, vmpire, Вы писали:
V>Пример случая, где goto на мой взгляд уместен — несколько вложенных циклов, внутри самого внутреннего проверяется какое-то условие, по которому должен быть выход из всех циклов сразу. Конечно, можно выделить эти циклы в отдельную функцию и сделать return из середины, но чем это лучше goto?
А вот в Java его по другому и нельзя использовать. Не скомпилится. Что, в C# не скопировали эту блестящую идею? Странно.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Здравствуйте, Sorc17, Вы писали:
V>>Пример случая, где goto на мой взгляд уместен — несколько вложенных циклов, внутри самого внутреннего проверяется какое-то условие, по которому должен быть выход из всех циклов сразу. Конечно, можно выделить эти циклы в отдельную функцию и сделать return из середины, но чем это лучше goto?
S>А вот в Java его по другому и нельзя использовать. Не скомпилится. Что, в C# не скопировали эту блестящую идею? Странно.
У Вас отличная логика: спросить, предположить, что ответ положительный и удивиться ему
В C# можно переходить на метку можно только из скопа её действия, то есть из блока наружу (но не наружнее, чем стоит метка), но не внутрь.
Насколько я понимаю, это так же, как в Java или очень похоже.
Здравствуйте, vmpire, Вы писали:
V>Технически без Goto можно написать всегда. Но иногда (очень редко) с goto получается сильно понятнее.
В этом умозаключении неявно фигурирует язык на котором у тебя возникают проблемы.
Я знаю как минимум 5 языков в которых вообще нет goto и не возникает никаких проблем по этому поводу.
Так что то что ты думаешь, что что-то знаешь — это от незнания . Освой любой язык претендующий на звание "функциональный" и ты тотчас же изменишь свое мнение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Я не буду приводить примера того как этот код можно было бы переписать без goto. Я просто скажу что твой код — говно. Или как его любят называть в народе — говнокод. Читать его сложно и уныло.
Лучшим решением было бы не пытаться устранить в этом говнокоде goto, а попытаться описать задачу на естественно языке и подумать как ее лучше всего решить не доводя код до состояния говнокода.
За долгие годы программирования я для себя вывел формулу написания хорошего кода — надо писать код думая о том как ты будешь объяснять его окружающим. Оптималным вариантом является описание кода в статье (блоге, сообщении на форуме в скайпе, ...). Как только ты начинаешь думать о том как описать свой код словами, так тот час же понимаешь, что проще переписать код более очевидным образом, нежели пытаться описать некачественный код.
Отличным подспорьем в написании понятного кода является изучение функционального подхода. В прочем, многие так увлекаются им, что доходят до другой крайности. Так что тут нужно быть очень аккуратным.
В общем, не борись с goto. Борись за понятность кода. Начни с того, что приведи здесь внятно описание задачи на естественном (русском) языке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, vmpire, Вы писали: V>>Технически без Goto можно написать всегда. Но иногда (очень редко) с goto получается сильно понятнее. VD>В этом умозаключении неявно фигурирует язык на котором у тебя возникают проблемы.
Этот язык явно фигурирует в названии топика
VD>Я знаю как минимум 5 языков в которых вообще нет goto и не возникает никаких проблем по этому поводу.
Я тоже знаю намного больше одного языка, смысла заниматься фаллометрией не вижу.
С goto у меня проблем не возникает, в проектах использовать не приходилось ни разу, за исключением версий break/continue и языков, где без него нельзя никак.
VD>Так что то что ты думаешь, что что-то знаешь — это от незнания .
Это ты думаешь, что знаешь, что я думаю. Но это, как ты сам сказал, от незнания
VD>Освой любой язык претендующий на звание "функциональный" и ты тотчас же изменишь свое мнение.
Изменю мнение о том, что в C# бывают случаи, когда goto оправдан? Как C# связан с функциональными языками?
Вы действительно считаете, что отсутствие goto в одних языках это довод за то, что он не нужен и в других? Тогда вот вам контрпример: напишите, пожалуйста, что-нибудь без goto на ассемблере.
Здравствуйте, WolfHound, Вы писали:
WH>Мне интересно с каким из озвученных фактов не согласны минусующие?
С понятием "тупой язык" и неявным утверждением, что на C# показанный способ невозможен
Здравствуйте, vmpire, Вы писали:
VD>>В этом умозаключении неявно фигурирует язык на котором у тебя возникают проблемы. V>Этот язык явно фигурирует в названии топика
Сори. Как-то в шапку я забыл второй раз заглянуть когда читал само сообщение. Однако же даже в рамках C# понятнее от наличия goto ни разу еще не становилось. Если нужны goto, то стоит подумать над более детальным продумыванием алгоритма.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, WolfHound, Вы писали:
WH>Мне интересно с каким из озвученных фактов не согласны минусующие?
А почему сразу несогласны? Просто больно людям за бесцельно прожитые дни (с).
Если серьезно, то ты не прав, конечно. Язык не тупой (есть множество тупее). Он просто не очень удобный. В данном случае он просто провоцирует на говнокод. Но это свойство любого приемущественно императивного языка. В том числе Явы, С++, С, Паскаля и т.п.
Когда ты мыслишь циклами, то вопрос входа и выхода из двух вложенных циклов возникает сам собой. Это вопрос времени.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, vmpire, Вы писали:
V>С понятием "тупой язык" и неявным утверждением, что на C# показанный способ невозможен
Ну тебе и флаг в руки. Перепиши на C#.
Вот только там нет ни локальных функций ни оптимизации хвостовой рекурсии.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>Мне кажется надо подкрутить движок сайта... чтобы минус от minorlogic (полученный вне форума С++) заменялся бы на 3, нет, 5 плюсов!