Oberon space

General Category => Общий раздел => Тема начата: ilovb от Ноябрь 21, 2013, 03:15:52 pm

Название: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 03:15:52 pm
Я эволюционировал.
Предпосылки:
http://oberspace.dyndns.org/index.php/topic,225.msg6308.html#msg6308
http://oberspace.dyndns.org/index.php/topic,584.msg19744.html#msg19744

Сегодня два часа воевал с одним циклом.
Планирование производства.(распределение операций по исполнителям и по времени)
3 вложенных Форыча, ~300 строк, в каждом форыче несколько continue.

Мозг сломал, но так и не придумал как мне вклиниться в эту говнологику.

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

Все эти continue (кроме одного) возникли скорее всего не сразу.
Код эволюционировал со временем и условия втыкались автором "по месту", ибо это гораздо легче, чем реструктуризация цикла.
Причина, по которой цикл изначально писался через форыч+continue, тоже банальна.
Дизайн языка и коллекций провоцирует на использование таких циклов. Т.к. форыч интуитивно кажется проще и легче чем while, плюс коллекции спроектированы так, чтобы их удобно было обходить именно форычем.
В результате имеем форыч+continue там, где явно должен быть while.

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

Вывод: Форыч зло.
 
Название: Re: Форыч зло
Отправлено: valexey_u от Ноябрь 21, 2013, 03:33:57 pm
Это смотря какой форыч :-) Вот std::for_each от этих недостатков свободен. Ну и вообще это не языковая конструкция :-)

Равно как и подобные штуки в том же Haskell'e. Там вообще в принципе циклов нема. А foreach есть. Но не в языке.
Название: Re: Форыч зло
Отправлено: valexey_u от Ноябрь 21, 2013, 03:35:39 pm
Да, кроме того, говнокод можно написать хоть с while хоть с форычем хоть с чем угодно. Тут не конструкции виноваты, а таки руки и голова писавшего. А скорее всего проблемы еще уровнем выше - работа организована не правильно, организация работы наверняка такова, что провоцирует на лепление заплаток на скорую руку, время на рефакторинг кода в план не заложено в принципе.
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 04:10:41 pm
Вот std::for_each от этих недостатков свободен.
Ну это другое. Тема именно про цикл.
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 04:17:32 pm
Да, кроме того, говнокод можно написать хоть с while хоть с форычем хоть с чем угодно.

С форычем его легче написать. А с while нужно таки немного включать мозг (иначе оно вообще работать не будет), и народ пытается его избегать где возможно.

ps Я подразумеваю while без continue и break.
Название: Re: Форыч зло
Отправлено: vlad от Ноябрь 21, 2013, 04:19:21 pm
Вот std::for_each от этих недостатков свободен.
Ну это другое. Тема именно про цикл.

for each - специализированный цикл. И в этом его достоинство. А то, что в него напихали continue (break?) или еще не знаю чего - это уже на совести авторов языка.

std::for_each использую практически каждый день, все хорошо.

P.S. Сам continue не использую.
Название: Re: Форыч зло
Отправлено: vlad от Ноябрь 21, 2013, 04:21:29 pm
ps Я подразумеваю while без continue и break.

Ха-ха-ха. Хитрый какой. Т.е., в for each мы будем пихать continue/break и смешивать его с говном, а священный while - надо писать только по всем правилам :)
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 04:27:33 pm
Есть циклы которые нельзя написать через форыч без continue или break.
Речь именно о таких циклах. Их нужно писать через while, но народ этого не делает. Неужели непонятно из первого поста?

Цитировать
std::for_each использую практически каждый день, все хорошо.
Тема про цикл!
Название: Re: Форыч зло
Отправлено: valexey_u от Ноябрь 21, 2013, 04:38:34 pm
Есть циклы которые нельзя написать через форыч без continue или break.
Речь именно о таких циклах. Их нужно писать через while, но народ этого не делает. Неужели непонятно из первого поста?
Действительно было не понятно. С тем что делать абсолютно всё через for_each, или через while не правильно - конечно соглашусь. И да, в языке (если язык таков что без непосредственной поддержки циклов в языке там не обойтись) либо в стандартной либе (если язык высокоуровневый) должен быть набор узкоспециализированных "циклов", а не надобор универсального непонятночего.
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 04:55:54 pm
Ну я не против форыча как такового. По сути, да, я против неправильного использования.
С этой проблемой можно бороться выпиливанием из языка continue и break.
Но мне думается, что лучше выпилить форыч (цикл). Так как он навязывается дизайном коллекций.(необходимости в нем нет) Дизайн ведь можно сделать удобным для while (курсоры) Форыч просто лишняя сущность.
Ну и функции типа std::for_each тоже его спокойно заменяют.
Название: Re: Форыч зло
Отправлено: Geniepro от Ноябрь 21, 2013, 05:02:33 pm
...
Сегодня два часа воевал с одним циклом.
...
3 вложенных Форыча, ~300 строк, в каждом форыче несколько continue.
...
Вывод: Форыч зло.

Вывод неверный. Зло -- не форыч, а эти самые триста строк говнологики в нём...
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 05:04:10 pm
Кстати еще более проявлено навязывание форыча и continue с break в Python.
Хоть я и симпатизирую лаконичности этого языка, но дизайн циклов в нем будто бывалый говнокодер проектировал.
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 05:06:29 pm
Вывод неверный. Зло -- не форыч, а эти самые триста строк говнологики в нём...
Под говнологикой подразумевался форыч+continue*n. Так что мимо...
Название: Re: Форыч зло
Отправлено: Geniepro от Ноябрь 21, 2013, 05:20:41 pm
Вывод неверный. Зло -- не форыч, а эти самые триста строк говнологики в нём...
Под говнологикой подразумевался форыч+continue*n. Так что мимо...

В любом случае цикл, в котором 300 строк, -- уже зло по умолчанию. А форыч он или while или std::for_each -- уже не важно.
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 05:22:51 pm
Ну замени код на вызовы процедур. Сути это не меняет.

ps Если бы я не написал про 300 строк, что бы изменилось?
Название: Re: Форыч зло
Отправлено: Madzi от Ноябрь 21, 2013, 05:24:32 pm
for(String str : StringList) {
    ....
    if (str.equals("some")) continue;
    ...
}
Просто вместо continue нужно писать так:
for (String str : StringList) {
    ....
    if (!str.equals("some")) {
        ...
    }
}

PS. на Java
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 05:29:50 pm
И чем это лучше continue?
Название: Re: Форыч зло
Отправлено: Geniepro от Ноябрь 21, 2013, 05:39:04 pm
Ну замени код на вызовы процедур. Сути это не меняет.

ps Если бы я не написал про 300 строк, что бы изменилось?

Изменился бы масштаб -- злом оказался бы тот программахер, что этот непонятный цикл наколбасил -- кода всего ничего, а хрен поймёшь...
Название: Re: Форыч зло
Отправлено: Geniepro от Ноябрь 21, 2013, 05:41:17 pm
И чем это лучше continue?

Более явно видны намерения программиста. continue/break можно и не разглядеть, а сдвиги кода вправо-влево указывают на изменение пути прохождения кода...
Название: Re: Форыч зло
Отправлено: valexey_u от Ноябрь 21, 2013, 05:43:52 pm
Ну замени код на вызовы процедур. Сути это не меняет.

ps Если бы я не написал про 300 строк, что бы изменилось?

Если бы там было 20 строк, и в этих 20 строках были собраны все эти условия с continue, то понять что там происходит было бы НАМНОГО проще.
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 05:51:17 pm
Я наверно непонятно объясняюсь. ::) (пардонте если что)

Проблема в том, что такое:

i := 0;
while ~cond & (i < y.count) do
x := y[i]
...
INC(i);
end;
народ пишет так:
for x in y do
...
    if cond then
        continue;
    end;
...
end;
Название: Re: Форыч зло
Отправлено: Geniepro от Ноябрь 21, 2013, 05:57:36 pm
Я так вообще практически не пишу continue.
break -- да, сколько угодно, а вот continue -- не, не слышал...
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 21, 2013, 05:59:59 pm
Тоже не пишу. Но в чужом коде постоянно вижу.
Название: Re: Форыч зло
Отправлено: adva от Ноябрь 22, 2013, 08:14:22 am
Думаю все же лучше без бреков и континьев (пардонте за мой хранцузкий), чем без форыча.

И да, согласен, что лучше обозначить континьюс условием, т.к. сразу видно, что код может не выполняться
Название: Re: Форыч зло
Отправлено: adva от Ноябрь 22, 2013, 08:15:20 am
По этому правильнее тема звучит так: континьюсы и брейки - зло :)
Название: Re: Форыч зло
Отправлено: trurl от Ноябрь 22, 2013, 08:41:11 am
Еще правильнее так: континьюсы и брейки в форычах - зло.
Если написано "для каждого ... делай", а оно делается не для каждого, то это сознательное введение в заблуждение.
Название: Re: Форыч зло
Отправлено: Geniepro от Ноябрь 22, 2013, 08:53:31 am
Еще правильнее так: континьюсы и брейки в форычах - зло.
Если написано "для каждого ... делай", а оно делается не для каждого, то это сознательное введение в заблуждение.

Ну а как? Иногда для простоты кода лучше сделать перебор через форыч, а прерывание перебора -- через брейк. Главное что бы код цикла был коротким -- тогда проблем с восприятием не возникнет...
Название: Re: Форыч зло
Отправлено: Geniepro от Ноябрь 22, 2013, 09:03:31 am
Да, был бы составной цикл типаforeach (var x in xs) while (condition) { statements }цены бы ему не было бы...
Название: Re: Форыч зло
Отправлено: albobin от Ноябрь 22, 2013, 09:07:35 am
Зло - это break в форыче, а continue (или IFы внутри цикла) позволяют выразить вполне определённый смысл:
для всех этаких сделать кой-чего.   


Название: Re: Форыч зло
Отправлено: Geniepro от Ноябрь 22, 2013, 09:17:28 am
Зло - это break в форыче, а continue (или IFы внутри цикла) позволяют выразить вполне определённый смысл:
для всех этаких сделать кой-чего.
Так continue как раз-таки пропускает итерацию цикла.
some_loop(...)
{
    statement1;
    if (condition) continue;
    statement2;
}
эквивалентноsome_loop(...)
{
    statement1;
    if (!condition)
    {
        statement2;
    }
}
Ну и зачем, спрашивается, нужен continue? Только для того, что бы уменьшить вложенность у statement2 (ценой ухудшения понятности кода)?
Название: Re: Форыч зло
Отправлено: Kemet от Ноябрь 22, 2013, 10:00:03 am
Вспоминается старый добрый FoxPro, у которого во всех циклах, включая аналог форыча SCAN были LOOP и EXIT и никто по этому поводу проблем не испытывал.
Название: Re: Форыч зло
Отправлено: kkkk от Ноябрь 22, 2013, 12:02:29 pm
some_loop(...)
{
    statement1;
    if (condition) continue;
    statement2;
}
эквивалентноsome_loop(...)
{
    statement1;
    if (!condition)
    {
        statement2;
    }
}
Ну и зачем, спрашивается, нужен continue? Только для того, что бы уменьшить вложенность у statement2 (ценой ухудшения понятности кода)?
Очевидно, что он был введён для этого:
some_loop(...)
{
    statement1;
    if (!condition1)
    {
        statement2;
        if (condition2)
             continue;
    }
}
А 1-й легкозаменимый вариант просто неизбежное следствие наличия ненужных конструкций в языке
Название: Re: Форыч зло
Отправлено: kkkk от Ноябрь 22, 2013, 12:06:22 pm
Моё упущение, надо было так:
some_loop(...)
{
    statement1;
    if (!condition1)
    {
        statement2;
        if (condition2)
             continue;
    }
    statement3;
}
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 22, 2013, 12:39:45 pm
Вспоминается старый добрый FoxPro, у которого во всех циклах, включая аналог форыча SCAN были LOOP и EXIT и никто по этому поводу проблем не испытывал.
Ага. Проблемы испытывали/испытывают те, кто теперь в этих поделках пытается разобраться.
Название: Re: Форыч зло
Отправлено: vlad от Ноябрь 22, 2013, 12:52:39 pm
Ага. Проблемы испытывали/испытывают те, кто теперь в этих поделках пытается разобраться.

Гы. Фокспро вообще легендарная вещь в плане создания несопровождаемых программ. Циклы - лишь одно из средств...
Название: Re: Форыч зло
Отправлено: Kemet от Ноябрь 22, 2013, 02:30:47 pm
Вспоминается старый добрый FoxPro, у которого во всех циклах, включая аналог форыча SCAN были LOOP и EXIT и никто по этому поводу проблем не испытывал.
Ага. Проблемы испытывали/испытывают те, кто теперь в этих поделках пытается разобраться.
А это проблема та же, что сейчас в 1С - код, написанный профессиональными программистами, легко понимается и сопровождается, а остальные поделки, написанные наспех обученными школьниками, анализу не поддаются )))
К тому же, языковые конструкции здесь не причём  - если в голове бардак, то ничто не спасёт, об этом уже 100500 раз говорилось.
Название: Re: Форыч зло
Отправлено: ilovb от Ноябрь 22, 2013, 02:40:02 pm
Думаю(вернее надеюсь), что если запретить форыч, бряки и контины, то многие говнокодеры внезапно станут профнепригодны.... Ну или им придется таки повышать свою квалификацию.  :)
Название: Re: Форыч зло
Отправлено: Илья Ермаков от Ноябрь 23, 2013, 09:45:07 am
Они перестанут писать циклы вообще ))
В до-синт-сахарные времена так и было - говнокодеры дико боялись писать сколь-нибудь непримитивный цикл и бежали искать библиотеку/компонент.
Если для Delphi не находилось готового компонента - шли к начальству и докладывали, что задача неразрешима на данной фазе научно-технического прогресса.
Название: Re: Форыч зло
Отправлено: valexey_u от Ноябрь 23, 2013, 10:24:30 am
Они перестанут писать циклы вообще ))
В до-синт-сахарные времена так и было - говнокодеры дико боялись писать сколь-нибудь непримитивный цикл и бежали искать библиотеку/компонент.
Если для Delphi не находилось готового компонента - шли к начальству и докладывали, что задача неразрешима на данной фазе научно-технического прогресса.

Сейчас также. И дело не в циклах.
Название: Re: Форыч зло
Отправлено: Илья Ермаков от Ноябрь 23, 2013, 11:58:50 am
Сейчас также - это ясно ))

Я про другое - что в своём коде старались не писать циклов вообще, кроме самых тупых for.
Даже всерьёз давались советы: "Если вы видите, что вам требуется цикл сложнее, чем for, поищите библиотечную функцию и не изобретайте велосипед".
Название: Re: Форыч зло
Отправлено: Geniepro от Ноябрь 23, 2013, 12:13:10 pm
Сейчас также - это ясно ))

Я про другое - что в своём коде старались не писать циклов вообще, кроме самых тупых for.
Даже всерьёз давались советы: "Если вы видите, что вам требуется цикл сложнее, чем for, поищите библиотечную функцию и не изобретайте велосипед".

У функциональных программистов этот совет актуален и сейчас: если вы видите, что у вас получилась рекурсия, попробуйте переделать функцию с использованием стандартных map/reduce/filter/zip.  :P
Название: Re: Форыч зло
Отправлено: valexey_u от Ноябрь 23, 2013, 01:16:04 pm
Сейчас также - это ясно ))

Я про другое - что в своём коде старались не писать циклов вообще, кроме самых тупых for.
Даже всерьёз давались советы: "Если вы видите, что вам требуется цикл сложнее, чем for, поищите библиотечную функцию и не изобретайте велосипед".

У функциональных программистов этот совет актуален и сейчас: если вы видите, что у вас получилась рекурсия, попробуйте переделать функцию с использованием стандартных map/reduce/filter/zip.  :P

Это вообще очень хороший совет - по возможности использовать более узкоспециализированные высокоуровневые вещи вместо чуть причесанного синтаксически goto. Просто потому, что в этом случае при чтении кода лучше будет понятна суть происходящего.
Название: Re: Форыч зло
Отправлено: Илья Ермаков от Ноябрь 23, 2013, 06:57:40 pm
Знаешь, глядя на вызов какой-то специализированной функции (допустим, коих в каком-нибудь быдло-скрипте типа PHP сотни), я должен гадать, что она делает, хотя это могло быть записано 3-5 строками кода, про который ничего не нужно гадать :)

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