Автор Тема: Форыч зло  (Прочитано 19101 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Форыч зло
« : Ноябрь 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.

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

Вывод: Форыч зло.
 

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Форыч зло
« Ответ #1 : Ноябрь 21, 2013, 03:33:57 pm »
Это смотря какой форыч :-) Вот std::for_each от этих недостатков свободен. Ну и вообще это не языковая конструкция :-)

Равно как и подобные штуки в том же Haskell'e. Там вообще в принципе циклов нема. А foreach есть. Но не в языке.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Форыч зло
« Ответ #2 : Ноябрь 21, 2013, 03:35:39 pm »
Да, кроме того, говнокод можно написать хоть с while хоть с форычем хоть с чем угодно. Тут не конструкции виноваты, а таки руки и голова писавшего. А скорее всего проблемы еще уровнем выше - работа организована не правильно, организация работы наверняка такова, что провоцирует на лепление заплаток на скорую руку, время на рефакторинг кода в план не заложено в принципе.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Форыч зло
« Ответ #3 : Ноябрь 21, 2013, 04:10:41 pm »
Вот std::for_each от этих недостатков свободен.
Ну это другое. Тема именно про цикл.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Форыч зло
« Ответ #4 : Ноябрь 21, 2013, 04:17:32 pm »
Да, кроме того, говнокод можно написать хоть с while хоть с форычем хоть с чем угодно.

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

ps Я подразумеваю while без continue и break.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Форыч зло
« Ответ #5 : Ноябрь 21, 2013, 04:19:21 pm »
Вот std::for_each от этих недостатков свободен.
Ну это другое. Тема именно про цикл.

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

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

P.S. Сам continue не использую.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Форыч зло
« Ответ #6 : Ноябрь 21, 2013, 04:21:29 pm »
ps Я подразумеваю while без continue и break.

Ха-ха-ха. Хитрый какой. Т.е., в for each мы будем пихать continue/break и смешивать его с говном, а священный while - надо писать только по всем правилам :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Форыч зло
« Ответ #7 : Ноябрь 21, 2013, 04:27:33 pm »
Есть циклы которые нельзя написать через форыч без continue или break.
Речь именно о таких циклах. Их нужно писать через while, но народ этого не делает. Неужели непонятно из первого поста?

Цитировать
std::for_each использую практически каждый день, все хорошо.
Тема про цикл!
« Последнее редактирование: Ноябрь 21, 2013, 04:29:28 pm от ilovb »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Форыч зло
« Ответ #8 : Ноябрь 21, 2013, 04:38:34 pm »
Есть циклы которые нельзя написать через форыч без continue или break.
Речь именно о таких циклах. Их нужно писать через while, но народ этого не делает. Неужели непонятно из первого поста?
Действительно было не понятно. С тем что делать абсолютно всё через for_each, или через while не правильно - конечно соглашусь. И да, в языке (если язык таков что без непосредственной поддержки циклов в языке там не обойтись) либо в стандартной либе (если язык высокоуровневый) должен быть набор узкоспециализированных "циклов", а не надобор универсального непонятночего.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Форыч зло
« Ответ #9 : Ноябрь 21, 2013, 04:55:54 pm »
Ну я не против форыча как такового. По сути, да, я против неправильного использования.
С этой проблемой можно бороться выпиливанием из языка continue и break.
Но мне думается, что лучше выпилить форыч (цикл). Так как он навязывается дизайном коллекций.(необходимости в нем нет) Дизайн ведь можно сделать удобным для while (курсоры) Форыч просто лишняя сущность.
Ну и функции типа std::for_each тоже его спокойно заменяют.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Форыч зло
« Ответ #10 : Ноябрь 21, 2013, 05:02:33 pm »
...
Сегодня два часа воевал с одним циклом.
...
3 вложенных Форыча, ~300 строк, в каждом форыче несколько continue.
...
Вывод: Форыч зло.

Вывод неверный. Зло -- не форыч, а эти самые триста строк говнологики в нём...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Форыч зло
« Ответ #11 : Ноябрь 21, 2013, 05:04:10 pm »
Кстати еще более проявлено навязывание форыча и continue с break в Python.
Хоть я и симпатизирую лаконичности этого языка, но дизайн циклов в нем будто бывалый говнокодер проектировал.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Форыч зло
« Ответ #12 : Ноябрь 21, 2013, 05:06:29 pm »
Вывод неверный. Зло -- не форыч, а эти самые триста строк говнологики в нём...
Под говнологикой подразумевался форыч+continue*n. Так что мимо...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Форыч зло
« Ответ #13 : Ноябрь 21, 2013, 05:20:41 pm »
Вывод неверный. Зло -- не форыч, а эти самые триста строк говнологики в нём...
Под говнологикой подразумевался форыч+continue*n. Так что мимо...

В любом случае цикл, в котором 300 строк, -- уже зло по умолчанию. А форыч он или while или std::for_each -- уже не важно.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Форыч зло
« Ответ #14 : Ноябрь 21, 2013, 05:22:51 pm »
Ну замени код на вызовы процедур. Сути это не меняет.

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