Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Архитектура класса сойденинения с базой данных


Автор: azesmcar 9.10.2008, 10:49
Здравствуйте,

Пишу библиотеку для работы с базой данных. Создаю базовый абстрактный класс 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"];


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

Большое спасибо

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

 smile почему?

Автор: azesmcar 9.10.2008, 11:00
что именно почему?
почему через -> или почему мне нужны операторы? 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 сочтите это за мой личный каприз

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


Автор: Lazin 10.10.2008, 18:39
Мне кажется тему нужно было назвать не "Архитектура класса сойденинения с базой данных", а "Дизайн класса сойденинения с базой данных", так как архитектура может быть только там, где больше одного класса smile 

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)