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

Madzi

  • Jr. Member
  • **
  • Сообщений: 86
    • Просмотр профиля
Re: Форыч зло
« Ответ #15 : Ноябрь 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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Форыч зло
« Ответ #16 : Ноябрь 21, 2013, 05:29:50 pm »
И чем это лучше continue?

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Форыч зло
« Ответ #17 : Ноябрь 21, 2013, 05:39:04 pm »
Ну замени код на вызовы процедур. Сути это не меняет.

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

Изменился бы масштаб -- злом оказался бы тот программахер, что этот непонятный цикл наколбасил -- кода всего ничего, а хрен поймёшь...
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Форыч зло
« Ответ #18 : Ноябрь 21, 2013, 05:41:17 pm »
И чем это лучше continue?

Более явно видны намерения программиста. continue/break можно и не разглядеть, а сдвиги кода вправо-влево указывают на изменение пути прохождения кода...
to iterate is human, to recurse, divine

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Форыч зло
« Ответ #19 : Ноябрь 21, 2013, 05:43:52 pm »
Ну замени код на вызовы процедур. Сути это не меняет.

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

Если бы там было 20 строк, и в этих 20 строках были собраны все эти условия с continue, то понять что там происходит было бы НАМНОГО проще.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Форыч зло
« Ответ #21 : Ноябрь 21, 2013, 05:57:36 pm »
Я так вообще практически не пишу continue.
break -- да, сколько угодно, а вот continue -- не, не слышал...
to iterate is human, to recurse, divine

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

ilovb

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

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Форыч зло
« Ответ #23 : Ноябрь 22, 2013, 08:14:22 am »
Думаю все же лучше без бреков и континьев (пардонте за мой хранцузкий), чем без форыча.

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

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Форыч зло
« Ответ #24 : Ноябрь 22, 2013, 08:15:20 am »
По этому правильнее тема звучит так: континьюсы и брейки - зло :)

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Форыч зло
« Ответ #25 : Ноябрь 22, 2013, 08:41:11 am »
Еще правильнее так: континьюсы и брейки в форычах - зло.
Если написано "для каждого ... делай", а оно делается не для каждого, то это сознательное введение в заблуждение.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Форыч зло
« Ответ #26 : Ноябрь 22, 2013, 08:53:31 am »
Еще правильнее так: континьюсы и брейки в форычах - зло.
Если написано "для каждого ... делай", а оно делается не для каждого, то это сознательное введение в заблуждение.

Ну а как? Иногда для простоты кода лучше сделать перебор через форыч, а прерывание перебора -- через брейк. Главное что бы код цикла был коротким -- тогда проблем с восприятием не возникнет...
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Форыч зло
« Ответ #27 : Ноябрь 22, 2013, 09:03:31 am »
Да, был бы составной цикл типаforeach (var x in xs) while (condition) { statements }цены бы ему не было бы...
to iterate is human, to recurse, divine

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

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Форыч зло
« Ответ #28 : Ноябрь 22, 2013, 09:07:35 am »
Зло - это break в форыче, а continue (или IFы внутри цикла) позволяют выразить вполне определённый смысл:
для всех этаких сделать кой-чего.   



Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Форыч зло
« Ответ #29 : Ноябрь 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 (ценой ухудшения понятности кода)?
to iterate is human, to recurse, divine

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