Подскажите шаблон
От: Аноним  
Дата: 10.06.08 13:20
Оценка:
Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД —
Линтер, PostgreSQL, InterBase.
Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы.
Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме.
В общем, мне надоели бесконечные

if (postgres()) {
//
} else if (interbase()) {
//
} else {
//
}


Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой.
Спасибо.
Re: Подскажите шаблон
От: Sharp Eye Россия  
Дата: 10.06.08 13:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД -

А>Линтер, PostgreSQL, InterBase.
А>Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы.
А>Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме.
А>В общем, мне надоели бесконечные

А>
А>if (postgres()) {
А>//
А>} else if (interbase()) {
А>//
А>} else {
А>//
А>}
А>


А>Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой.

А>Спасибо.

М.б. виртуальные функции?
Re: Подскажите шаблон
От: rg45 СССР  
Дата: 10.06.08 13:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД -

А>Линтер, PostgreSQL, InterBase.
А>Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы.
А>Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме.
А>Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой.

Этот шаблон (паттерн) называется посетитель(visitor). В двух словах идея такова: заводишь два абстрактных класса — один для типов баз, другой — для типов операций с ними. И в каждом конкретном типе базы реализуешь конкретные операции. Погугли — найдется много.
--
Re: Подскажите шаблон
От: Аноним  
Дата: 10.06.08 13:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД -

А>Линтер, PostgreSQL, InterBase.
А>Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы.
А>Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме.
А>В общем, мне надоели бесконечные

А>
А>if (postgres()) {
А>//
А>} else if (interbase()) {
А>//
А>} else {
А>//
А>}
А>


А>Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой.

А>Спасибо.

Используй наследников. Т.е. создай интерфейс ISqlRequest котороый описывает все необходимые действия, далее унаследуйся от него:
CSqlRequestPostgres : ISqlRequest для postrges, CSqlRequestInterbase : ISqlRequest для interbase и так далее. Создай фабрику объектов, которая будет сама создавать нужный тебе экземпляр, но работай с ним через ISqlRequest.
Re[2]: Подскажите шаблон
От: rg45 СССР  
Дата: 10.06.08 14:37
Оценка:
Здравствуйте, 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 {/*...*/};
//...
--
Re: Подскажите шаблон
От: Libra Россия  
Дата: 11.06.08 06:57
Оценка: 4 (1)
Здравствуйте, Аноним, Вы писали:

А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД -

А>Линтер, PostgreSQL, InterBase.
А>Допустим, я выделил все SQL операции в отдельный класс. В нем создаю и выполняю sql запросы.
А>Эти запросы немного различаются от базы к базе. Также есть небольшие различия в алгоритме.
А>В общем, мне надоели бесконечные

А>
А>if (postgres()) {
А>//
А>} else if (interbase()) {
А>//
А>} else {
А>//
А>}
А>


А>Подозреваю, что на этот случай уже давно придумали шаблон. Подскажите какой.

А>Спасибо.

Ко всему что уже было сказано могу лишь добавить еще одно решение, основанное на использовании template-ов.
Оно менее гибкое чем те что уже предложили Sharp Eye и rg45, но на мой взгляд тоже имеет право на жизнь.


template<typename dbT>
class database
{
public:
  // ...
  void make_query0(...);
  void make_query1(...);
  // ...
};

struct interbase_tag {};
struct oracle_tag {};
struct postgress_tag {};
// ...

template<>
class database<interbase_tag>
{
public:
  void make_query0()
  {
    // implementation for Interbase...
  }
  void make_query1()
  {
    // implementation for Interbase...
  }
};

template<>
class database<oracle_tag>
{
public:
  void make_query0()
  {
    // implementation for Oracle...
  }
  void make_query1()
  {
    // implementation for Oracle...
  }
};

#if defined(USE_ORACLE)
  typedef database_tag oracle_tag
#elif defined(USE_INTERBASE)
  typedef database_tag interbase_tag
#else
#  error Database type isn't set...
#endif

typedef database<database_tag> database_type;

int main(int, char* [])
{
  database_type db;
  db.make_query1(...);
  return 0;
}


Удачи.
Species come and go, but the earth stands forever fast...
Re: Подскажите шаблон
От: Germes Украина  
Дата: 11.06.08 08:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Разрабатываю клиентское приложение к СУБД на С++. Необходимо поддержать несколько СУБД -

А>Линтер, PostgreSQL, InterBase.

посмотри OTL
может это то что тебе нужно ?
С уважением Germes!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.