Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД —
Линтер, PostgreSQL, InterBase.
Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы.
Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме.
В общем, мне надоели бесконечные
if (postgres()) {
//
} else if (interbase()) {
//
} else {
//
}
Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой.
Спасибо.
Здравствуйте, Аноним, Вы писали:
А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД - А>Линтер, PostgreSQL, InterBase. А>Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы. А>Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме. А>В общем, мне надоели бесконечные
А>
Здравствуйте, Аноним, Вы писали:
А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД - А>Линтер, PostgreSQL, InterBase. А>Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы. А>Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме. А>Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой.
Этот шаблон (паттерн) называется посетитель(visitor). В двух словах идея такова: заводишь два абстрактных класса — один для типов баз, другой — для типов операций с ними. И в каждом конкретном типе базы реализуешь конкретные операции. Погугли — найдется много.
--
Re: Подскажите шаблон
От:
Аноним
Дата:
10.06.08 13:45
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД - А>Линтер, PostgreSQL, InterBase. А>Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы. А>Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме. А>В общем, мне надоели бесконечные
А>
А>Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой. А>Спасибо.
Используй наследников. Т.е. создай интерфейс ISqlRequest котороый описывает все необходимые действия, далее унаследуйся от него:
CSqlRequestPostgres : ISqlRequest для postrges, CSqlRequestInterbase : ISqlRequest для interbase и так далее. Создай фабрику объектов, которая будет сама создавать нужный тебе экземпляр, но работай с ним через ISqlRequest.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Аноним, Вы писали:
А>>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД - А>>Линтер, PostgreSQL, InterBase. А>>Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы. А>>Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме. А>>Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой.
R>Этот шаблон (паттерн) называется посетитель(visitor). В двух словах идея такова: заводишь два абстрактных класса — один для типов баз, другой — для типов операций с ними. И в каждом конкретном типе базы реализуешь конкретные операции.
Что-то наподобие такого:
class IDataBase
{
public:
//Набор операций с базами данных предопределен и фиксированvirtual void perform(class Query&) = 0;
virtual void perform(class Insert&) = 0;
virtual void perform(class CreateTable&) = 0;
virtual void perform(class DropTable&) = 0;
};
class IOperation
{
public:
virtual void accept(IDataBase&) = 0;
};
class Query : public IOperation { void accept(IDataBase& db) { db.perform(*this); } };
class Insert : public IOperation { void accept(IDataBase& db) { db.perform(*this); } };
class CreateTable : public IOperation { void accept(IDataBase& db) { db.perform(*this); } };
class DropTable : public IOperation { void accept(IDataBase& db) { db.perform(*this); } };
void perfom_operation(IDataBase& db, IOperation& op)
{
op.accept(db);
}
//Расширяемый набор классов баз данныхclass OracleDb : public IDataBase {/*...*/};
class InterbaseDb : public IDataBase {/*...*/};
class MsSqlDb : public IDataBase {/*...*/};
class PostgreSQLDb : public IDataBase {/*...*/};
//...
Здравствуйте, Аноним, Вы писали:
А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД - А>Линтер, PostgreSQL, InterBase. А>Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы. А>Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме. А>В общем, мне надоели бесконечные
А>
А>Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой. А>Спасибо.
Ко всему что уже было сказано могу лишь добавить еще одно решение, основанное на использовании template-ов.
Оно менее гибкое чем те что уже предложили Sharp Eye и rg45, но на мой взгляд тоже имеет право на жизнь.
Здравствуйте, Аноним, Вы писали:
А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД - А>Линтер, PostgreSQL, InterBase.