Russian Qt Forum

Qt => Общие вопросы => Тема начата: Swa от Декабрь 12, 2012, 09:25



Название: Помогите написать красивый код
Отправлено: Swa от Декабрь 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 должен создавать новый документ, а не изменять существующий.
Кто что посоветует?


Название: Re: Помогите написать красивый код
Отправлено: Bepec от Декабрь 12, 2012, 09:49
Извиняюсь заранее за резкость.

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

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


Название: Re: Помогите написать красивый код
Отправлено: Swa от Декабрь 12, 2012, 10:04
Конструктор с именем файла - это, по-моему, неочевидное поведение: подразумевается, что будет создан новый объект, а будет выполняться загрузка из файла.

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

И как это сделать (на примере второго куска кода)?


Название: Re: Помогите написать красивый код
Отправлено: Bepec от Декабрь 12, 2012, 10:25
Сделать у Document сигналы с прогрессом.
Сделать connect к новосозданному документу.
Запустить процесс загрузки.

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


Название: Re: Помогите написать красивый код
Отправлено: Swa от Декабрь 12, 2012, 10:55
Тогда будет возможность выполнить загрузку у уже измененного документа и все изменения потеряются (этот момент можно списать на проблемы потребителя, мол, не сохранили, так ссзб).
Нужно будет писать дополнительный метод очистки старых данных и вызывать его перед загрузкой.
Также если во время загрузки произошла ошибка, то документ будет в каком-то непонятном состоянии, придется вводить дополнительный флаг статуса документа и добавлять проверки. Как-то это геморройно.


Название: Re: Помогите написать красивый код
Отправлено: Bepec от Декабрь 12, 2012, 12:09
Возьми любой, вообще любой редактор. При открытии документа сверяется название текущего и открываемого. Если совпадают - но реакшен. Если разные, то смотрим - имелись ли изменения (флаг, али сверка фулл контекста). Если не было, затираем текущий и открываем выбранный пользователем. Если были изменения, то спрашиваем - сохранять или игнорить. Если сохранить - сохраняем с обработкой ошибок сохранения. Если игнорить - затираем текущий и открываем выбранный пользователем. Что мб проще? :)

PS если уж ты начал делать такие вещи, то понимай что простым - да/нет тут не обойдёшься.


Название: Re: Помогите написать красивый код
Отправлено: Swa от Декабрь 12, 2012, 12:59
Понятно. Просто я изначально начал делать так, что для каждого файла с диска - свой объект типа Document, поэтому этих затруднений и не возникало.
Спасибо за советы.