Под давлением перейти на темную сторону

У нас есть ситуация, когда разработчики, работающие над устаревшей (базовой) системой, вынуждены использовать операторы GOTO при добавлении новых функций в существующий код, который уже заражен спагетти-кодом.

Теперь я понимаю, что могут быть аргументы в пользу использования «всего лишь одного маленького GOTO» вместо того, чтобы тратить время на рефакторинг до более удобного в обслуживании решения. Проблема в том, что этот изолированный «только один маленький GOTO» не так изолирован. По крайней мере, раз в неделю или около того нужно добавить новый «один маленький GOTO». С этой кодовой базой уже ужасно работать из-за того, что код, датируемый 1984 годом или ранее, был пронизан GOTO, что сделало бы многие Пастафари считают, что его вдохновил сам Летающий спагетти-монстр.

К сожалению, на языке, на котором это написано, нет готовых инструментов рефакторинга, поэтому становится сложнее продвигать «Рефакторинг для повышения продуктивности позже», потому что краткосрочные победы - единственные победы, на которые здесь обращено внимание ...

Кто-нибудь еще сталкивался с этой проблемой, когда все соглашаются с тем, что мы не можем добавлять новые GOTO для перехода на 2000 строк в случайный раздел, но аналитики постоянно настаивают на том, чтобы сделать это только один раз и получить одобрение руководства?

tldr;

Как можно решить проблему, когда разработчиков заставляют (заставляют) постоянно добавлять операторы GOTO (под словом «добавить» я имею в виду «добавить» для перехода к случайным разделам, находящимся на расстоянии многих строк), потому что он «получает эту функцию в быстрее?

Я начинаю опасаться, что из-за этого хищники могут потерять ценных разработчиков ...

Кредит: XKCD

Уточнение:

Перейти here

alsoThere: Нет, я говорю о типе goto, который переводит 1000 строк из одной подпрограммы в другую на середине цикла while. Перейти somewhereClose

there: Я даже не говорил о типах gotos, которые можно разумно прочитать и определить, что делает программа. Перейти alsoThere

somewhereClose: Это своего рода код, который делает фрикадельки midpoint: Если здесь впервые, Goto nextpoint detail: (каждый почти полностью отличается) Goto pointlessReturn

here: В этом вопросе я не говорил о иногда допустимом использовании goto. Перейти there

tacoBell:, и он только что вернулся к чертежной доске. Перейти Jail

elsewhere: Когда аналитикам требуются недели, чтобы расшифровать, что программа делает каждый раз, когда к ней прикасаются, что-то глубоко не так с вашей кодовой базой. Фактически, я на самом деле до моего hell: если не обновленного goto 4 представления спецификации goto detail pointlessReturn: goto tacoBell

Jail: Собственно просто небольшое обновление с маленькой победой. Я потратил 4 часа на рефакторинг части этой конкретной программы, по одной метке за раз, сохраняя каждую итерацию в svn по ходу. Каждый шаг (около 20 из них) был небольшим, логичным и достаточно простым, чтобы goto bypass nextpoint: спонтанно выпрыгивал из еды и попадал на экран через какой-то странный магнетизм спагетти-фрикаделек. Перейти elseWhere bypass: убедитесь, что он не должен вносить никаких изменений в логику. Используя эту новую, более читаемую версию, я сел с аналитиком и завершил почти все это изменение. Перейти end

4: первый * если первый раз здесь goto hell, нет второго если первый раз здесь goto hell, нет третьего если первый раз здесь goto hell четвертый сейчас до- дата перехода hell

end:


person Dan McGrath    schedule 26.05.2010    source источник
comment
Вы пробовали сказать аналитикам хотя бы один раз, чтобы они попали в ад?   -  person Chris    schedule 26.05.2010
comment
goto careers.stackoverflow.com; careers.stackoverflow.com: опубликовать (резюме); доставить (уведомление);   -  person Anthony Pegram    schedule 26.05.2010
comment
@ Крис: В языке есть операторы ON x GOTO a, b, c ... Я предлагал сделать X константой с именем bestPractices, присвоенной 1, и изменить метку на 'Hell', но она никогда не проходит мимо аналитика ...   -  person Dan McGrath    schedule 26.05.2010
comment
Вот и проблема, аналитики, которые говорят, как должен выглядеть код. Это и диалект VB, который вы используете :) Шучу.   -  person Igor Zevaka    schedule 26.05.2010
comment
Я не могу предложить никаких решений, но ваш текст великолепен.   -  person Kim Reece    schedule 01.06.2010
comment
Я просто хочу сказать браво. Это самое ясное разъяснение, которое я когда-либо видел.   -  person jmucchiello    schedule 03.06.2010
comment
Мне нужно было перечитать его несколько раз, чтобы убедиться, что он правильный;)   -  person Dan McGrath    schedule 04.06.2010
comment
@ Энтони Пеграм. Готово, когда он впервые вышел. К сожалению, это не так известно австралийским компаниям ... careers.stackoverflow.com/mcgrath   -  person Dan McGrath    schedule 09.06.2010
comment
@Dan McG: О переписывании 3000 программ вручную не может быть и речи, согласен. Однако автоматизированные инструменты использовались для безопасной реструктуризации гнезд gotorat в чистый, хорошо структурированный код. И да, есть есть инструменты, которые могут рефакторинг кода Pick. Если вы хотите узнать больше, попросите подробное описание таких инструментов.   -  person Ira Baxter    schedule 25.08.2010
comment
Есть законные причины для использования goto. Но он не из их числа.   -  person pyon    schedule 28.02.2011
comment
Три года спустя - как все обернулось?   -  person chux - Reinstate Monica    schedule 20.06.2013
comment
@chux, 2 года назад я переехал в США, чтобы работать в большой компании-разработчике программного обеспечения. В то время я начал знакомить с SVN и продемонстрировал, как можно реорганизовать код до чего-то более удобного для сопровождения, не теряя при этом риска поломки.   -  person Dan McGrath    schedule 24.06.2013
comment
@DanMcGrath Как назывался язык, с которым вы работали пять с половиной лет назад?   -  person Noctis Skytower    schedule 14.01.2016


Ответы (10)


Сколько ошибок было внесено из-за неправильно написанных GOTO? Сколько денег они обошлись компании? Превратите проблему в нечто конкретное, а не «это плохо». Как только вы сможете добиться того, чтобы ответственные люди признали ее проблемой, превратите ее в политику вроде «никаких новых GOTO для чего-либо, кроме упрощения логики выхода для функции» или «никаких новых GOTO для любых функций, которые не иметь 100% охват модульных тестов ". Со временем политика ужесточается.

person twk    schedule 26.05.2010
comment
Чтобы избавиться от проблемы, избавьтесь от людей, которые неправильно пишут gotos. Когда все сделано правильно, в goto нет ничего плохого. - person Cheery; 01.06.2010

GOTO не делают хороших спагетти с кодом, здесь задействовано множество других факторов. Это обсуждение списка рассылки linux может помочь увидеть некоторые вещи в перспективе (комментарии Линуса Торвальдса о более крупном изображение использования gotos).

Попытка ввести политику «запрета перехода» только ради того, чтобы не было переходов, ничего не даст в долгосрочной перспективе и не сделает ваш код более удобным для сопровождения. Изменения должны быть более тонкими и сосредоточенными на повышении общего качества кода, продумать использование лучших практик для платформы / языка, охват модульных тестов, статический анализ и т. Д.

person Igor Zevaka    schedule 26.05.2010
comment
Я бы прочитал список, но он заблокирован на работе (я, наверное, раньше читал его дома). Позвольте мне заверить вас, что использование GOTO, которое нас беспокоит, делает ** отличный ** спагетти-код. В конце концов, почему бы не выпрыгнуть из цикла из одной подпрограммы в середину блока if в другой подпрограмме ... - person Dan McGrath; 26.05.2010
comment
Достаточно справедливо, это довольно зло. - person Igor Zevaka; 26.05.2010
comment
Многие люди забыли контекст письма Дейкстры. Проблема заключалась не в инструкции GOTO. Проблема заключалась в том, что в языках, созданных в 1960-х годах, часто не хватало базового потока управления, такого как операторы while, и вам приходилось использовать GOTO для выполнения чего-либо. - person dan04; 26.05.2010
comment
@ dan04: +1 для того, кто на самом деле прочитал и, что более важно, понял письмо Дейкстры. @Igor: +1 за указание на то, что политика запрета goto бессмысленна, учитывая, что одна из первых вещей, к которой люди обращаются при удалении goto, - это, например, так называемая мерзость godo: do { ... break; ... break; ... break; } while (false) в C. - person JUST MY correct OPINION; 31.05.2010
comment
@ Just MY: Согласен. Однако говорить, что нельзя делать одни плохие практики, потому что другие делают другие, - бессмысленно. Заставьте их правильно написать свой код! Если goto ДЕЙСТВИТЕЛЬНО вызван, тогда хорошо, сделайте это. Однако не используйте его как молоток для всех гвоздей. - person Dan McGrath; 31.05.2010
comment
Дейкстра также интересовался формальным статическим анализом, который вызывает крик, когда появляется goto (или доступ к памяти, или исключения, или ...). - person Paul Nathan; 01.06.2010
comment
Я согласен с этим. Сосредоточьтесь не на теоретических аспектах использования / неиспользования Goto, а вместо этого посмотрите на аспект упрощения сопровождения кода. - person gnlogic; 03.06.2010
comment
Я создаю инструменты статического анализа. GOTO не усложняют статический анализ; Достаточно легко построить реальный потоковый граф кода, включая GOTO, которые идут в глупые места .. Что затрудняет статический анализ, так это сумасшедшие правила определения объема (C ++), сложные или скрытые потоки данных (COBOL) и указатели на функции с приведением типов (C ), или (единственная проблема GOTO) и косвенный GOTO. GOTO сводят людей с ума, потому что эталонный код находится далеко и не вписывается ни в какую модель структуры программы, которую может иметь программист. Статические анализаторы они особо не беспокоят, потому что у таких анализаторов нет мнений. - person Ira Baxter; 03.06.2010
comment
@ Дэн МакГ: На каком языке написана ваша кодовая база? Стандарт C требует, чтобы goto ограничивался метками только в включающей функции. - person dreamlax; 09.06.2010
comment
@dreamlax, это касалось системы нашего хоста UniData. stackoverflow.com/questions/ К сожалению, любая форма разумной локальной области видимости в UniData обычно отвергалась сообщество, когда его когда-то просили ... :( - person Dan McGrath; 09.06.2010
comment
К сожалению, ненависть гото превратилась в культ карго. Вы можете легко написать спагетти-код без goto, и я могу даже возразить, что многие современные языки это поддерживают. - person kyoryu; 19.07.2010

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

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

  1. Примите запрос и подтвердите, что вы всегда будете это делать.

  2. Примите заявку и сразу приступайте к поиску новой работы.

  3. Откажитесь от дел и будьте готовы бороться, чтобы исправить беспорядок.

  4. Подать в отставку.

Какой вариант вы выберете, будет зависеть от того, насколько вы цените свою работу и свою самооценку.

person drekka    schedule 26.05.2010
comment
В качестве примечания: бывают ситуации, когда GOTO является правильным ответом. Но их очень мало и они не похожи на приведенные вами примеры. - person drekka; 26.05.2010
comment
Я просто попробовал вариант 5, отправьте ссылку на этот вопрос в Аналст. Он рассмеялся, а через 10 минут я увидел, что в спецификацию записывается еще один оператор goto ... вздох. - person Dan McGrath; 26.05.2010

Может быть, ты сможешь использовать схему бойскаута: оставь место немного более чистым, чем ты его нашел. Итак, для каждого запроса функции: не вводите новые goto, а удалите один.

Это не потратит слишком много времени на улучшения, даст больше времени на поиск новых ошибок. Возможно, это не будет стоить много дополнительного времени, если вы удалите goto из части, которая, хотя и должна была потратить время на понимание и внедрение новой функции.

Утверждают, что 2-часовой рефакторинг сэкономит 20 раз по 15 минут в будущем и позволит быстрее и глубже улучшить.

person user unknown    schedule 03.06.2010
comment
Это было то, что мы пытались сделать. Однако наша команда - это большая команда проектов, где мы работаем над большим расширением функциональности. Это означает, что большая часть кода, с которым мы работаем, представляет собой либо участки завершенного нового кода, либо участки, требующие редактирования устаревшего кода. В последнем случае нас заставляли добавлять новые функции к уже плохому коду с такими же плохими «хаками» goto. Это означало, что когда нам нужно будет снова его поменять через 6 месяцев, будет еще хуже ... - person Dan McGrath; 03.06.2010

Вернемся к принципам:

  • Это читается?
  • Это работает?
  • Это ремонтопригодно?
person Carlos    schedule 26.05.2010
comment
Нет, да, едва. 1/3. Это читается? No не может определить бизнес-логику 80% + кодовой базы без глубокого анализа перед внесением изменений. Это указывает на довольно большие проблемы прямо здесь ... Это работает? Большую часть времени. Это ремонтопригодно. Точно так же, как и весь код спагетти, вы в конечном итоге добьетесь этого благодаря настойчивости. Есть причина, по которой у нас есть 19 разработчиков (40+ в ИТ) для компании из 400 человек, которая НЕ занимается разработкой программного обеспечения или даже не связана с ИТ. - person Dan McGrath; 26.05.2010
comment
Похоже, это не просто GOTO, это ваша проблема. Вашей компании необходимо переосмыслить кодовую базу. Наверное, перепроектируют, перепишут. Они также могут захотеть подумать о том, сколько денег они могли бы сэкономить, если бы все сделали правильно. - person Carlos; 26.05.2010
comment
Полностью согласен, но о переписывании 3000+ программ не может быть и речи, их тоже надо атаковать. Однако в нынешнем виде мы не можем даже получить небольшую победу в улучшении тех, над которыми мы работаем, а вместо этого вынуждены делать их хуже! Просто пытаюсь сначала выиграть здесь несколько небольших сражений ... - person Dan McGrath; 27.05.2010

Это классический конфликт «менеджмент» и «технари».

Несмотря на то, что я принадлежу к команде «технарей», за эти годы я твердо остановился на «управленческой» стороне этих дебатов.

Есть ряд причин для этого:

  1. С помощью gotos вполне возможно создать хорошо написанные, легко читаемые, правильно структурированные программы! Спросите любого программиста на ассемблере; условная ветвь и примитивный цикл do - все, с чем им нужно работать. Просто потому, что «стиль» не актуален и не означает, что он плохо написан.

  2. Если это беспорядок, то извлечение бизнес-правил, которые вам понадобятся, будет настоящей проблемой, если вы собираетесь полностью переписать программу, или, если вы выполняете технический рефакторинг программы, вы никогда не будете уверены, что Поведение отремонтированной программы «правильное», т. е. она делает то же самое, что и старая программа.

  3. Возврат инвестиций - соблюдение исходного стиля программирования и внесение минимальных изменений потребует минимальных усилий и быстро удовлетворит запросы клиентов. Тратить много времени и усилий на рефакторинг будет дороже и потребуется больше времени.

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

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

И если вы все же решите провести рефакторинг через пять лет, какой-нибудь заносчивый выпускник колледжа будет жаловаться на то, что ваша отреставрированная программа больше не соответствует модному слову, и требовать, чтобы ему разрешили потратить недели на ее переписывание.

Если он не сломан, не чините его!

PS: Даже Джоэл считает это плохой идеей: то, что вам никогда не следует делать

Обновлять!-

Хорошо, если вы хотите провести рефакторинг и улучшить код, вам нужно сделать это правильно.

Основная проблема заключается в том, что вы говорите клиенту: «Я хочу потратить n недель на работу над этой программой, и, если все пойдет хорошо, она будет делать именно то, что делает сейчас». - это так. трудно продать, мягко говоря.

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

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

person James Anderson    schedule 31.05.2010
comment
При всем уважении, Джоэл не всегда прав. Он даже признает, что больше не согласен со всеми этими старыми статьями. Также следует отметить, что я не сторонник того, чтобы отказываться от всего вашего кода и заставлять Чака Норриса всесторонне запускать новый код в жизнь. Все, о чем я говорю, - это попытаться обеспечить, чтобы код был в несколько лучшей форме, чем до того, как вы к нему прикоснулись. Сделать еще хуже - значит сделать следующее изменение еще сложнее ... Потом еще сложнее и т. Д., Пока у вас не будет кода, как у нас. - person Dan McGrath; 31.05.2010
comment
Кроме того, не зря были введены управляющие структуры, отличные от if (x) goto. Господи, по твоей логике, почему бы нам не сделать все умножение, выполняя цикл и добавляя. Вот как они это делают ... Я никогда не спорил, что у вас не может быть хорошо структурированных программ с gotos. Я буду утверждать, что у вас могут возникнуть проблемы с более структурированными, более читаемыми и удобными в обслуживании программами, если вы использовали управляющие структуры значений. - person Dan McGrath; 31.05.2010
comment
Извините за столь сильный аргумент в жизнь с этим аргументом, но я видел, как многие люди сильно обжигались, пытаясь улучшить рабочий код, и большинство сообщений здесь просто не учитывали сопутствующие трудности. В вашем случае стоит подумать, см. обновление моего сообщения для получения более конструктивных советов. - person James Anderson; 01.06.2010
comment
Статья Джоэла поддерживает в значительной степени прямо противоположное тому, о чем вы говорите. Просто прочтите части, где он говорит о рефакторинге: «один программист работает внимательно», «5 минут с макросом emacs». Он говорит, что отсутствие функционирующего кода настолько плохо, что его нельзя постепенно улучшать, чтобы он был адекватным с точки зрения бизнеса. . Вывод состоит в том, что вам необходимо провести необходимое обслуживание, чтобы ваше существующее программное обеспечение работало. Мечтать о перезаписи в чистой комнате - всегда ошибка. - person soru; 19.07.2010
comment
Управленческая сторона важна, но когда ваши самые талантливые программисты устают и уходят, вы получаете эффект мертвого моря. Назовите это ценой! - person Hamish Grubijan; 25.07.2010
comment
Если в бизнес-правилах достаточно беспорядка, любая их реализация также будет беспорядком; любая попытка очистить код будет обречена, если заказчик не согласится на упрощение бизнес-правил. - person supercat; 17.07.2015

Недавно мне пришлось поработать над кодом, который не был унаследованным per se, но привычки прежних разработчиков определенно были такими, и поэтому GOTO были повсюду. Мне не нравятся GOTO; они создают ужасный беспорядок и превращают отладку в кошмар. Что еще хуже, заменить их обычным кодом не всегда просто.

ЕСЛИ вы не можете размотать свои GOTO, я определенно рекомендую вам больше не использовать их.

person LoudNPossiblyWrong    schedule 26.05.2010
comment
А, подождите, пока вы не встретите какой-нибудь старый COBOL с ALTER GO, меняющим цель GO TO из совершенно другого раздела кода! - person James Anderson; 27.05.2020

К сожалению, на языке, на котором это написано, нет готовых инструментов рефакторинга.

У вас нет редакторов с возможностями макросов? У вас нет сценариев оболочки? За эти годы я провел тонны рефакторинга, очень мало - рефакторинга браузеров.

person Ken    schedule 18.07.2010
comment
Что ж, это вызывает еще больше проблем. Короче нет. Да, у меня есть сценарии, которые я написал, которые на самом деле убирают большую часть беспорядка старых программ, но по безграничной мудрости руководства нам запрещено использовать любые инструменты, которые мы написали сами, которые не прошли полный процесс утверждения (включая одобрение советом по изменениям бизнес-пользователей) из-за проблем с безопасностью. Из-за постоянного отставания пройдет около 2-5 лет, прежде чем они будут одобрены ... Что касается редакторов, это еще один повод для смеха. - person Dan McGrath; 19.07.2010
comment
Я пытался оправдать ваши сомнения, но вы говорите так, как будто вы просто умоляете нас сказать вам, чтобы вы спрыгнули с корабля прямо сейчас. :-) - person Ken; 19.07.2010
comment
Я надеялся на что-то проницательное, о чем я не думал, а также на создание места, где я мог бы ссылаться на утверждения, отличные от моих собственных и коллег, относительно ситуации. Часть метода «Это не только мое мнение». Что, к сведению, действительно привело к тому, что разработка велась правильно и дала положительные результаты. Следует отметить, что с тех пор у нас не было этой конкретной проблемы, поэтому, хотя место не идеальное, изменения к лучшему все же происходят. - person Dan McGrath; 19.07.2010

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

Чтобы что-то изменить, необходимо изменить это дисфункциональное распределение обязанностей между этими людьми. Есть много разных способов разделить работу: классический, традиционный (который, скорее всего, является официальной, но игнорируемой политикой в ​​вашей работе) заключается в том, чтобы аналитики написали независимый от реализации документ спецификации, а программисты реализовали его как поддерживаемо как могут.

Проблема с этим теоретическим подходом в том, что он на самом деле нереалистичен во многих распространенных ситуациях. В частности, чтобы делать это «должным образом», сотрудники, которых считают младшими, должны выиграть спор с более старшими коллегами, которые имеют лучшие социальные связи в офисе и обладают большей деловой смекалкой. Если аргумент «goto» не зависит от реализации, так что вы, как аналитик, просто не можете сказать это слово, «не летает в вашем рабочем пространстве», то, по-видимому, дело обстоит именно так.

Во многих случаях гораздо лучше такие альтернативы, как:

  1. аналитики пишут клиентский код, а разработчики пишут инфраструктуру.
  2. Аналитики пишут исполняемые спецификации, которые используются в качестве эталонных реализаций для модульных тестов.
  3. Разработчики создают предметно-ориентированный язык, на котором программируют аналитики.
  4. Вы отбрасываете различие между одним и другим, имея только гибрид.
person soru    schedule 18.07.2010
comment
Нет, проблема в аналитиках, которые могут `` увидеть '' предположительно более быстрый способ достижения тех же результатов в краткосрочной перспективе, который оказывается несовершенным с точки зрения долгосрочной ремонтопригодности (и, как выясняется, в краткосрочные тоже). Проблемы, которые вы описываете, являются реальными проблемами, но второстепенными по отношению к реальной проблеме, которую необходимо решить в данной ситуации. - person Dan McGrath; 19.07.2010
comment
Ну да, в том-то и дело: они ошибаются, но ни у кого нет ни полномочий, чтобы сказать им, ни возможности убедить их. - person soru; 19.07.2010

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

Это обычная проблема при работе с устаревшим кодом. Придерживайтесь стиля, в котором изначально была написана программа, или «модернизируйте» код. Для меня ответ обычно - придерживаться оригинального стиля, если только у вас нет действительно серьезных изменений, которые оправдали бы полное переписывание.

Также имейте в виду, что некоторые «современные» языковые функции, такие как оператор throw в Java или операторы SQL «ON ERROR», на самом деле являются замаскированными «GO TO».

person James Anderson    schedule 26.05.2010
comment
Вы получили это наоборот. GOTO - это замаскированный бросок. Или перерыв в маскировке. В общем, заменитель полезных управляющих структур, которых нет в языке. В более старых языках, таких как версии BASIC до 1980-х годов, goto также использовался для замаскированной реализации switch, в то время как и do ... замаскированным, или даже просто многострочным, если замаскированный. Вот откуда GOTO Считается вредным. GOTO использовался для стольких разных целей, что было трудно понять, для чего предназначен какой-либо конкретный GOTO. - person dan04; 26.05.2010
comment
Если под поддерживаемым вы имеете в виду, что аналитикам требуются недели, чтобы каждый раз определять, как работает код, и он ВСЕ ЕЩЕ имеет поведение, о котором они не имеют ни малейшего представления, то да, это очень легко поддерживать ... Странное определение поддерживаемого, хотя ... - person Dan McGrath; 26.05.2010
comment
ОП не сказал, что аналитику потребовались недели, чтобы проработать поведение программы! Если он это сделал, то, возможно, было какое-то оправдание для переписывания. Судя по тому, что я понял, код просто работает. На более глубоком уровне, если код содержит GOTO, вы не можете правильно структурировать только один фрагмент, вам нужно избавиться от всех GOTO, чтобы несколько дополнительных goto действительно не имели никакого значения. - person James Anderson; 27.05.2010
comment
Большинство программ не будет дьявольски исправлять с самого начала. Сделайте несколько итераций над еще несколькими GOTO, на самом деле это не имеет никакого значения, и довольно скоро у вас будет 4000 строк чистого злого гения. Сдаться и сказать, да, черт возьми, с такой уверенностью, как день, никогда не станет лучше. Это просто ведет к тому пути, по которому в конечном итоге вы не можете вносить какие-либо изменения в разумные сроки. Вы просто имеете дело с неизбежным, пока это не станет еще труднее и рискованнее. - person Dan McGrath; 28.05.2010
comment
-2 хах, надо помнить, что никогда нельзя предлагать здесь альтернативного мнения! - person James Anderson; 31.05.2010
comment
В качестве дополнительной заметки к Джеймсу в Op не сказано: если вы посмотрите, я думаю, вы обнаружите, что, поскольку комментарий, на который вы ссылаетесь, был написан OP (мной), он это сделал. :) - person Dan McGrath; 31.05.2010
comment
@ dan04 - Мне это нравится: GOTO - это перерыв в маскировке. Например, это нарушает ваш код. :-) - person Carl Manaster; 01.06.2010