我有一个用C ++编写的库,它提供了图形编程语言的虚拟机(“VM”)。它使用图像(例如png文件)作为其源代码并执行指令。 VM用于不同类型的应用程序(控制台,gui),因此lib的目标是尽可能灵活。
问题是: VM和图像对象之间应该是什么关系?它应该是聚合(VM构造函数将现有的Image实例作为参数)还是合成(VM构造函数将图像文件路径作为字符串参数)?
组合是没有内部对象(图像)的情况下外部(VM)对象不能存在的地方。好吧,在这种情况下,VM可以存在,但没有任何图像它是无用的(如果没有代码则不能执行任何指令)。所以它应该采用string参数并自己创建和销毁图像对象。但是如何验证字符串文件路径(检查那里是否没有图像或文件不是图像或图像二进制文件已损坏) - 应该在何处实施此验证?我想VM constructor?
另一方面,如果VM可以用另一个映像替换一个映像,则可能是聚合(更像是Java虚拟机)。但我不确定这是否是一个好方法 - 虚拟机必须重置所有图像指针和绑定到图像的数据堆栈。也许每个图像一个VM是更清晰,更合理的解决方案。
在这种情况下,您会选择聚合或组合吗?谢谢你的回答。
答案 0 :(得分:1)
以下是决定汇总和组合的步骤:
请注意,处理多个对象(使用聚合)非常困难。通常需要以下内容:
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; }