0

我有一个用 C++ 编写的库,它提供了一个图形编程语言的虚拟机(“VM”)。它使用图像(例如 png 文件)作为其源代码并执行指令。VM 用于不同类型的应用程序(控制台、gui),因此 lib 的目标是尽可能灵活。

问题是:VM和图像对象之间应该是什么关系?应该是聚合(VM 构造函数将现有 Image 实例作为参数)还是组合(VM 构造函数将图像文件路径作为字符串参数)?

合成是没有内部对象(图像)就不能存在外部(VM)对象的地方。好吧,在这种情况下,一个VM可以存在,但是没有任何图像它是没有用的(如果没有代码就不能执行任何指令)。所以它应该接受字符串参数并自行创建和销毁图像对象。但是如何验证字符串文件路径(检查是否没有图像或文件不是图像或图像二进制文件已损坏) - 应该在哪里实施此验证?虚拟机构造函数,我猜?

另一方面,如果 VM 可以用另一个图像替换一个图像,它可能是聚合(更像是 Java 虚拟机)。但我不确定这是否是一个好方法——VM 必须重置所有图像指针和绑定到图像的数据堆栈。也许每个映像一个 VM 是一种更清洁、更合乎逻辑的解决方案。

在这种情况下你会选择聚合还是组合?感谢您的回答。

4

1 回答 1

1

以下是在聚合和组合之间做出决定的步骤:

  1. 如果您无法处理多个具有依赖关系的对象,请使用组合。
  2. 如果您可以处理多个对象,则应根据您的图像是在 VM 对象内部还是外部来决定。如果您在 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; }
于 2013-02-02T12:39:39.633 回答