[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: do... while(false) ? wtf я чего то не понимаю...
Страницы: 1, 2
viper
Добрый день! Подскажите пожалуйста смысл этого кода:

<?php
do {
if ($i < 5) {
echo "i еще недостаточно велико";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "значение i уже подходит";

/* обработка i */

} while (0);
?>

Я не могу понять, мы не уменьшаем $i, и выполняем цикл, до 0, значит цикл бесконечный?
Но на http://php.ru/manual/control-structures.do.while.html пишут что это наоборот хак, и опытные програмисты могут использовать... Если не сложно можно на пальцах обьяснить? Буду очень благодарен
icedfox
Цитата (viper @ 9.12.2015 - 14:49)
if ($i < 5) {

Проверка, если $i меньше 5 , то останавливаем.
Цитата (viper @ 9.12.2015 - 14:49)
$i *= $factor;

Выполняем операцию $i равно $i умножить на 5 умножить на $factor . Значение $factor я у вас не увидел
Цитата (viper @ 9.12.2015 - 14:49)
if ($i < $minimum_limit) {

Проверка, если $i меньше $minimum_limit, то останавливаем. Значение $$minimum_limit я у вас не увидел.
kaww
Цитата (viper @ 9.12.2015 - 08:49)
что это наоборот хак

именно. Так иногда делают, чтобы не плодить вложенных условий. Т.е. можно заменить на
if ($i >= 5) {
$i *= $factor;
if ($i >= $minimum_limit){
echo "значение i уже подходит";
/* обработка i */
}
}
else {
echo "i еще недостаточно велико";
}
viper
Благодарю! Теперь все стало на свои места.
Valick
это что за вынос мозга?
посто нет слов... я это даже говнокодом назвать не могу, так как писал это не говнокодер, а клинический идиот.

_____________
Стимулятор ~yoomoney - 41001303250491
Valick
Цитата (viper @ 9.12.2015 - 12:35)
Благодарю! Теперь все стало на свои места.

что у вас стало на места?

_____________
Стимулятор ~yoomoney - 41001303250491
waldicom
Валик, ты чуго последнее время злой такой?

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
Valick
waldicom, переутомление. Но дело не в этом. (Жена сидит подруку трындит, что злой как собака. Молчи женщина!)
Я добрый. Но как на этот код можно спокойно смотреть...


_____________
Стимулятор ~yoomoney - 41001303250491
viper
Цитата
что у вас стало на места?

Стало понятно как работает этот цикл.
Цитата
я это даже говнокодом назвать не могу, так как писал это не говнокодер, а клинический идиот.

А вот php.net как раз пишет:
Цитата

Опытные пользователи С могут быть знакомы с другим использованием цикла do-while, которое позволяет остановить выполнение хода программы в середине блока, для этого нужно обернуть нужный блок кода вызовом do-while (0) и использовать break. Следующий фрагмент кода демонстрирует этот подход:

Офф документация все таки... Ссылка
И вот уважаемые kaww и icedfox помогли мне понять как это работает
Valick
viper, ок. Раз вы поняли. Расскажите в каких случаях применяется do{}while()
По поводу кода с оф сайта, просто запустите его. Отпишитесь о результате.


_____________
Стимулятор ~yoomoney - 41001303250491
viper
Хм, ну я конечно далеко не гуру, но могу предположить что его можно применять, например при отправке email что то типа такого:

//Предположим что метод валидации у нас в этом классе
// И метода add тоже в этом же классе. Это все условно, просто для примера

do {
if(!$this->validate($post)){
//вывод ошибки
break;
}
//запись в бд
if(!$this->add){
//вывод ошибки
break;
}
//Запись в excel
$xlsx = new PHPExcel();
//Запись в эксель
if(!$objWriter->save('output/' . $fileName . '.xlsx')){
//вывод ошибки
break;
}
$mail = new Mailer();
//И если все предыдущие шаги успешны отправка email
if(!$main->sendMail){
//вывод ошибки
break;
}
//Здесь можно сделать редирект куда нибудь
} while (false);


Но это все условно
А что касается запуска скрипта из манула, так там явно видно что не хватает переменных, соответственно работать не будет
Valick
viper, цикл do{}while() применяется там где решение о продолжении цикла, нельзя принять раньше выполнения первой итерации этого цикла. В вебе таких ситуаций крайне мало.

Цитата (viper @ 9.12.2015 - 13:50)
там явно видно что не хватает переменных, соответственно работать не будет

добавьте, всего-то две переменные.

_____________
Стимулятор ~yoomoney - 41001303250491
AllesKlar
Цитата (viper @ 9.12.2015 - 12:50)
Хм, ну я конечно далеко не гуру, но могу предположить что его можно применять, например при отправке email что то типа такого: .......

Это неудачный пример.
Если есть несколько условий и не хочется городить длииииное условие для if(), то делается так:

$error = false;

if(!$error && !$condition1) {
$error = true;
}

if(!$error && !$condition2) {
$error = true;
}

if(!$error && !$condition3) {
$error = true;
}

if(!$error) {
// .......
} else {
//.....
}


Поэтому, считаю, что do...while(false) - это чистой воды хрень собачая, направленная только на одно: сделать максимально затруднительным понимание логики скрипта.

do...while( $condition) же используется не тогда, когда там какое-то решение принимается, а тогда, когда гарантировано должна пройти минимум одна итерация. Все остальное - это философия отчисленных с философического факультета студентов.

_____________
[продано копирайтерам]
viper
Цитата
применяется там где решение о продолжении цикла, нельзя принять раньше выполнения первой итерации этого цикла.

Да, тут вы правы, но этот код выполнится всего один раз в любом случае, независимо от условий которые написаны в теле цикла, поэтому это сложно назвать циклом, скорее, как на php.net выразились - это "хак".
Я не помню кто то на этом форуме сказал, что если это было придумано разработчиками, значит это для чего то нужно. И если не вы ни я не можем привести пример где эту конструкцию необходимо использовать, это не значит что она не нужна, и не нужно кричать что это "говнокод".
И кстати я где то тут видел, приводили пример реализации, где действительно необходим goto, хотя все кричат на каждом углу что goto - давно пора удалить из языка,

Цитата
В вебе таких ситуаций крайне мало.

Вот вы сами признали что такие ситуации существуют, хотя их и очень мало.


Цитата

Поэтому, считаю, что do...while(false) - это чистой воды хрень собачая, направленная только на одно: сделать максимально затруднительным понимание логики скрипта.


Кто знает, кто знает, если часто использовать эту конструкцию, возможно это не будет затруднять понимание логики...
viper
P.S. я не хочу разводить холиваров smile.gif И не говорю что вы не правы, скорее наоборот правы smile.gif Просто у каждого свое мнение на счет "говнокода" smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.