Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Архитектура класса сойденинения с базой данных, Нужны советы 
:(
    Опции темы
azesmcar
Дата 9.10.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Здравствуйте,

Пишу библиотеку для работы с базой данных. Создаю базовый абстрактный класс DataSet. От него буду наследовать к примеру MySQLDataSet, MSSQLDataSet, OracleDataSet...и так далее.
Встал перед несколькими вопросами.

1. Что будет возвращять функция Query? Подумалось вернуть ссылку на тип QueryResult (другой абстрактный класс) в котором в свою очередь нужно реализовать методы Next, Prev...и так далее.
Код

class DataSet : public IObject
{
public:
    void Connect(    const std::string& host = "",
                    const std::string& login = "",
                    const std::string& password = "");

    void Disconnect();

    QueryResult Query(const std::string& sql); //проблемная строка

    void Execute(const std::string& sql);
private:
    virtual void vConnect(    const std::string& host,
                        const std::string& login,
                        const std::string& password) = 0;

    virtual void vSelectDatabase(const std::string& db) = 0;

    virtual void vDisconnect() = 0;

    virtual void vQuery(const std::string& sql) = 0;

    virtual void vExecute(const std::string& sql) = 0;
};


Как возвращять QueryResult? как обьект его копировать нельзя (класс абстрактный), а по ссылке - что возвращять? не хранить же все созданные обьекты в DataSet и возвращять на них ссылки..можно через std::auto_ptr, но в этом случае обращяться к обьекту придеться только через -> а мне нужны операторы. К примеру
Код

QueryResult& r = dataSet.Query("SOME SQL");
std::cout << "You selected row with id << r["id"];


какие нибудь идеи? вплоть до корневого изменения архитектуры.

Большое спасибо
PM   Вверх
Daevaorn
Дата 9.10.2008, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(azesmcar @  9.10.2008,  11:49 Найти цитируемый пост)
но в этом случае обращяться к обьекту придеться только через -> а мне нужны операторы.

 smile почему?
PM MAIL WWW   Вверх
azesmcar
Дата 9.10.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



что именно почему?
почему через -> или почему мне нужны операторы? smile

1. почему через ->
ответ: А как еще? std::auto_ptr имеет оператор -> и разименовки..но не предлагаете же вы писать
Код

std::auto_ptr<QueryResult> r = ds.Query(...);
(*r)[5]; //как то не красиво

или
Код

std::auto_ptr<QueryResult> r = ds.Query(...);
QueryResult& res = *r; //тоже не то
res[5];

или вообще так
Код

std::auto_ptr<QueryResult> r = ds.Query(...);
r->operator [] (2);

2. почеу нужны операторы
smile сочтите это за мой личный каприз

Это сообщение отредактировал(а) azesmcar - 9.10.2008, 11:01
PM   Вверх
Earnest
Дата 10.10.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Сделай объект- обертку, в него положи умный указатель на свой резалт (auto_ptr использовать нельзя - он не копируется, нужен указатель с подсчетом ссылок); для необходимых операторов реализуй форвард-заглушки...
Возвращать указатель на динамический объект тоже плохо - а вдруг его авто-птр не поймает? И останется висеть память... И потом, указатель с подсчетом ссылок позволяет разделять объекты, не задумываясь о времени жизни.




--------------------
...
PM   Вверх
Lazin
Дата 10.10.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Мне кажется тему нужно было назвать не "Архитектура класса сойденинения с базой данных", а "Дизайн класса сойденинения с базой данных", так как архитектура может быть только там, где больше одного класса smile 
PM MAIL Skype GTalk   Вверх
Lycifer
Дата 16.10.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



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

Плохих последствий много(возврощения указателя из функции так где он заряжается) 

PM MAIL ICQ   Вверх
jonie
Дата 16.10.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



не стоит изобратеть велосипеды. поглядите как сделана NHivernate (.NET) или ADO.NET вообще. Там архитектура продумана как надо (иначе бы ими не пользовались, не так ли?).
Цитата

Создаю базовый абстрактный класс DataSet. От него буду наследовать к примеру MySQLDataSet, MSSQLDataSet, OracleDataSet...и так далее.



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0779 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.