halmer / oop

0 stars 0 forks source link

Замечания по приложению с фигурами #9

Open alexey-malov opened 8 years ago

alexey-malov commented 8 years ago
using DrawCommand = std::function<BOOL(CDC*)>;

enum class OffsetType
{
    AllSide,
    TopLeft,
    TopRight,
    BottomLeft,
    BottomRight,
};

class CShape
{
public:
    CShape(CRect const & rect);
    virtual ~CShape();

    void Offset(CPoint const & delta, OffsetType type);
    CRect GetFrameRect() const;
    CPoint GetBottomRight() const;

    virtual DrawCommand DrawShape() const = 0;
    virtual bool IsPointInShape(CPoint const & point) const = 0;
    virtual std::string GetType() const = 0;

protected:
    CRect m_rect;
};

Классы модели не должны ничего знать о классах представления. Сделай классы отображения и введи Presenter, который бы выполнял обновление View при обновлении модели.

Посмотри пример паттерна MVP.

alexey-malov commented 8 years ago

Загрузка и сохранение модели лучше вынести в отдельные классы загрузчиков и сериализаторов.

alexey-malov commented 8 years ago

Отдели доменную модель от модели приложения.

alexey-malov commented 8 years ago

Доменная модель ничего не должна знать об Application модели. Вместо этого используй подход с паттерном наблюдатель (на основе boost::signals2). Документ пусть играет роль Application Model-и. В момент отпускания мыши при перемещении/ресайзе он должен создавать команду модификации доменной модели View должна отображать сущности из Application-модели, которые должны обновляться при обновлении доменной модели (например, при Undo/Redo). Applicaiton модель должна следить за изменениями в доменной модели и обновлять

alexey-malov commented 8 years ago

image

alexey-malov commented 8 years ago

image

alexey-malov commented 8 years ago

image

alexey-malov commented 8 years ago
    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;
alexey-malov commented 8 years ago

Сохраненный документ с перевернутым вверх ногами треугольником загружается с треугольником вниз ногами

alexey-malov commented 8 years ago

Для ознакомления 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>())
}
alexey-malov commented 8 years ago

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)

alexey-malov commented 8 years ago

Починить инициализацию View после загрузки документа (починка конструктора EditableCanvas должна излечить проблему)

alexey-malov commented 8 years ago

Флаг модификации документа должен зависеть от наличия отличий от сохраненной версии. проще всего это может быть сделано с помощью history

alexey-malov commented 8 years ago

перерисовку должен инициировать presenter

alexey-malov commented 8 years ago

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

alexey-malov commented 8 years ago

http://forthescience.org/books/modelviewcontroller/index.html