Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Ещё и из секты одновозвратников. Кстати, у одноразвратников есть какие-то преимущества, кроме возможности вставки питушни перед return для ручной аспектушни и логирования?
В теории, в сишке это помогает не забыть убрать за собой говно и избежать ситуаций, когда return вставил, а освободить память забыл. В языках с RAII/GC это скорее сугубо методологическая/философская питушня.
Вроде в сишке для этого делают goto free_pituxes;, который становится синонимом return. Интересно, или поехавшим легче делать вложенные if, чтобы во всех случаях без return и goto?!
Но во всех функциях, которые не пожирают временные ресурсы, эта питушня создаёт синтаксиальную переголову.
Зато код выглядит как расстановка гардов и потом исполнение алгоритма на чистых данных.
1. Размер плохой? Садись на флешку!
2. Память не выделилась? Садись на флешку!
3. Кобенанта неворцеательная? Садись на флешку!
4. Вроде всё хорошо, исполняем код.
P.S. Ну и если багор случился где-то внутри двойного цикла, проще через return или goto отправиться на флешку, чем хитрожопить логику плавного выхода.
Да нормально. Когда нужно открыть штук пять ресурсов, а потом их в правильном порядке закрыть, при этом каждое открытие может наебаться — ничего лучше без эмуляции «RAII» просто не придумаешь (именно поэтому я за «RAII»).
Да и выглядит оно не так уж и плохо, если сишку более-менее знать.
FILE *f1 = NULL, *f2 = NULL;
void *mem = NULL;
f1 = fopen("huj1", ...);
if (!f1) { goto free_and_exit; }
f2 = fopen("huj2", ...)
if (!f2) { goto free_and_exit; }
mem = malloc(42*100500);
if (!mem) { goto free_and_exit; }
// Тут всё ок, все ресурсы доступны
// ...
free_and_exit:
free(mem);
if (f2) { fclose(f2); }
if (f1) { fclose(f1); }
return 42;
Простой, понятный, надёжный код, лучше можно сделать только с «RAII». Без «goto» это была бы лапша из ифов с кучей копипасты (освобождать f1 бы пришлось в трёх местах: после f2, после mem и перед нормальным выходом), при этом куча копипасты растёт квадратично от количества открываемых ресурсов.
package com.journaldev.util;
public class JavaBreakLabel {
public static void main(String[] args) {
int[][] arr = { { 1, 2 }, { 3, 4 }, { 9, 10 }, { 11, 12 } };
boolean found = false;
int row = 0;
int col = 0;
// find index of first int greater than 10
searchint:
for (row = 0; row < arr.length; row++) {
for (col = 0; col < arr[row].length; col++) {
if (arr[row][col] > 10) {
found = true;
// using break label to terminate outer statements
break searchint;
}
}
}
if (found)
System.out.println("First int greater than 10 is found at index: [" + row + "," + col + "]");
}
}
Вообще, я плохо знаком с одновозвратничеством, но краем уха слышал, что в основном они топят за «плавное» выполнение кода, чтобы не было разрывов. Поэтому, скорее всего, goto у них ещё в большей анафеме, чем многовозврат.
Дейкстра еще умел по деревьям лазить ходить, и научил этому многие link state алгоритмы маршрутизации;)
Под конец жизни Дейкстру жутко заебали анскилябры не могушие ни в математику, ни в CS, говнокодящие говно на джаве без включения мозгов, и запускающие дебагер вместо чтения кода в случае ошибки, и вообще ничего кроме джавы не знающие.
Так они его заебали, что он посоветовал всем студентам до второго курса запретить вообще пользоваться комптютером, и изучать программирование посредством ручки, тетрадки и, кажется, lispа:)
Смешно что Дейкстра был убеждённым противником программирования в стиле «проб и ошибок».
Которое сводится к вводу различных сочетаний букв и символов, пока программа наконец не скомпилируется.
Нужен же какой-то баланс между случайным клацаньем по кнопкам и просчитыванием всего в голове вместо компьютера.
Математика - это хорошо, но она сама же покажет, что если есть реальная задача, которую надо сделать наиболее эффективно, то придётся искать компромиссную точку минимума, а не впадать в крайности.
Я согласен про баланс, и я никогда бы не стал программистом, если вместо написания змейки на паскале мне пришлось бы считать математику посредством лиспа в тетрадочке.
Просто Дейкстра из тех времен, когда программисты называли себя математиками, и он говорил, что компьютер это просто инструмент математика, как нож -- инструмент хирурга. Называть программирование computer science это всё равно, что хирургию назвать knife science, говорил он
Подтверждаю.
Наверное, дело в том, что во времена Дейкстры компьютеры действительно были инструментами математиков, так как пользователей в современном смысле в те времена попросту не существовало.
Один старый программист рассказывал, как он писал программы для какой-то питушни в 70-е на перфокартах, потом их везли в вычислительный зал (или как там называется оно) и привозили потом результаты.
Так он написал программу для компьютера, который он даже не видел никогда!
>он написал программу для компьютера, который он даже не видел никогда!
Да я каждый день пишу такие программы.
Выполняются они на каких-то удалённых компьютерах, которых я ни разу физически не видел.
Вы думаете, что ПИ знает заметно больше того деда - например, про внутренние питух-коды процессора или напряжения на ножках процессора под конкретными номерами?
Или наоборот, дед вообще ничего не знал про старые ВМ*, и просто хреначил код на жс или брейнфаке под абстрактную ВМ**?
Я думаю, дед знал то же самое, что и ПИ (в пересчёте на ...). Иначе он мог бы быть только кем-то вроде заказчика, а его код потом материли, перезаклеивали и перетыкивали.
Разница с ПИ - пинг повыше и терминал картонный, а не пластиковый с магниевым сплавом. А так - что там, что там - частные имплементации SSH.
_________ * вычислительная машина
** виртуальная машина
Меня всегда зобавляло, что лишнехромосомные совки не сумели сами даже название кампутера придумать, а просто переписали IBM транслитом. Зее альзо: ксерокс, джинсы
Просто «Considered Harmful» уже давно стал классикой и самим-собой подразумевающимся в подобных спорах. Про него каждый петух знает.
В любом обсуждении goto Дейкстра упоминается неявно.
retorno de informaçinho
Но во всех функциях, которые не пожирают временные ресурсы, эта питушня создаёт синтаксиальную переголову.
?
Разве не какашня? А были же какие-то языки, где ретурн мог вооще быть только один, и там надо было так иделать
Зато код выглядит как расстановка гардов и потом исполнение алгоритма на чистых данных.
1. Размер плохой? Садись на флешку!
2. Память не выделилась? Садись на флешку!
3. Кобенанта неворцеательная? Садись на флешку!
4. Вроде всё хорошо, исполняем код.
P.S. Ну и если багор случился где-то внутри двойного цикла, проще через return или goto отправиться на флешку, чем хитрожопить логику плавного выхода.
Да и выглядит оно не так уж и плохо, если сишку более-менее знать.
Простой, понятный, надёжный код, лучше можно сделать только с «RAII». Без «goto» это была бы лапша из ифов с кучей копипасты (освобождать f1 бы пришлось в трёх местах: после f2, после mem и перед нормальным выходом), при этом куча копипасты растёт квадратично от количества открываемых ресурсов.
Гото реабилитировагн
Правда, с бряком могут быть проблемы, если есть вложенные циклы.
Надеюсь, ничего не напутал.
«Watcom C» в «Windows» (и в «OS/2») поддерживает try даже в няшной сишке посредством SEH. К сожалению, портабельный вариант они родить не смогли.
https://www.php.net/manual/ru/control-structures.break.php
Хотя всё равно опасная конструкция: если обернёшь цикл другим, придётся у всех бряков менять значение аргумента.
То ли дело «Java»:
«Точно-точно не goto, зуб даю!»
В общем-то в этих случаях код с goto неплохо читается, даже лучше чем без него.
>я плохо знаком с одновозвратничеством, но краем уха слышал
ГК потихоньку деградирует.
За весь тред ни разу не всплыла фамилия Дейкстра.
>скорее всего, goto у них ещё в большей анафеме, чем многовозврат
https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf
Под конец жизни Дейкстру жутко заебали анскилябры не могушие ни в математику, ни в CS, говнокодящие говно на джаве без включения мозгов, и запускающие дебагер вместо чтения кода в случае ошибки, и вообще ничего кроме джавы не знающие.
Так они его заебали, что он посоветовал всем студентам до второго курса запретить вообще пользоваться комптютером, и изучать программирование посредством ручки, тетрадки и, кажется, lispа:)
Хорошо, что старина не дождил до расцвета PHP
Повезло старику.
Он умер в 2002. А пхп изобрели в 1995.
Сволочи. Довели деда.
Которое сводится к вводу различных сочетаний букв и символов, пока программа наконец не скомпилируется.
Нужен же какой-то баланс между случайным клацаньем по кнопкам и просчитыванием всего в голове вместо компьютера.
Математика - это хорошо, но она сама же покажет, что если есть реальная задача, которую надо сделать наиболее эффективно, то придётся искать компромиссную точку минимума, а не впадать в крайности.
Просто Дейкстра из тех времен, когда программисты называли себя математиками, и он говорил, что компьютер это просто инструмент математика, как нож -- инструмент хирурга. Называть программирование computer science это всё равно, что хирургию назвать knife science, говорил он
Наверное, дело в том, что во времена Дейкстры компьютеры действительно были инструментами математиков, так как пользователей в современном смысле в те времена попросту не существовало.
Так он написал программу для компьютера, который он даже не видел никогда!
Хотел бы так?
Да я каждый день пишу такие программы.
Выполняются они на каких-то удалённых компьютерах, которых я ни разу физически не видел.
Вы думаете, что ПИ знает заметно больше того деда - например, про внутренние питух-коды процессора или напряжения на ножках процессора под конкретными номерами?
Или наоборот, дед вообще ничего не знал про старые ВМ*, и просто хреначил код на жс или брейнфаке под абстрактную ВМ**?
Я думаю, дед знал то же самое, что и ПИ (в пересчёте на ...). Иначе он мог бы быть только кем-то вроде заказчика, а его код потом материли, перезаклеивали и перетыкивали.
Разница с ПИ - пинг повыше и терминал картонный, а не пластиковый с магниевым сплавом. А так - что там, что там - частные имплементации SSH.
_________
* вычислительная машина
** виртуальная машина
Зее альзо: ксерокс, джинсы
В любом обсуждении goto Дейкстра упоминается неявно.