Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2010, 23:36   #1
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию Какой источник выбрать?

Пишу SDI приложение, приложению требуются данные разных типов около 300 Кб. Откуда "правильнее" брать данные. С ODBC как-то не хочется связываться, данные не большие. Мне требуется обращатся к этим данным из любого класса и по возможности не оставляя их в оперативке. Хотелось бы в данном случае ощутить всю мощь MFC и соблюсти архитектуру Doc/View. Заранее благодарен, Алексей.
KemanSR вне форума Ответить с цитированием
Старый 13.11.2010, 12:54   #2
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию Какой источник выбрать? Всё-же!

Пока ждал ответа, пришла мысль использовать глобальную переменную экземпляра приложения.
Так, думаю, примитивно:
Код:
theMyApp.m_sData1
theMyApp.m_sData2
theMyApp.m_sData3
theMyApp.m_iData1
да и данные всегда в оперативке.

Вот так, думаю получше:
Код:
theApp.GetData(pointerliststringData, DATA_FORMAT_GENERAL)
но всёравно что-то смущает, так бы настоящий программист не написал.
KemanSR вне форума Ответить с цитированием
Старый 13.11.2010, 18:10   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

просто на MFC, мало кто пишет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2010, 18:12   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

А поконкретней, что у вас за данные (какого типа)?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 13.11.2010, 23:16   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Читать из файла не думали?
MaTBeu вне форума Ответить с цитированием
Старый 14.11.2010, 10:49   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Создаём класс вида:
Код:
class MyDataManager
{
public:
  static MyData GetMyDataById(int id); // получить данные по идентификатору
  static MyData GetMyDataByName(string name); // Получить данные по имени
  ...
};
В документе для получения данных работаем с этим классом:
Код:
m_data = MyDataManager::GetMyDataById(10);
в view воответственно уже отображаем этот самый m_data.
Ну а теперь самое интересное: получение данных из файла, бд или откуда захочется.
Код:
class MyDataMapper // см. паттерн DataMapper
{
public:
  MyData GetData(int id);  // этот метод вернет данные с соответствующим id
  MyData FindData(string name); // тут поиск данных по имени
  void Insert(MyData new_data); // Добавление данных в файл
  void Delete(MyData del_data); // Удаление данных из файла. В качестве параметра можно и id передавать в принципе
}
Этот класс используется уже только в MyDataManager.
Получаем следующую цепочку:
вид -> документ -> MyDataManager -> MyDataMapper -> файд/БД/...
Если данные не однородные, то на каждый тип можно создать свои Manager и Mapper классы. Так же в Mapper можно добавить кэш и сразу все данные из файла в него записать, чтобы потом в файл не лазить.
Ну а уж что в качестве хранилища использовать... Можно сериализовать в бинарник (для этого в MFC есть готовые механизмы), можно в ini/xml файлы писать, можно в БД, можно... да что угодно можно придумать, хоть на ftp закинуть и оттуда доставать
pu4koff вне форума Ответить с цитированием
Старый 14.11.2010, 21:08   #7
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Создаём класс вида:
Код:
class MyDataManager
{
public:
  static MyData GetMyDataById(int id); // получить данные по идентификатору
  static MyData GetMyDataByName(string name); // Получить данные по имени
  ...
};
1. Но "static" оставит данные в памяти.

Цитата:
Код:
m_data = MyDataManager::GetMyDataById(10);
2. А "m_data" здесь какого типа?
3. А в других классах как получить данные, передавать ссылку на документ?
... ещё есть вопросы, если можно приблизительную реализацию:
Код:
CMyData CMyDataMapper::GetData(BYTE bDataID)
{
// взять из файла
}
KemanSR вне форума Ответить с цитированием
Старый 15.11.2010, 14:28   #8
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Вот в Microsoft Word данные о размере шрифта, например, хранятся в документе, а список размеров где?
KemanSR вне форума Ответить с цитированием
Старый 15.11.2010, 16:40   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от KemanSR Посмотреть сообщение
1. Но "static" оставит данные в памяти.
Зависит от реализации. Как правило, MyDataManager тупо запрашивает данные у MyDataMapper. Данные он нигде не хранит, ему нужен только экземпляр MyDataMapper, который он в принципе может "на лету" создать и тут же удалить. Это уже зависит от задачи.
Цитата:
Сообщение от KemanSR Посмотреть сообщение
2. А "m_data" здесь какого типа?
Такого, какого нужно. Это Ваш тип Student, Employee или что там в документе хранится и впоследствии отображается. В общем то, что у меня было как MyData.
Цитата:
Сообщение от KemanSR Посмотреть сообщение
3. А в других классах как получить данные, передавать ссылку на документ?
Другие классы получают данные через MyDataManager, который для удобства можно сделать статическим или вместо него наваять кучу отдельных функций. Он уже в свою очередь запрашивает данные у MyDataMapper. Ну а этот самый Mapper уже достаёт данные из хранилища (файла, БД, сети,...).
Цитата:
Сообщение от KemanSR Посмотреть сообщение
... ещё есть вопросы, если можно приблизительную реализацию:
Код:
CMyData CMyDataMapper::GetData(BYTE bDataID)
{
// взять из файла
}
Тут зависит от выбранного подхода. Можно файл открыть в конструкторе CMyDataMapper'a и закрывать потом в деструкторе. Можно открывать на каждые считывание/запись информации в файл. Допустим выбрали второе, тогда такой алгоритм будет:
Код:
открыть файл
перейти в файле на позицию нужного элемента
считать данные
собрать из этих данных объект типа CMyData
закрыть файл
вернуть созданный объект
Реализация уже будет зависеть от способа записи/чтения, способа идентификации объектов,...
Цитата:
Сообщение от KemanSR Посмотреть сообщение
Вот в Microsoft Word данные о размере шрифта, например, хранятся в документе, а список размеров где?
Это вопрос к разработчикам
По идее должно быть какое-то глобальное хранилище всех доступных шрифтов, а для каждого шрифта список возможных его размеров (хотя в ворде вроде как список размеров одинаков для всех шрифтов и можно ручками даже указать нужный (хоть 13,5)).

Последний раз редактировалось pu4koff; 15.11.2010 в 16:43.
pu4koff вне форума Ответить с цитированием
Старый 18.11.2010, 18:38   #10
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от KemanSR Посмотреть сообщение
... приложению требуются данные разных типов около 300 Кб...
Так я сообщил в первом сообщении, у меня приблизительно 9 разных типов данных. Поэтому данный подход не применим в моём случае.

Спасибо за помощь.
KemanSR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой нетбук выбрать? DaNHell Компьютерное железо 1 02.06.2010 07:23
Какой линукс выбрать? Antidoc Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 4 08.12.2008 04:41
Принтер. (какой выбрать) Карась Компьютерное железо 10 26.07.2008 23:54