Russian Qt Forum
Ноябрь 23, 2024, 02:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Import As Open  (Прочитано 10468 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Март 07, 2013, 18:52 »

Добрый день

Приложение работает со "своими" файлами данных, конечно умеет их читать/писать. По существу в файлах хранятся сериализованные контейнеры объектов. Также приложение умеет импортировать данные из др (чужих) файлов таким образом

a) читаем чужой файл  в некоторый промежуточный формат

b) спрашиваем пользователя что нужно сделать (проверить данные объектов, разбить какие-то объекты на несколько и.т.п). Выполняем то что пользователь сказал, предъявляем ему отчет о проделанной работе

c) конвертируем промежуточные данные в родной формат, записываем файл на диск и загружаем

ЦЕЛЬ: выполнить все то же самое (процедуру импорта) но не для чужого, а родного файла. Неожиданно это оказывается не легче а труднее. Беда в том что "промежуточный формат" содержит раз в 10 меньше данных чем родной. Это естественно т.к. подходящих данных в чужих файлах немного, только самые базовые. Идя по пути выше (так и сделано сейчас) пользователь теряет 90% родных данных - ну и законно недоволен.

Ваше мнение?

Спасибо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Март 07, 2013, 18:59 »

Ваше мнение?
Хреново. Улыбающийся
Записан
Bepec
Гость
« Ответ #2 : Март 07, 2013, 19:01 »

Вопрос глобальнее - а зачем ему импортировать, если он может читать спокойно?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Март 07, 2013, 19:17 »

Хреново. Улыбающийся
Ценный и очень информативный ответ  Улыбающийся

Вопрос глобальнее - а зачем ему импортировать, если он может читать спокойно?
Чтобы выполнить ф-ционал пункта b)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Март 07, 2013, 19:20 »

Ценный и очень информативный ответ  Улыбающийся
Честно говоря, я не понял, что вы хотели спросить. Поэтому пошутил. Улыбающийся
Что тут можно сказать - нужно расширять промежуточный формат или делать отдельную процедуру экспорта для своего формата.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 07, 2013, 19:28 »

Что тут можно сказать - нужно расширять промежуточный формат или делать отдельную процедуру экспорта для своего формата.
Экспорт в свой формат есть (это просто сериализация) но к ней трудно присобачить ф-ционал импорта. Сериализация подразумевает что все сериализуемое в памяти, что ничего не изменится до ее окончания и.т.п. А импорт довольно свободно манипулирует с объектами, может создавать из одного несколько, удалять, менять иерархию.

Ну а расширять промежуточный - это месяцы чтобы получить гнусное копирование ф-ционала  Плачущий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Март 07, 2013, 21:18 »

Ну а расширять промежуточный - это месяцы чтобы получить гнусное копирование ф-ционала  Плачущий
А откуда взялся промежуточный? Почему для загрузки не использовать "рабочие понятия (сущности)". Для чему нужны "промежуточные"?
Записан
ConConovaloff
Гость
« Ответ #7 : Март 08, 2013, 05:56 »

Добрый день.

Как я понял из описанной вами ситуации:
- необходимо читать собственный формат и предоставлять всю функциональность заложенную в нем.
- необходимо читать чужие файлы и предоставлять базовую функциональность.
- работа приложения уже завязана на промежуточном формате и переписывать его затратно
- расширять промежуточный формат так же, затратно.

Если функционал промежуточного файла реализуется отдельным классом, то тут явные признаки для применения паттерна стратегия:
- пишем интерфейс для классов которые обрабатывают различные форматы.
- пишем класс для обработки своего формата и наследуем написанный выше интерфейс.

- при чтение файла опознаем его формат
- в зависимости от формата, подставляем нужный класс для его обработки.


Если вам нужно добавить функционал вообще не трогая промежуточную часть и формат его файла, то вопрос в том, что-же именно вы можете изменить, чтобы работать с +90% функционала заложенного в вашем формате?
« Последнее редактирование: Март 08, 2013, 06:12 от ConConovaloff » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Март 08, 2013, 08:39 »

А откуда взялся промежуточный? Почему для загрузки не использовать "рабочие понятия (сущности)". Для чему нужны "промежуточные"?
Чужие файлы имеют другие данные. Напр чужой 3ds файл имеет для каждого полигона "индекс материала". Их нужно сохранить, потом (когда 3ds файл полностью прочитан) выпадет диалог, и пользователь может поставить бубочку "разделить по материалу" - и создастся неск нативных объектов с разными материалами т.к. у меня 1 материал на 1 объект. Поэтому обременять нативные данные посторонними - смысла никакого.

Вроде напрашивается использовать чтение родного. Но тогда загружаемые данные становятся "текущими", надо резолвить все связки между объектами и.т.п. (что мы не так давно обсуждали). А загрузив, да, могу записать, но не имею никакой свободы создания/манипуляции объектами - ведь они вмонтированы в текущую сцену


Записан
schmidt
Гость
« Ответ #9 : Март 08, 2013, 10:13 »

Цитировать
b) спрашиваем пользователя что нужно сделать (проверить данные объектов, разбить какие-то объекты на несколько и.т.п). Выполняем то что пользователь сказал, предъявляем ему отчет о проделанной работе

А зачем вообще пользователю вашей программы нужно знать об ее устройстве - в частности, устройстве формата файла? Это же сплошные головняки - пользователь хочет просто открыть файл в программе, а она в ответ начинает засыпать его малопонятными диалоговыми окнами "для выбора формы импорта", вместо того, чтобы просто открыть файл и работать с ним.

Цитировать
c) конвертируем промежуточные данные в родной формат, записываем файл на диск и загружаем

А работа в оперативной памяти уже не в моде? Улыбающийся Или у вас в программе имеется один большой C++ метод, который вы используете в любой ситуации? Разбейте свой код на несколько независимых методов и используйте этот базис для решения ваших задач без лишних ухищрений.

Нужно открыть файл? - метод readFile(). Программа имеет несколько форматов? Пусть везде по прежнему вызывается readFile() а его реализация включает в себя определение формата конкретного файла и вызов специфического метода readFileFormat_v12(), readFileFormat_v13(), и.т.д. readFile() определил что формат файла не родной? Пусть вызывает метод importFile(), который в свою очередь проверит, входит ли данный тип файла в список тех, что программа умеет импортировать, и произведет импорт. Если пользователь явно пожелает сохранить файл в родном формате - в этом случае пусть вызывается метод saveFile(), созраняющий рабочие данные программы из оперативной памяти на диск в "новейшем" формате.

Вот вам псевдокод:
Код:
class MainWindow {

readFile();
saveFile();
importFile();

_readFileFormat_v12();
_readFileFormat_v13();
_readFileFormat_v15();
}

// Реализация
MainWindow::readFile() {
// Выбираем файл для открытия
file = getOpenFileName();

// Получаем идентификатор определенной версии родного формата
mgnum = getFormatMagicNumber(file);

// Читаем данные из файла
switch(mgnum) {
case FORMAT_VERSION_12:
app_data = _readFileFormat_v12();
break;
case FORMAT_VERSION_13:
app_data = _readFileFormat_v13();
break;
case FORMAT_VERSION_15:
app_data = _readFileFormat_v15();
break;

// Если это не родной файл программы, пробуем импортировать
default:
app_data = importFile(file);
break;
}

// Возвращаем прочитанные данные
return app_data;
}

MainWindow::importFile(file) {
// Определяем формат стороннего файла и читаем его
external_format = getExternalFileFormat(file);
switch(external_format) {
case EXTERNAL_FORMAT_TXT:
imported_data = _readFileDataFromTxt(file);
break;
case EXTERNAL_FORMAT_XML:
imported_data = _readFileDataFromXml(file);
break;

// Если формат файла недоступен для импорта
default:
break;
}

// Возвращаем прочитанные данные
return imported_data;
}

MainWindow::saveFile() {
file = getSaveFileName();

_saveToNewestFileFormat(file);
}


Стремитесь к простоте и не утомляйте пользователя подробностями устройства своей программы, он это не оценит, независимо от уровня его технической подкованности Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Март 08, 2013, 10:57 »

Стремитесь к простоте и не утомляйте пользователя подробностями устройства своей программы,
Какой Вы быстрый  Улыбающийся Вот только желанная простота почему-то получается только на простых учебных примерах.

вместо того, чтобы просто открыть файл и работать с ним.
Да, родной файл открывается без всяких квешнзов. Он добавляется в проект и все объекты этого файла знают откуда они считаны. Можно добавить любое число файлов данных или удалить их из проекта, при этом все объекты этого файла будут автоматически удалены. Поэтому при импорте обязательно конвертировать в родной и потом его загружать. Данные только висящие в памяти (и нигде не сохраненные) не допускаются (и это правильно)

А зачем вообще пользователю вашей программы нужно знать об ее устройстве - в частности, устройстве формата файла? Это же сплошные головняки - пользователь хочет просто открыть файл в программе, а она в ответ начинает засыпать его малопонятными диалоговыми окнами "для выбора формы импорта", вместо того, чтобы просто открыть файл и работать с ним.
В любом приложении практически любой импорт имеет опции, по той простой причине что без них не обойтись. Будем пересчитывать нормали? Будем удалять невалидную геометрию? И.т.д. (приличный список). А просто так "ну вот загрузил с какими-то дефаултами" несерьезно   
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Март 08, 2013, 11:16 »

Данные только висящие в памяти (и нигде не сохраненные) не допускаются (и это правильно)
Что это значит?
А как пользователь начинает новый проект?
Или проблема в том, что программа написана так, что в любой момент времени может быть открыт только один проект?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Март 08, 2013, 11:41 »

Данные только висящие в памяти (и нигде не сохраненные) не допускаются (и это правильно)
Что это значит?
А как пользователь начинает новый проект?
Создается пустой проект и предлагается пользователю добавить файл(ы) данных.
Записан
schmidt
Гость
« Ответ #13 : Март 08, 2013, 11:58 »

Цитировать
Создается пустой проект и предлагается пользователю добавить файл(ы) данных.

Снова перекладываете головную боль программиста на пользователя  Улыбающийся Зачем ему знать о физической/логической структуре файла проекта? Ему с трехмерными моделями работать надо, а не бродить по диалоговым окнам программы Улыбающийся

Цитировать
Какой Вы быстрый  Улыбающийся Вот только желанная простота почему-то получается только на простых учебных примерах.

Идеал на 100% недостижим, да, но на него тем не менее стоит ориентироваться Улыбающийся

Цитировать
Данные только висящие в памяти (и нигде не сохраненные) не допускаются (и это правильно)

А как же несохраненные изменения в процессе работы с проектом? Или программа заставляет пользователя ходить по минному полю, насильно записывая любые изменения в файл на диске сразу?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Март 08, 2013, 12:45 »

Снова перекладываете головную боль программиста на пользователя  Улыбающийся Зачем ему знать о физической/логической структуре файла проекта? Ему с трехмерными моделями работать надо, а не бродить по диалоговым окнам программы Улыбающийся
Аналогия: проект в любом IDE С++. Выходит Вам с исходными текстами надо работать, а знать где они находятся на диске и как они сложены в фолдерах необязательно?  Улыбающийся

А как же несохраненные изменения в процессе работы с проектом? Или программа заставляет пользователя ходить по минному полю, насильно записывая любые изменения в файл на диске сразу?
Изменения сохраняются в файле проекта, они не касаются моделей и нашей темы. Экспорт (сериализация) модели возможна только по запросу (относительно редкая операция). Если модель в использовании - ее файл не может быть перезаписан.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.