对象验证灵活性设计:聚合与组合

时间:2013-02-02 12:21:43

标签: c++ composition aggregation

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

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

组合是没有内部对象(图像)的情况下外部(VM)对象不能存在的地方。好吧,在这种情况下,VM可以存在,但没有任何图像它是无用的(如果没有代码则不能执行任何指令)。所以它应该采用string参数并自己创建和销毁图像对象。但是如何验证字符串文件路径(检查那里是否没有图像或文件不是图像或图像二进制文件已损坏) - 应该在何处实施此验证?我想VM constructor

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

在这种情况下,您会选择聚合或组合吗?谢谢你的回答。

1 个答案:

答案 0 :(得分:1)

以下是决定汇总和组合的步骤:

  1. 如果无法处理具有依赖关系的多个对象,请使用合成。
  2. 如果您可以处理多个对象,则应根据您的图像是在VM对象内部还是外部来做出决定。如果您在VM中考虑它,请使用合成。如果您认为它不在其中,请使用聚合。
  3. 请注意,处理多个对象(使用聚合)非常困难。通常需要以下内容:

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