2012年8月8日水曜日

Create関数でコンストラクタを対峙するクラスの設計




プログラムを作成するとき、多くの場合について、最適なソリューションを見つけることは難しいと見られるが、相当部分最適とすることができるものがあります。
例えば、Create関数を使用するクラスです。
Create関数を持つクラスは、次のような場合に主に使用します。
1。エラーチェックをして、最終的にクラスのポイントを渡してあげたいときに
2。仮想クラスの場合
1回の場合についてもう少し詳しく調べてみましょう。
例えば、ファイル(画像)を読んで、それをテクスチャクラスに​​したいとするならば、一般的なクラス型は、次のように思います。
class GxSourceTexture:public GxTexture
{
public:
GxSourceTexture();
virtual〜GxSourceTexture();
bool Load(const char * filename);
};
このクラスを使うには、次のようにするでしょう。徹底したエラーチェックをするというなら、
GxSourceTexture * pkSourceTexture = new GxSourceTexture();
if(pkSourceTexture == 0)
{
   error processing;
}
if(!pkSourceTexture-> Load( "image.dds"))
{
  error processing;
  delete pkSourceTexture;
}
多分、複雑なエラー処理をするたびにGxSourceTextureをファイルから読んでから、する必要があります。
このような場合は、次のように処理すると、より簡単になります。
class GxSourceTexture:public GxTexture
{
public:
  static GxSourceTexture * Create(const char * filename);
protected:
  GxSourceTexture();
  virtual〜GxSourceTexture();
  bool Load(const char * filename);
};
GxSourceTexture * GxSourceTexture :: Create(const char * filename)
{
  GxSourceTexture * pkThis = new GxSourceTexture();
  if(pkThis == NULL)
     return NULL;
  if(pkThis-> Load(filename))
    return pkThis;
  delete pkThis;
  return NULL;
}
プログラム内でGxSourceTextureを作ろうとすれば
  GxSourceTexture * pkSourceTexture = GxSourceTexture :: Create( "image.dds");
  if(pkSourceTexture == NULL)
  {
     error processing;
  }
プログラムは、はるかにすっきりしていますよね?このように作成時のエラーチェックをする場合は、Create()関数をstaticにつないで起動すると、お勧めします。この方法は非常に多く使用される手法です。
さて2つ目はを見ると、
例えば、Rendererを設計するのに、私が作ったレンダラは、DX9とOpenGLの両方で回したいと思います。この場合、仮想クラスを使用します。仮想クラスを使用する場合、Create関数を使用することをお勧めします。
さて例えば、プログラムするなら。
class GxDX9Renderer:public GxRenderer
{
  GxDX9Renderer();
  virtual〜GXDX9Renderer();
};
class GXOGLRenderer:public GxRenderer
{
  GXOGLRenderer();
  virtual〜GxOGLRenderer();
};
class GxRenderer
{
  GxRenderer();
  virtual〜GxRenderer();
  static GxRenderer * Create();
};
Create()関数を使用していない場合は、サポートされているレンダラーを確認した後、プログラムでそのクラスを使用する必要があります。しかし、Create()関数でレンダラーを選択し、最終的にGxRendererポインタを渡した場合、プログラムにとっては、より簡潔で、GxRenderer.hヘッダファイルのみを含めて作業することができます。
特に、仮想クラスを実際のソースを提供していないための目的もあるとすれば、そうすることで、アプリケーション層では、GxDX9RendererクラスとGxOGLRendererクラスのヘッダファイルの存在を知る必要もない上に、追加されるRendererクラスをライブラリ団から処理することができます。 (アプリケーションの修正が全く不要ですね。)
この他にもCreate()関数を使用している場合があります。
例えば、独自性の保証を必要がある場合。この場合も、Create()関数を使用して独自性の保証を受けることができます。
また、共有リソースの管理においてもCreate()関数を利用することができます。例えば、a.ddsソースファイルを利用したソーステクスチャを何度もプログラムで作成するときに、共有リソースの管理を通って、一度だけ実際SourceTextureを使用して、単純に参照変数の値増やすようにして使用することができます。この場合は、クラスオブジェクト本体をコピーする方法を利用して解決することができますが、クラスオブジェクト自体のメモリのオーバーヘッドが存在します。 (3次元グラフィックスのオブジェクトの数に比べてポリゴン数が相対的にジャクウルテメモリのオーバーヘッドが大きくなります。)

0 件のコメント:

コメントを投稿