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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите написать красивый код  (Прочитано 3937 раз)
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« : Декабрь 12, 2012, 09:25 »

Всем привет.
Вопрос больше на тему красоты кода.
Есть сущность "документ", содержащая данные. Документ может быть загружен с диска и сохранен:
Код:
class Document : public QObject {
Q_OBJECT
public:
Document();
void Save(QString filename);
static Document* Load(QString filename);
};
Пришло время вынести загрузку и сохранение в отдельный поток, а из потока посылать сигналы о прогрессе операции. Но так как метод Load статический, то этого не сделать.
Как в таком случае лучше поступить?
Есть вариант сделать так:
Код:
Document::Load(QString) {
Document* d = new Document();
d->startLoadingInThread();
return d;
}
, но тогда есть шанс, что загрузка выполнится раньше, чем основной поток успеет подписаться на сигнал об окончании загрузки.
Убирать статик с Load не хочется потому что, как мне кажется, метод Load должен создавать новый документ, а не изменять существующий.
Кто что посоветует?
Записан
Bepec
Гость
« Ответ #1 : Декабрь 12, 2012, 09:49 »

Извиняюсь заранее за резкость.

А захрена он вам статический? Трудно создать конструктор с именем файла?

И да, простое решение вашей проблемы -
Цитировать
но тогда есть шанс, что загрузка выполнится раньше, чем основной поток успеет подписаться на сигнал об окончании загрузки.
. Подписываться на сигнал РАНЬШЕ чем запускать процесс обработки.
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #2 : Декабрь 12, 2012, 10:04 »

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

Подписываться на сигнал РАНЬШЕ чем запускать процесс обработки.

И как это сделать (на примере второго куска кода)?
« Последнее редактирование: Декабрь 12, 2012, 10:10 от Swa » Записан
Bepec
Гость
« Ответ #3 : Декабрь 12, 2012, 10:25 »

Сделать у Document сигналы с прогрессом.
Сделать connect к новосозданному документу.
Запустить процесс загрузки.

PS ваши рассуждения по поводу создан, а будет выполнять загрузку мне ясны. Но что вам мешает сделать обычную функцию load?
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #4 : Декабрь 12, 2012, 10:55 »

Тогда будет возможность выполнить загрузку у уже измененного документа и все изменения потеряются (этот момент можно списать на проблемы потребителя, мол, не сохранили, так ссзб).
Нужно будет писать дополнительный метод очистки старых данных и вызывать его перед загрузкой.
Также если во время загрузки произошла ошибка, то документ будет в каком-то непонятном состоянии, придется вводить дополнительный флаг статуса документа и добавлять проверки. Как-то это геморройно.
Записан
Bepec
Гость
« Ответ #5 : Декабрь 12, 2012, 12:09 »

Возьми любой, вообще любой редактор. При открытии документа сверяется название текущего и открываемого. Если совпадают - но реакшен. Если разные, то смотрим - имелись ли изменения (флаг, али сверка фулл контекста). Если не было, затираем текущий и открываем выбранный пользователем. Если были изменения, то спрашиваем - сохранять или игнорить. Если сохранить - сохраняем с обработкой ошибок сохранения. Если игнорить - затираем текущий и открываем выбранный пользователем. Что мб проще? Улыбающийся

PS если уж ты начал делать такие вещи, то понимай что простым - да/нет тут не обойдёшься.
« Последнее редактирование: Декабрь 12, 2012, 12:47 от Bepec » Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #6 : Декабрь 12, 2012, 12:59 »

Понятно. Просто я изначально начал делать так, что для каждого файла с диска - свой объект типа Document, поэтому этих затруднений и не возникало.
Спасибо за советы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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