powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / создание классов
11 сообщений из 11, страница 1 из 1
создание классов
    #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
создание классов
    #32843926
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Очень соблазнительно закинуть датасет клиенту, но мое ИМХО нужно оставить на "серваке"-базе. Таким образом меняя базу ты сразу будешь менять и набор датасетов.
...
Рейтинг: 0 / 0
создание классов
    #32844080
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
просто если оставить DataSet * %база% на сервере, то придется либо давать доступ на чтение DataSet * %база% для обновления DataGrid * на стороне клиента, либо писать ф-цию обновления в рамках класса DataBase. но 2ой вариант не катит: DataBase занимается только модификацией и предоставлением данных бд; их конечное использование его не касается. 1ый вариант вынуждает иметь 2 копии DataSet'а: в экземпляре класса и у клиента. при public DataBase::DataSet'е он открыт для записи. гмм. вот. может, я просто слишком параноид?
...
Рейтинг: 0 / 0
создание классов
    #32844096
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
я думаю здесь проще применить паттерн "декоратор". Когда "на базе" у тебя есть закрытый класс датасет, а у клиента есть декоратор датасета, который является к нему другом и инициализируется от указателя на датасет. Он просто будет отвечать за то множество интерфейсных функций которые необходимы для грида. вот и все.
...
Рейтинг: 0 / 0
создание классов
    #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
создание классов
    #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
создание классов
    #32844223
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
декотратор можно объявить во вне, но тогда надо будет ставить friend.
...
Рейтинг: 0 / 0
создание классов
    #32844246
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dwl
Код: plaintext
DataSet get_dataset() const { return DataSet( new DataSetOriginal ); }

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


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