Спроектировать простейший графический векторный редактор. Подготовить макеты классов, отражающих структуру будущего проекта. Функционал для макетирования следующий:
- создание нового документа
- импорт документа из файла
- экспорт документа в файл
- создание графического примитива
- удаление графического примитива
Основной упор сделать на шаблон контроллера (MVC) и полиморфизм. Функции, являющиеся обработчиками GUI, собрать в одном файле с функцией main
. Внимание должно быть сосредоточено на декларациях, реализация только в крайнем случае для
минимальной демонстрации необходимых вызовов. Проект должен компилироваться, все заголовки должны пройти стадию компиляции. Задание считается выполненным успешно, если все файлы прошли стадию компиляции, все классы
охвачены диаграммами, код успешно прошел анализ. Дополнительные рекомендации
- Заложить в интерфейсы использование умных указателей, тем самым решив вопрос владения объектами.
- Помнить про принцип единственности ответственности, разделить код на логические модули (классы, функции).
- Избегать дублирования кода.
Структура классов Document
classDiagram
class IDocument {
<<Interface>>
*addWidget(ModelWidget)
*removeWidget(ModelWidget)
*addCommand(Command)
}
class Document~IDocument~ {
-View view
-string name
-vector<WidgetModel> widgets
-vector<Command> commands
+addWidget(ModelWidget)
+removeWidget(ModelWidget)
+addCommand(Command)
}
IDocument <|.. Document
Иерархия команд
classDiagram
class Command {
<<Interface>>
-WidgetModel wgt
*call(IDocument)
*undo(IDocument)
}
class CreateWidget~Command~ {
-WidgetModel wgt
+call(IDocument)
+undo(IDocument)
}
class MoveWidget~Command~ {
Point position
-WidgetModel wgt
+call(IDocument)
+undo(IDocument)
}
class ResizeWidget~Command~ {
Size size
-WidgetModel wgt
+call(IDocument)
+undo(IDocument)
}
class ChangeColorWidget~Command~ {
COLOR color
-WidgetModel wgt
+call(IDocument)
+undo(IDocument)
}
Command <|.. CreateWidget
Command <|.. MoveWidget
Command <|.. ResizeWidget
Command <|.. ChangeColorWidget
Класс View для отображения содержимого документа
classDiagram
class View {
-Size size
-list<Widget> widgets
+handle(WidgetModel, CHANGE_TYPE)
+addWidget(Widget)
+removeWidget(Widget)
+redraw()
}
Структура классов widget
classDiagram
class Widget {
+move(Point)
+resize(Size)
+changeColor(COLOR)
+handle(WidgetModel&, CHANGE_TYPE)
*draw()
}
class Observer {
+handle(Source, CHAGNE_TYPE)
}
class Observable {
-vector<Observer> obsrervers
+addObserver(Observer)
+removeObserver(Observer)
+notify(Source, CHANGE_TYPE)
}
class WidgetModel {
+setPos(Point)
+setSize(Size)
+setType(WIDGET_TYPE)
+setColor(COLOR)
}
Observable <|.. WidgetModel
Observer <|.. Widget
Observer <|.. View
Widget <|.. Circle
Widget <|.. Rectangle
Widget <|.. Square
Widget <|.. Triangle