Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2017, 20:04   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Ленивые структуры данных

У меня есть классы, которые должны хранить список сотрудников. Этот список берется из базы, которую не надо нагружать лишний раз. Поэтому списки сотрудников должны заполняться только когда они действительно нужны.

Я пытаюсь реализовать ленивость как в хаскеле. Для этого я написал такую обертку над QList:

Код:
class LazyEmployeeList
{
    QList<Employee> lazy;

public:
    LazyEmployeeList(int id);
    QList<Employee>::iterator begin();
    QList<Employee>::iterator end();

private:
    bool loaded;
    int _id;
    void load_from_db(int id);
};
Код:
LazyEmployeeList::LazyEmployeeList(int id)
    : _id(id), loaded(false)
{

}

void LazyEmployeeList::load_from_db(int id)
{
    QString sql = "SELECT id FROM employee WHERE superior = " + QString::number(id);
    QSqlQuery query(sql);
    while (query.next())
    {
        int emp_id = query.value(0).toInt();
        lazy.push_back(Employee(emp_id));
    }
}

QList<Employee>::iterator LazyEmployeeList::begin()
{
    if (!loaded)
    {
        load_from_db(_id);
        loaded = true;
    }
    return lazy.begin();
}

QList<Employee>::iterator LazyEmployeeList::end()
{
    if (!loaded)
    {
        load_from_db(_id);
        loaded = true;
    }
    return lazy.end();
}
Вроде, работает, но мне все равно не нравится. Как можно улучшить этот класс? Может быть, усилить ленивость, чтобы заполнялся не сразу весь список, а по мере обращения к его конкретным элементам? То есть нужен следующий - загружаем его.
Aoizora вне форума Ответить с цитированием
Старый 20.07.2017, 00:20   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А если надо искать по имени а не по супериору, тогда пишем новый класс?
Я уж молчу, что пока что у вас только одно ID, а вот если полей станет больше все query.value(7) будут сбивать с толку - поди вспомни, что содержиться в восьмой колонке...
waleri вне форума Ответить с цитированием
Старый 20.07.2017, 09:56   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Взрослые ORM наоборот пытаются пачкой данные грузить, а не на каждый чих грузить данные из базы. При получении списка id, СУБД легко и просто вытащить все данные, а так фигня получится если отдельно грузить id, а потом для каждого id отдельно запись подтягивать.
Пилите темплейтовый класс LazyList, чтобы работал не только для Employee и не только для int id. Всё равно будет бесполезная вещь, но опыта наберётесь с шаблонами
pu4koff вне форума Ответить с цитированием
Старый 20.07.2017, 10:54   #4
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Взрослые ORM наоборот пытаются пачкой данные грузить, а не на каждый чих грузить данные из базы.
Согласен с этим. Но ведь ленивые списки, на мой взгляд, не делают хуже, к тому же заполнение такого списка можно сделать в транзакции, чтобы БД не открывалась перед получением очередной записи.
Aoizora вне форума Ответить с цитированием
Старый 20.07.2017, 11:05   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

1. транзакции лучше: открыл и закрыл, а не держать висящими пока кто-то по списку гуляет туда-сюда.
2. пока будете лениво шагать по списку, он может быть в другом состоянии. элемент с этим id уже удалили или добавили новый,... получится ленивый список с "грязными" данными.
3. это изобретение велосипеда и в мир код этот не пойдёт. Хочется прикрутить к нему свистелок - универсализируйте через шаблоны или еще как и работайте над потокобезопасностью. Получите полезные навыки и знания.

ИМХО, полностью ленивый список, когда элементы подхватываются по ID-родителя или еще по какому критерию - это ОК. Ленивый список, когда элементы подхватываются по итератору или еще как - лишний головняк с кучей подводных камней, который только ухудшит производительность и усложнит код.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структуры данных Си Александр Волков Общие вопросы C/C++ 3 25.05.2017 15:21
Структуры данных на С. art1es23 Общие вопросы C/C++ 3 05.11.2015 14:42
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39
Структуры данных Gapro Общие вопросы C/C++ 11 23.10.2011 09:02
С++ Структуры данных DarkSwan Помощь студентам 0 27.10.2010 12:21