1

私が書いているライブラリには、C++ の「強く相互依存する」クラスがいくつかあります。最初のクラスは「DataSet」で、その名前の由来と同様にデータを管理します。2 番目のクラスは「Renderer」で、DataSet にデータを描画します。どちらのクラスも抽象です。2つのクラス間で必要な「フロー」は次のとおりです。

  • アプリケーションは、実装された DataSet オブジェクト (DataSetImpA、B、C) を作成し、それらを実装された Renderer (RendererImp) に渡します。

  • アプリケーションは、レンダラーにカメラが向いている場所を伝えます。

  • Renderer は、DataSet がすべての関連オブジェクトを準備できるように、カメラ パラメータを使用して各 DataSet のプライベート 'update' メソッドを呼び出します。

  • Renderer は、プライベートな「get」メソッドを呼び出して、新しく準備されたオブジェクトを取得します。

  • Renderer は、プライベートな「クリア」メソッドを呼び出して、DataSet のオブジェクトを破棄することがあります。

「update」、「get」、および「clear」メソッドは、DataSet の純粋な仮想関数になります。フレンド クラスはここでは機能しません。実装をオープンにして、lib を使用する人のために拡張可能にしたいからです。「class x」が使用される実装に基づいて異なる場合に、誰かが「friend class x」と書くことを期待するのは悪いことです。

誰かが上記のようなものを実装する方法/設計パターンを提案できますか? 物事を行う別の方法も自由に提案してください

4

2 に答える 2

2

update理由がわかりません。そうする必要がありgetます。私には、これは悪い設計のように見えます。それらを他のクラスから呼び出すことを計画しており、論理的に他のクラスから呼び出す必要がある場合は、それらを作成します。実際、私はおそらくprivate にして、必要に応じていつでも内部的に呼び出します (たとえば、 の先頭で呼び出します)。clearprivatepublicupdateDataSetget

友達を作り、レンダラーを介してそれらのメソッドにアクセスするだけで、好きなように実行できますRendererが、正直なところ、それはまったくきれいに見えません。

于 2013-01-04T11:00:17.590 に答える
1

パブリック関数を指定し、それに渡しDataSetます。renderRenderer

更新をレンダリングから独立させる必要がある場合は、update公開も行います。

優れた設計原則は、Tell, Don't Askです。ゲッターを記述しないでください。必要がないように設計を再配置してください。

名前DataSetは、オブジェクトの真の意味を隠します。それらは、可視でレンダリング可能なシーン オブジェクト、プロップ、ソリッドです。

カメラの位置に応じて、シーンの特定のビューをレンダリングしたいように聞こえます。ビューは動的です。

View view(scene);    
...
view.render(renderer);
于 2013-01-04T11:09:34.360 に答える