私はC++を使用して小さなプロジェクトに取り組んでおり(この質問は言語に依存しないと見なされる可能性があります)、可能な限り効率的でカプセル化されるようにプログラムを作成しようとしています。私は独学で経験の浅いプログラマーですが、インターフェースとOOPプラクティスの使用に関しては自分自身に良い習慣を教えようとしています。別のクラスのサブシステムとして機能しているオブジェクトのメソッドにアクセスする場合、主に典型的な「ベスト」プラクティスに関心があります。
まず、私が何を意味するのかを説明しましょう:
のインスタンスは、のプライベートサブシステムをClassGame
使用して2Dスプライトイメージをレンダリングしたいと考えています。のインターフェースにのみアクセスでき、ClassEngineのサブシステム(抽象化レイヤーの背後)であると想定されています。ClassRenderer
ClassEngine
ClassGame
ClassEngine
ClassRenderer
私の質問は、ClassGameオブジェクトがClassRendererの機能を間接的に利用しながら、高速で抽象化レイヤーの背後にある方法に基づいています。レッスンや他の人のコード例で見たものから、これを行うには2つの基本的な方法があるようです。
OOP設計に関する一連のオンライン講義で私が学んだ最初の方法は、1つのクラスにタスクをそのプライベートメンバーオブジェクトに内部的に委任させることでした。[この例では、ClassGameはClassEngineに属するメソッドを呼び出し、ClassEngineはそのメソッドの1つを呼び出すことにより、その要求をClassRendererサブシステムに「密かに」渡します。]関数呼び出しの「デイジーチェーン」の一種。これは私には理にかなっていますが、いくつかの代替オプションよりも遅いようです。
他の人のコードで見たもう1つの方法は、特定のサブシステムの場所への参照またはポインターを返すアクセサーメソッドを使用することです。[したがって、ClassGameは、ClassRendererサブシステムを構成するオブジェクトへの参照/ポインターを返すClassEngineの単純なメソッドを呼び出します]。このルートは私には便利に思えますが、プライベートメンバーをより大きなクラスのサブコンポーネントとして機能させるという意味も排除されているようです。もちろん、これは、独立したサブシステムごとに1つのgetter関数を簡単に記述できるため、特定のタスクを単純に渡す「無意識の」関数をはるかに少なく作成することも意味します。
速度とパフォーマンスも考慮しながら、オブジェクト指向設計のさまざまな重要な側面(抽象化、カプセル化、モジュール性、使いやすさ、拡張性など)を考慮すると、タスクをサブコンポーネントに委任するために第1または第2のタイプの方法を使用する方が適切です。 ?