Open alexey-malov opened 8 years ago
Загрузка и сохранение модели лучше вынести в отдельные классы загрузчиков и сериализаторов.
Отдели доменную модель от модели приложения.
Доменная модель ничего не должна знать об Application модели. Вместо этого используй подход с паттерном наблюдатель (на основе boost::signals2). Документ пусть играет роль Application Model-и. В момент отпускания мыши при перемещении/ресайзе он должен создавать команду модификации доменной модели View должна отображать сущности из Application-модели, которые должны обновляться при обновлении доменной модели (например, при Undo/Redo). Applicaiton модель должна следить за изменениями в доменной модели и обновлять
using InsertShapeSignal = boost::signals2::signal<void(std::shared_ptr<IShape> const & shape, boost::optional<size_t> position)>;
virtual void DoOnInsertShape(InsertShapeSignal::slot_type const & handler) = 0;
Сохраненный документ с перевернутым вверх ногами треугольником загружается с треугольником вниз ногами
Для ознакомления Only:
Для пущей безопасности можно сделать, чтобы метод GetCanvas и GetEditableCanvas можно было вызывать только у lvalue-ссылок на IDocument:
string GetString()
{
return "hello";
}
int main()
{
auto & someString = GetString();
// тут someString можно использовать, т.к. возвращенный объект вернулся по значению и время его жизни продлевается до конца области видимости ссылки
auto & editableCanvas = make_unique<CDoc>(make_unique<CCanvas>())->GetEditableCanvas();
// тут уже нельзя использовать editableCanvas, т.к. он уничтожился вместе с документом
}
Решение - запретить вызывать эти методы у rvalue-ссылок на объекты:
class IDocument
{
public:
virtual IEditableCanvas & GetEditableCanvas() & = 0;
virtual IEditableCanvas & GetEditableCanvas() && = delete;
};
int main()
{
auto doc = make_unique<CDoc>(make_unique<CCanvas>())
}
https://en.wikipedia.org/wiki/SOLID_(object-oriented_design) https://ru.wikipedia.org/wiki/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
Починить инициализацию View после загрузки документа (починка конструктора EditableCanvas должна излечить проблему)
Флаг модификации документа должен зависеть от наличия отличий от сохраненной версии. проще всего это может быть сделано с помощью history
перерисовку должен инициировать presenter
добавить поддержку картинок. в приложение (хотя бы одного из форматов. поддерживаемых MFC). при сохранении документа картинки должны сохраняться в тот же каталог в файлы с уникальными именами
Классы модели не должны ничего знать о классах представления. Сделай классы отображения и введи Presenter, который бы выполнял обновление View при обновлении модели.
Посмотри пример паттерна MVP.