Будучи оказанным давление к GOTO темная сторона

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

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

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

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

tldr;

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

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

Credit: XKCD

Разъяснение:

Goto here

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

there: Я даже не говорил о виде gotos, можно обоснованно перечитать и определить то, что делала программа. Goto alsoThere

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

here: В этом вопросе я не говорил об иногда хорошо использование goto. Goto there

tacoBell: и это только что пошло назад к исходной точке. Goto Jail

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

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

4: сначала *, если в первый раз здесь goto hell, никакая секунда, если в первый раз здесь goto hell, никакая треть, если в первый раз здесь goto hell четвертый теперь актуальный goto hell

end:

63
задан Community 8 February 2017 в 14:08
поделиться

10 ответов

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

28
ответ дан 24 November 2019 в 16:28
поделиться

Если для изменения программы требуется "всего один маленький goto", я бы сказал, что код очень удобен для сопровождения.

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

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

-1
ответ дан 24 November 2019 в 16:28
поделиться

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

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

12
ответ дан 24 November 2019 в 16:28
поделиться

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

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

1
ответ дан 24 November 2019 в 16:28
поделиться

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

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

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

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

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

  4. Уйти в отставку.

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

4
ответ дан 24 November 2019 в 16:28
поделиться

Обратно к принципам:

  • Читается ли он?
  • Работает ли он?
  • Поддерживается ли он?
3
ответ дан 24 November 2019 в 16:28
поделиться

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

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

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

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

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

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

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

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

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

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

PS: Даже Джоэл думает, что это плохая идея: вещи, которые вы никогда не должны делать

Обновить! -

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

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

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

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

2
ответ дан 24 November 2019 в 16:28
поделиться

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

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

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

4
ответ дан 24 November 2019 в 16:28
поделиться

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

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

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

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

  1. аналитики пишут клиентский код, а разработчики пишут инфраструктуру.
  2. Аналитики пишут исполняемые спецификации, которые используются в качестве эталонных реализаций для модульных тестов.
  3. Разработчики создают предметно-ориентированный язык, на котором программируют аналитики.
  4. Вы отбрасываете различие между одним и другим, имея только гибрид.
1
ответ дан 24 November 2019 в 16:28
поделиться

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

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

1
ответ дан 24 November 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: