У меня есть библиотека, написанная на C ++, которая предоставляет виртуальную машину («ВМ») графического языка программирования. Он использует изображение (например, файл png) в качестве исходного кода и выполняет инструкции. ВМ используется в различных типах приложений (консоль, графический интерфейс), поэтому цель библиотеки — быть настолько гибкими, насколько это возможно.
Вопрос в том: какая должна быть связь между виртуальной машиной и объектом изображения? Должно ли это быть агрегация (конструктор VM принимает существующий экземпляр Image в качестве параметра) или композиция (конструктор VM принимает путь к файлу изображения в качестве строкового параметра)?
Композиция — это то, где внешний (VM) объект не может существовать без внутреннего объекта (изображения). Ну, в этом случае виртуальная машина может существовать, но она бесполезна без какого-либо образа (не может выполнять никаких инструкций, если нет кода). Таким образом, он должен принять строковый параметр и создать и уничтожить объект изображения самостоятельно. Но как насчет проверки строкового пути к файлу (проверьте, что там нет изображения, ИЛИ файл не является изображением, ИЛИ бинарный файл изображения поврежден) — где должна быть реализована эта проверка? Конструктор виртуальных машин, Похоже?
С другой стороны, если виртуальная машина может заменить один образ другим, это может быть агрегирование (больше похоже на виртуальную машину Java). Но я не уверен, что это хороший подход — ВМ пришлось бы сбрасывать все указатели изображений и стек данных, привязанный к изображению. Возможно, одна виртуальная машина на один образ — более чистое и логичное решение.
Вы бы выбрали агрегацию или состав в этом случае? Спасибо за ваши ответы.
Вот шаги для выбора между агрегацией и составом:
Обратите внимание, что обработка нескольких объектов (с агрегацией) довольно сложна. Обычно требуется что-то вроде:
struct Env {
std::vector<I*> v1;
std::vector<I2*> v2;
};
int push_image() { v1.push_back(new Image); return v1.size()-1; }
int push_vm(int image_id)
{ v2.push_back(new VM(v1[image_id])); return v2.size()-1; }
Других решений пока нет …