|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||
Холивар темы: Может ли быть спагетти-код не на основе goto?05.05.2025, 08:43. Показов 6145. Ответов 149
Метки нет (Все метки)
2автор: для начала нужно определиться, пишешь для себя или для некоего коллектива. Если для коллектива, то без вариантов нужно писать так как принято в профессиональных сообществах как бы вам там что-то не нравилось. А если пишете для себя, то пишите так как нравится лично вам, не издевайтесь над собой. Например совет про разбивку метода на несколько подметодов не имеет особого смысла если это не что-то повторяемое, как раньше говорили - функция. На читаемость это абсолютно никак не влияет, скорее наоборот, потому что вы или читаете последовательно действия или прыгаете от метода к методу. Ограничение метода какими-то строками или экранами это вообще ересь. Метод должен быть ровно такой какой он и должен быть, лично вы вообще на это никак не повлияете, то что вы его расфигачите на 100500 подметодов абсолютно никак не повлияет ни на скорость ни на его читаемость. Лично сам я люблю сокращать текст кода, писать его по возможности плотнее, но не для читаемости (читаемость как раз ухудшается). Просто я люблю плотный код и делаю я это только тогда, когда работа над методом закончена и что-то исправлять я не планирую. Как бы всё красиво не звучало, но вы нигде не найдёте единого мнения о том как же именно лучше всего оформлять код. Я иногда вставляю код с этого форума от "великих знатоков ООП" на других ресурсах и этот код обсирают ровно так же, как мой код здесь. Так что угодить всем-всем-всем вы всё равно не сможете. Но можно конечно выбрать для себя например оформление MSDN и работать строго в этом векторе, хотя вам часто так же будут говорить про индусский код, о котором вы и пишете в этой теме. goto - это не оператор говна, это такой же инструмент как if или for, главное тут уместность его применения. У меня изредка он бывает, в основном для выхода из вложенных циклов или когда сильно проще просто воткнуть goto на время разработки, не вижу как именно goto повлияет на читаемость, ведь вызов любой функции это точно такой же goto (если возвращаться к Бейсику, то это GOSUB), и вам тут же в этой теме совершенно нормально пишут что читаемость кода с кучей методов вдруг становится лучше, непонятно почему вызов метода это хорошо а переход по goto - это уже плохо. И в любом случае в ассемблере все ветвления так или иначе сделаны через goto, которых заметно больше, так как там скорее конструкции (IF условие GOTO). Любая итерация цикла это goto, просто не явный. И какую бы книжку вы не читали всегда есть вероятность что её или не читали другие или они не разделяют те же принципы что там описаны.
0
|
|||||||
| 05.05.2025, 08:43 | |
|
Ответы с готовыми решениями:
149
Спагетти код ??? С# vs vb.net Холивар или нехватка знаний? |
|
|
|
| 05.05.2025, 18:08 | |
|
Думаю, здесь просто сплелись разные "конфессии" - восприятие подходов к программированию...
belalugoci в принципе мыслит "ассемблерно", но и то, не до конца - наличие goto в коде уже свидетельствует о его не последовательности..Считаю, что не нужно путать построение итогового машинного кода с написанием "человеческого", т.е. который будет понятен не только самому писателю и его 'машине', но и другим людям. Именно для этого и были придуманы ЯП как таковые, и в последствии к ним различные подходы, в виде ООП. Так или иначе, весь написанный код преобразуется в машинные команды чтения регистров, перемещениям, прыжкам туда-сюда (jmp), вызовом процедур по указанным адресам и т.п. Этот подход точно будет не понятен большинству, если не разбирать его с лупой.. Писать "нормальный" код в машинном стиле - уподобляться процессору CPU - мало кто захочет скакать по строкам в поисках нужного. Диалоги/споры людей с разной идеологией написания кода - вряд ли стоит воспринимать в серьез. belalugoci, пример со switch не понял вообще - что вы хотели этим показать?
1
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||||||||||||||||||
| 05.05.2025, 18:54 [ТС] | ||||||||||||||||||||||
|
заметьте, мы ни на грамм не приблизились к пониманию происходящего, всё что написано выше абсолютно не имеет смысла и понятно только тому кто это создал.
0
|
||||||||||||||||||||||
|
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
|
||
| 05.05.2025, 21:59 | ||
|
1
|
||
|
|
||
| 06.05.2025, 00:47 | ||
|
И по теме: Etyuhibosecyu хочет как раз обратного, а не того что вы советуете..
0
|
||
|
Модератор
|
|||
| 06.05.2025, 08:24 | |||
|
Условно есть две категории разработчиков - если рассматривать крайние случаи. Есть разработчики, которые на практике сталкивались с огромным количеством задач, разными стилями написания кода, умеют писать и так и этак, работали во многими коллективных проектах. И когда такие разработчики что-то советуют, то есть понимание что они на самом деле знаю о чём говорят и к их советам следует прислушаться. Возможно иногда эти разработчики не могут чётко выразить причины по которым следует поступать так или иначе. Но это же всё же разработчики, а не "философы". Почти всегда их мнение будет совпадать с хорошими учебниками. И есть другие разработчики, которые могут только простыни кода ПП писать "для себя". Единственный их аргумент "Я художник, я так вижу". Но по сути они просто по другому не умеют. И ставить "на одну доску" советы таких "умельцев" с разработчиками первой категории не стоит. Какой-то Вася Пупкин "Да, нафиг это ООП мне нужно! Херню развели какую-то. Не знал его и знать не собираюсь. У меня вон всё работоет. И хер с ним, что никто, даже я сам, не понимает как оно работает." - такие советы имеют нулевую, если не отрицательную, ценность. Добавлено через 12 минут Речь о том, что раз break; является обязательной завершающей инструкцией блока case , то почему не считать по умолчанию, что следующий case имеет неявно перед собой break;.Типа как в void методе. Можно поставить return; но и если не ставить его, то после последней инструкции метода он не явно присутствует.Здесь я скорее соглашусь с belalugoci. Хотя глубоко не лез в эту тему и при поверхностном взгляде могу не видеть каких-то подводных камней.
1
|
|||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||||||||||||||||||||||||
| 06.05.2025, 09:03 [ТС] | ||||||||||||||||||||||||||||
|
с синтаксисом вроде всё понятно - читаете доки и в голове выстраиваете аналогии, я так читаю код на питоне, си, си++, паскале и т.п. реализация - а вот тут всё не так однозначно, вот простой ПРИДУМАННЫЙ пример (в реальности всё куда сложнее чаще всего), в авторской реализации входные данные разбиваются на подмассивы по определенным условиям, потом делятся на группы по 16 и прогоняются через функцию, результат складывается в отдельный массив, над которым в финале опять происходят какие-то вычисления. Ну вот вы видите это и дальше что? Это для вас черный ящик, вы в душе не чаете что тут происходит. И как вы это будете дорабатывать? Например у вас во входных данных что-то изменилось и при отправке результата на другой сервер, который вам может только выдать результат- валидно или нет, вам прилетает - не валидно. Доступа к серверу у вас нет, он стоит в калифорнии у какой-то компании. А вы в РФ, на письма вам не отвечают, описания API сервера у вас нет. Дальше что? Ну вот если опыта у вас хватит вы опознаете что это MD5, а если нет? А принцип оформления кода тут вообще ни при делах. Добавлено через 17 минут например я не считаю себя программистом или специалистом в этой области и в 99% случаев транслирую или свой личный опыт или пересказываю чьи-то слова, например ваши, за что на другой площадки получаю страйк за ересь. Так что до того как вы начнёте тыкать в меня вы сначала в профессиональном сообществе разберитесь кто же там из вас прав. А я посмотрю на банку с пауками. я написал о том, что отсутствие break должно создавать ситуацию без завершения, что логично, иначе зачем тогда этот break вообще нужен. Синтаксис без завершающего break позволит при ветвлении продолжать код с другим условием.пример, насколько я помню недавно разрешили делать так:
default, например так
switch, что для меня кажется нелогичным.
0
|
||||||||||||||||||||||||||||
|
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
|
||||
| 06.05.2025, 09:27 | ||||
|
0
|
||||
|
Модератор
|
||
| 06.05.2025, 09:40 | ||
|
Каждый блок кода в case - это как маленькая подпрограмма.break; - это выход из этой подпрограммы.Каждый case описывает условия входа в подпрограмму.Иметь несколько условий входа для подпрограммы - это норм. Но вот неявный переход из одной подпрограммы в другую - это, мягко говоря, неоднозначно. Я думаю, у вас в этом случае просто "тяга к goto". case вы воспринимаете как "условные метки".В коде же логично после выполнения кода одной метки продолжить код выполнять дальше, если даже там есть другие метки. Так почему же с case не сделать так же? Но как я объяснил - в case заложена совсем другая концепция. Менять концепции которые лежат в самых основах ЯП всегда сложно. Они же тоже принимаются не на пустом месте и были веские основания почему сделано именно так. Учитывалось всё от основ ОПП, до компиляции в CIL, выполнения в CLR и многое другое. Чтобы предлагать такие концептуальные изменения надо разбираться во всё этом на уровне общества разработчиков поддерживающих развитие Шарпа.
0
|
||
| 06.05.2025, 11:30 | ||||||||
|
Касательно switch
Во первых, оператор назван switch, а не, например, jump. Что подразумевает именно переключение на нужный блок кода, а не переход к какому-то месту кода и последующему выполнению всех блоков вслед за ним в пределах оператора. Представьте аналогию с электрическим переключателем, где Вы переключаетесь на напряжение 12В, а после того как 12В подано подаётся 24В, 36В и т.д. пока нагрузка не сделает пшик или бабах. Вы же не ожидаете такого от переключателя как бы он ни был реализован? Во вторых, в данном ЯП есть явные границы блока кода, т.е. скобки {}. Ведь в конце любого метода ни до, ни после скобок мы не ставим break. Что мешало реализовать оператор с их применением? Например чем был бы плох такой синтаксис?
0
|
||||||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||||||||||||||||||||
| 06.05.2025, 11:55 [ТС] | |||||||||||||||||||||||||
|
Оформление кода (или стиль кодирования) — это набор правил и соглашений о том, как писать и структурировать код, чтобы он был: - Читаемым (понятным для других разработчиков и вас в будущем), - Единообразным (одинаковым стиль в рамках проекта), - Поддерживаемым (легким для изменений и отладки). Разницу вам объяснять?
Добавлено через 2 минуты
0
|
|||||||||||||||||||||||||
|
Модератор
|
||
| 06.05.2025, 11:57 | ||
|
Именно поэтому вы не можете понять почему именно так. Switch это набор независимых фрагментов кодов. Он даже компилироваться может в словарь с делегатами. И переход из делегата в делегат, надеюсь понимаете, это точно не очевидное решение.
0
|
||
|
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 962
|
||
| 06.05.2025, 12:13 | ||
|
а вот с GOTO тут не на 100 процентов очевидно. сам его никогда не использую, потому что всегда можно обойтись, но готов в редких случаях отнестись с пониманием, например, для выхода из вложенных циклов, если весь метод маленький. а если из-за GoTo граф выполнения кода станет "чертекаким", то вносить изменения в код будет нереально.
1
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|
| 06.05.2025, 12:56 [ТС] | |
|
0
|
|
|
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
|
|||||
| 06.05.2025, 13:05 | |||||
|
0
|
|||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||
| 06.05.2025, 13:32 [ТС] | |||||||
|
0
|
|||||||
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
|
| 06.05.2025, 13:45 | |
|
belalugoci, заметили как много несогласных с вашей позицией ?
А еще , я заглянул в профиль и увидел в интересах - MOS 6502 ATARI , предположу , что Вы больше склонны к системному программированию , небольшие подпрограммки , у системщиков вообще плохо обычно с ООП и энтерпрайз подходами , ибо задачи другого масштаба.
1
|
|
|
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
|
||
| 06.05.2025, 13:57 | ||
|
Если же вы (а) не программист и (б) понятия не имеете о выбранной сфере, к примеру об алгоритмах сжатия данных, а пришли их дорабатывать - то оформление кода вам мало чем поможет. В лучшем случае по упоминающимся там ключевым словам в названиях функций сможете погуглить. Кодстайл и паттерны это не волшебная пилюля, заменяющая образование.
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||
| 06.05.2025, 14:06 [ТС] | |||||||
|
Добавлено через 7 минут
0
|
|||||||
|
|
||
| 06.05.2025, 14:55 | ||
|
Лично опрос не проводил, но что-то мне подсказывает что все несогласные с вами либо работают программистами и пишут программы на .net, либо очень плотно изучали эту clr. Вспоминая как вы постоянно заходя в ту или иную тему начинаете доказывать ненужность ООП, git, оформление кода -- складывается впечатление что вам интересно именно идти против системы, а не узнавать что-то новое и учиться. Отдельно меня умиляет что если спрашивает условный студент, то якобы ничего сложнее if-else предлагать уже нельзя. Не судите по себе -- некоторые как раз хотят учиться. Плюс данные темы читает не только автор вопроса, а те кто таки умеет пользоваться гуглом. И вот им как раз критично узнать "как правильно".
5
|
||
|
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
|
|||||
| 06.05.2025, 15:11 | |||||
|
0
|
|||||
| 06.05.2025, 15:11 | |
|
Помогаю со студенческими работами здесь
40
Какие альтернативы goto можете предложить? Чем можно заменить конструкцию On Error GoTo c# и goto goto есть ли такое и как им пользоваться Чрезмерное употребление оператора goto Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|