Проект ConvertFS близится к выкладыванию версии 0.1a на гуглокод. И там возникла такая ситуация: есть некий относительно медленно пополняемый буфер (инкапсулирован в c), и к нам приходит запрос на чтение size байт из него, начиная с offset'ого. Если в буфере уже доступны offset + size байт, всё прекрасно, а если нет, надо дождаться, пока они там появятся, или будет ясно обозначено, что буфер кончился, и присланный запрос на чтение может быть удовлетворён лишь частично, а то и не может быть удовлетворён вовсе. Думаю, по названию поста, все уже догадались, что сейчас будет код на C++, причём хамский:
int VirtualFile::read(char* buf, size_t size, off_t offset) { start: if (offset + size <= c->availableDataAmount()) { c->getData(buf, size, offset); return size; } else { if (c->hasFinished()) { size_t bytesLeft = c->availableDataAmount() - offset; if (bytesLeft <= 0) { return 0; } else { c->getData(buf, bytesLeft, offset); return bytesLeft; } } else { while (offset + size > c->availableDataAmount() && !c->hasFinished()) { usleep(1000); } goto start; // avoid unnecessary recursion } } }
Самая читаемая замена goto в данном случае — рекурсивный вызов самой себя с теми же аргументами ещё раз. В первой версии так и было — а хуле, стек практически бесконечный, засрём его вместе. Только вот непонятно зачем в таком случае надо было писать на крестах, ведь кроме эффективности плюсов от их использования никаких нет, а биндинги к fuse существуют и для python.
Рекурсию можно заменить циклом. Он будет тут абсолютно не в тему, тело выполнится максимум два раза, и как назвать управляющую переменную тоже непонятно. Зато структурно. Повысилась читаемость, допускается меньше ошибок. Не правда ли?
Попротиворечу, что любой радикализм — это плохо и займусь коммерческими проектами 
Доступные тэги: <b>, <i>, <s>, <u>, <a href="">, <img src="" /> (загрузить), <pre>, <quote>
- themylogin › Самое дорогое в жизни Вчера, 02:19
- ramwoolf › Am I not always be wanting this? (x8) 16 мая, 23:08
- anonymous › Написание «не» с различными частями речи 16 мая, 16:06
- anonymous › A Tragedy in the Air 15 мая, 18:24
- themylogin › Итоги 2011 15 мая, 12:10
- themylogin › На гелике езжу 13 мая, 16:24
- anonymous › Waking up at ten 13 мая, 13:16
- themylogin › Жук 12 мая, 11:55
- themylogin › Давайте шутки из твиттера продолжим развивать здесь 7 мая, 11:03
- anonymous › Шевченко лох 6 мая, 14:02