Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

Я пытаюсь реализовать ленивость как в хаскеле. Для этого я написал такую обертку над 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, 01:20   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,478
Репутация: 1667
По умолчанию

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


19:30.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru