0

グラフィカルプログラミング言語の仮想マシン(「VM」)を提供するC++で記述されたライブラリがあります。ソースコードとして画像(pngファイルなど)を使用し、命令を実行します。VMはさまざまなタイプのアプリケーション(コンソール、GUI)で使用されるため、libの目的は可能な限り柔軟にすることです。

問題は、VMとイメージオブジェクトの関係はどうあるべきかということです。アグリゲーション(VMコンストラクターは既存のイメージインスタンスをパラメーターとして使用する)またはコンポジション(VMコンストラクターはイメージファイルパスを文字列パラメーターとして使用する)のどちらにする必要がありますか?

コンポジションとは、外側(VM)オブジェクトが内側オブジェクト(イメージ)なしでは存在できない場所です。この場合、VMは存在できますが、イメージがないと役に立ちません(コードがない場合は命令を実行できません)。したがって、文字列パラメータを受け取り、画像オブジェクトを独自に作成および破棄する必要があります。しかし、文字列ファイルパスを検証するのはどうですか(画像がないか、ファイルが画像ではないか、画像のバイナリが破損していないかどうかを確認してください)-この検証はどこに実装する必要がありますか?VMコンストラクターだと思いますか?

一方、VMが1つのイメージを別のイメージに置き換えることができる場合、それは集約である可能性があります(Java仮想マシンのように)。しかし、それが適切なアプローチであるかどうかはわかりません。VMは、イメージにバインドされているすべてのイメージポインターとデータスタックをリセットする必要があります。たぶん、1つのイメージごとに1つのVMが、よりクリーンで論理的なソリューションです。

この場合、集約または構成を選択しますか?回答ありがとうございます。

4

1 に答える 1

1

集約と構成のどちらかを決定する手順は次のとおりです。

  1. 依存関係のある複数のオブジェクトを処理できない場合は、compositionを使用してください。
  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 に答える