гибкость проектирования объекта: агрегация против композиции

У меня есть библиотека, написанная на C ++, которая предоставляет виртуальную машину («ВМ») графического языка программирования. Он использует изображение (например, файл png) в качестве исходного кода и выполняет инструкции. ВМ используется в различных типах приложений (консоль, графический интерфейс), поэтому цель библиотеки — быть настолько гибкими, насколько это возможно.

Вопрос в том: какая должна быть связь между виртуальной машиной и объектом изображения? Должно ли это быть агрегация (конструктор VM принимает существующий экземпляр Image в качестве параметра) или композиция (конструктор VM принимает путь к файлу изображения в качестве строкового параметра)?

Композиция — это то, где внешний (VM) объект не может существовать без внутреннего объекта (изображения). Ну, в этом случае виртуальная машина может существовать, но она бесполезна без какого-либо образа (не может выполнять никаких инструкций, если нет кода). Таким образом, он должен принять строковый параметр и создать и уничтожить объект изображения самостоятельно. Но как насчет проверки строкового пути к файлу (проверьте, что там нет изображения, ИЛИ файл не является изображением, ИЛИ бинарный файл изображения поврежден) — где должна быть реализована эта проверка? Конструктор виртуальных машин, Похоже?

С другой стороны, если виртуальная машина может заменить один образ другим, это может быть агрегирование (больше похоже на виртуальную машину Java). Но я не уверен, что это хороший подход — ВМ пришлось бы сбрасывать все указатели изображений и стек данных, привязанный к изображению. Возможно, одна виртуальная машина на один образ — более чистое и логичное решение.

Вы бы выбрали агрегацию или состав в этом случае? Спасибо за ваши ответы.

0

Решение

Вот шаги для выбора между агрегацией и составом:

  1. Если вы не можете обрабатывать несколько объектов с зависимостями, используйте состав.
  2. Если вы можете обрабатывать несколько объектов, решение должно основываться на том, находится ли ваше изображение внутри или снаружи объекта VM. Если вы считаете это внутри ВМ, используйте композицию. Если вы считаете это вне этого, используйте агрегацию.

Обратите внимание, что обработка нескольких объектов (с агрегацией) довольно сложна. Обычно требуется что-то вроде:

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; }
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]