наверняка многие сталкивались с подобным сценарием когда думаешь искусственный
цикл или goto...
попробую объяснить на примере скачивания файла из сети
есть некая функция которая скачивает из интернета файл
иногда сервер закрывает соединение не отдав весь файл
я делаю новый запрос с полем Range: дабы докачать "хвост"
и иногда сервер отвечает кодом 404 Not Found у меня вылетает исключение
которое надо перехватить на месте получить новую ссылку на этот же файл
и докачать файл
вопрос в том как организовать тело функции самое очевидное это
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>наверняка многие сталкивались с подобным сценарием когда думаешь искусственный J>цикл или goto...
J>как лучше организовать тело функции ?
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>Здравствуйте, TarasB, Вы писали:
J>нет if неполучится код библиотечный кидает исключение мне тогда придется внутри read_internet_file ставить catch
Хреново, тогда я бы написал второй вариант из 1го сообщения.
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>не тогда придется состояние передавать а там около 4-5 параметров получается J>да и искуственно это как то лепить for там где он не нужен...
Почему же не нужен?
Если сперва писать комментарии (что собираешься делать), а потом вбивать код, то получается вполне естественно:
// ПОКА ФАЙЛ НЕ ПОЛУЧЕН
{
// СГЕНЕРИТЬ ССЫЛКУ
// ЗАПРОСИТЬ ФАЙЛ
}
Цикл здесь очень даже уместен.
Насчет состояния...
иногда приходится заводить "контекст" и прогонять его через несколько уровней. Там может храниться дофига параметров, которые локальны по своей сути и их не вынесешь в описание класса, но которые дорого вычислять на каждом уровне.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, niXman, Вы писали:
X>это что получается, только меня одного смущает то, что приложение будет заблокировано пока файл качается?
Возможно — это требуемой по ТЗ поведение.
Вариант с goto легче понимается — буквально с первого прочтения; вариант же с break и continue более сложен для понимания — с четверга полудня по вечер пятницы такой код никто фиксить или рефакторить не будет, отложат на вторник.. Мой выбор — с goto.
Здравствуйте, VVV, Вы писали:
VVV>Вариант с goto легче понимается — буквально с первого прочтения; вариант же с break и continue более сложен для понимания — с четверга полудня по вечер пятницы такой код никто фиксить или рефакторить не будет, отложат на вторник.. Мой выбор — с goto.
если честно с goto мне тоже нравится
ой рискую я сейчас наставят мне минусов
Здравствуйте, jyuyjiyuijyu, Вы писали:
VVV>>Вариант с goto легче понимается — буквально с первого прочтения; вариант же с break и continue более сложен для понимания — с четверга полудня по вечер пятницы такой код никто фиксить или рефакторить не будет, отложат на вторник.. Мой выбор — с goto. J>если честно с goto мне тоже нравится J>ой рискую я сейчас наставят мне минусов
Если тебе нравится вариант с goto, если тебе он кажется более понятным — используй его, не комплексуй (конечно если в твоей команде нет каких-то жёстких guidelines на эту тему).
Например, вот что говорит Александр Степанов про goto: 1
Здравствуйте, VVV, Вы писали:
VVV>Вариант с goto легче понимается — буквально с первого прочтения; вариант же с break и continue более сложен для понимания — с четверга полудня по вечер пятницы такой код никто фиксить или рефакторить не будет, отложат на вторник.. Мой выбор — с goto.
Нет, не легче. В коде по смыслу цикл, значит и нужно писать цикл, а уж что там for, do, while выбирать по вкусу. А вот goto тут ни к селу ни к городу.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Если тебе нравится вариант с goto, если тебе он кажется более понятным — используй его, не комплексуй (конечно если в твоей команде нет каких-то жёстких guidelines на эту тему).
Только вот, если побьют потом, пенять будет он на себя.
В коде по смыслу цикл, даже его метка об этом говорит, зачем код извращать на сокрытие цикла? Чтоб никто не догадался?
Здравствуйте, jyuyjiyuijyu, Вы писали: J>наверняка многие сталкивались с подобным сценарием когда думаешь искусственный J>цикл или goto...
Желание добавить goto или break в цикле говорит о том, что возможно пора добавить новую функцию. Последнее бывает затруднительно только при наличии большого числа тесно связанных переменных.
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>наверняка многие сталкивались с подобным сценарием когда думаешь искусственный J>цикл или goto...
для меня goto так же как и char* — слишком низкоуровневая конструкция языка. я стараюсь (и другим советую) использовать более высокоуровневые средства типа std::string, for\while
например:
/**
Returns
true if file was read
false if file cannot be reached by generated link (error 404)
throws exception in case of other problem
*/bool generate_and_read()
{
auto link = generate_link();
try
{
read_internet_file(link);
return true;
}
catch (web_exception& e)
{
if (e.code == http_code::not_found)
return false;
throw;
}
//unreachable codereturn true;
}
void f()
{
//here we can add limit for attempt numberwhile (!generate_and_read())
{
//empty body
}
}