Опубликовано 26 февраля 2010, 10:39 под Muse - Starlight

Проект 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>
Теги
1nsk Alternative E-Business Embedded GNU/GPL-софт HTML/CSS ICQ KDE last.fm Linux Linuxnsk Live Lyceum game Microsoft Motivator MySQL New Age P2P Party Photoshop PHP Python Qt4/C++ SEO Sibnet thelogin.ru Timelapse Web 2.0 Webdev Webstream Windows Wireless А я говорил! Авто Админ Алексеев Аниме Атмосфера Безобразие Бесплатный Wi-Fi Блоги Большой бизнес Боты Бред Бухать Бытовуха Велосипед Весна Вечер Взлом Винил Винтаж Вконтакте Вода Воспоминания Гетто Гламур Гопота Горский Графити Грузовик Дача Двор Девушки Девченки!!! Деньги Дизайн Дом Домофоны Драка Драки Еда Железо Животные Заведения общественного отдыха Задроты Затулинка Зима Игрушки Игры Идея Интересно Интернет Исследование История Казань Карикатура Квартира Класс Компьютеры Коромшук Коты КПК Кран Красиво Криминал Крыша Курение Лето Литература Лицей Лицей НГТУ Лохи Магнитофоны Маркса Мат Математика Машинный перевод Мегафон Менты Метро Мечты Мифы Мне стыдно Мобайл Можга МТС Музыка Мультикасса Мультики Мы помним Надписи Наука НГТУ Недвижимость Непоняятно Новосибирск Носители Ноутбуки Ночь Обидно Обман Образование Общественный транспорт Омск Опечатки Орфография Осень Парк Периферия Пиратство Плохо Погода Поезд Помойка Праздники Презрение Природа Провайдеры Программирование Протест Радиотехника Растения Реклама Религия и вера Ретро Рисунок Руины Рэп Салют Сервер Серверы Сервис Сериалы Скринкаст Скриншоты Смешно СМИ Снег Собаки Совет Софт Спам Спасём Россию Спецтранспорт Стоп-ляп Стройка Студяга Танцы ТВ Типа страх Трамваи Транс Транспорт Уважаю Ужас Умный дом Утро Филдрепорты Философия Форум ФПМИ Хикки Хостинг Цитатник Школа Школа 208 ЭГ Эксперимент Юго-Западный
Twitter 26-02-2010
Lorem Ipsum
Если вы хотите иметь общие темы для разговора с девушками, которые через каких-то 5-7 лет будут писать приложения на OCaml и Erlang за соседним с вами столом.
Lorem Ipsum
Там момент на валу открытием тиристора управляется, а он, зараза такая, одну полуволну режет, получается как лампа накаливания, если её через диод запитать :-D.
Lorem Ipsum
Поцоны ни у кого не завалялось К157ДА1??? Конечно ни у кого я выёбываюсь просто.
Lorem Ipsum
(22:08:55) themylogin: не альфа-самец, так хоть альфа-тестер.
Lorem Ipsum
Королева библиотеки.
Lorem Ipsum
Ты уже придумал, какой робот заменит сраное животное, которое даже мямлить не умеет - то есть, тебя?
Lorem Ipsum
Подскажу, этот робот будет цилиндрическим со множеством шлангов, термометром и краном. А внутри него будет скрываться большой кипятильник. Ты ведь понял о чем я.
Lorem Ipsum
02-Янв-10 19:24 (спустя 8 дней) [Цитировать] Вы ахуели какие ремиксы песен арии аъхуели чтоли??? Гопари сраные днб ему блять трансер хренов.
Lorem Ipsum
Мне приснилось, что я писал код, для юнит-тестирования которого не надо было городить с десяток моков, а потом и вовсе получилось TTD :'(.
Lorem Ipsum
За тысячу йен в час (примерно 10 долларов США) можно сколько хочешь гладить, тискать, взъерошивать, играть, кормить, ласкать любого приглянувшегося кота.