Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / создание классов / 11 сообщений из 11, страница 1 из 1
24.12.2004, 13:14
    #32843696
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
столкнулся с проблемой:
есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
__gc class DataBase
{
	Odbc::OdbcConnection * connDB;
	Odbc::OdbcCommand * cmdDB;
	Odbc::OdbcDataAdapter * daDB;
    public:
             DataBase(String * path);
             ...
             int EditData(DataSet *);
             int DelData(DataSet *);
             int AddData(DataSet *);
}

и теперь в раздумиях: DataSet * %база% делать членом класса или оставить его на стороне клиента?
модификация бд, как видно, оставлена на класс DataBase. однако отображением данных в DataGrid * %табл% занимается клиент.
...
Рейтинг: 0 / 0
24.12.2004, 14:39
    #32843926
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
Очень соблазнительно закинуть датасет клиенту, но мое ИМХО нужно оставить на "серваке"-базе. Таким образом меняя базу ты сразу будешь менять и набор датасетов.
...
Рейтинг: 0 / 0
24.12.2004, 15:35
    #32844080
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
просто если оставить DataSet * %база% на сервере, то придется либо давать доступ на чтение DataSet * %база% для обновления DataGrid * на стороне клиента, либо писать ф-цию обновления в рамках класса DataBase. но 2ой вариант не катит: DataBase занимается только модификацией и предоставлением данных бд; их конечное использование его не касается. 1ый вариант вынуждает иметь 2 копии DataSet'а: в экземпляре класса и у клиента. при public DataBase::DataSet'е он открыт для записи. гмм. вот. может, я просто слишком параноид?
...
Рейтинг: 0 / 0
24.12.2004, 15:41
    #32844096
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
я думаю здесь проще применить паттерн "декоратор". Когда "на базе" у тебя есть закрытый класс датасет, а у клиента есть декоратор датасета, который является к нему другом и инициализируется от указателя на датасет. Он просто будет отвечать за то множество интерфейсных функций которые необходимы для грида. вот и все.
...
Рейтинг: 0 / 0
24.12.2004, 16:13
    #32844164
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
у клиента есть декоратор датасета
ты имеешь ввиду:
Код: plaintext
1.
2.
3.
DataBase * db = new DataBase(S"c:\\database\\");
DataSet * client = new DataSet(db->get_dataset());
... //здесь пользуем автономный DataSet * client.
 etc.
?
...
Рейтинг: 0 / 0
24.12.2004, 16:36
    #32844221
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
ну наверное да если на самом деле это выглядит так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class DataBase{
public:
  typedef DataSetDecorator DataSet;
  DataSet get_dataset() const { return DataSet( new DataSetOriginal ); }
  class DataSetDecorator{
   ...
  };
private:
  class DataSetOriginal{
  private:
    DataSetOriginal();
    ...
  };
};

как-то так...
у клиента
Код: plaintext
1.
2.
3.
typedef DataBase::DataSet DataSet;
DataBase db = new DataBase(S"file.dbf");
DataSet ds = db.get_dataset();

канеш все это надо поправить с учетом управляемого С++.
...
Рейтинг: 0 / 0
24.12.2004, 16:37
    #32844223
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
декотратор можно объявить во вне, но тогда надо будет ставить friend.
...
Рейтинг: 0 / 0
24.12.2004, 16:48
    #32844246
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
dwl
Код: plaintext
DataSet get_dataset() const { return DataSet( new DataSetOriginal ); }

вот, что мне было надо, точно! спасибо. реально, возвращая константный DataSet *, ты решаешь проблему и лишней копии, и неизменности оригинального DataSet'а =) спасибо.
...
Рейтинг: 0 / 0
24.12.2004, 17:01
    #32844280
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
забыл написать главное! сам декторатор дублирует часть интерфейса декорируемого объекта. такой паттерн применяется, когда ты хочешь клиенту библиотеки предоставть только часть API, или сделать эту API управляемую правами. Еще он испоьлзуется для абстрагирования от конструктора, чтобы сделать их например полиморфиными, как например в фабрике. ну не суть пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class DataSetDecorator{
 DataSetOriginal *ds_; 
public:
 DataSetDecorator( DataSetOriginal *ds ) : ds_(ds) {};
 BOOL Open() const { return ds_->Open(); }
 void Close() const { ds_->Close(); }
 Next...
 Prev...
 Locate...
 ...
}

мысль номер два из области безопасности иерархии классов, т.к. струтура датасетов подчинена струтуре базы, то лучше в случае разрушения объекта базы уничтожать и все датасеты. Для этого вместо вызова оператора new в методе get_dataset надо добавить добавление dataset в список. Естессно писать декторатор тогда надо будет на основе либо итератора, либо ссылки.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class DataBase{
private:
  typedef std::list array;
  array datasets_;

public:
  typedef DataSetDecorator DataSet;

  DataSet get_dataset() const { 
     datasets.push_back( DataSetOriginal() );
     return DataSet( datasets_.rbegin() ); 
  }
  class DataSetDecorator{
   ...
  }

тогда при разваел базы вызовется деструктор массива датасетов и они сделают недействительными декотраторов у клиента. Потому что вызовутся деструкторы все датасетов базы. Возможно вам это и не надо.
...
Рейтинг: 0 / 0
24.12.2004, 17:52
    #32844426
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
DataSet представляет всю бд и создается один для каждого экземпляра. реально, он просто хранит в памяти то, что содержится в файлах бд:
DataSet ~ DataTableCollection. imho, для больших бд это сумашествие. но в бд предполагается кол-во записей <5000.
...
Рейтинг: 0 / 0
25.12.2004, 11:27
    #32844792
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание классов
ну нет так нет.
PS: забыл угловые скобки, заработался вчера. Плюс не стоит использовать в этом случае вектор и дэк, потому что у них итераторы могут становится недействительными. Поэтому только list, а значит фокус с добавлением в конец и чтением реверс-итератора не имеет смысла
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / создание классов / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]