openGL がオブジェクト指向でないのはなぜですか? オブジェクト指向プログラミング+デザインパターンをみんなで教えますが、OpenGLはグローバルな機能がたくさんあります。スタイル悪くないですか?
5 に答える
低レベル API の要点は、可能な限り最小限に抑えて移植できるようにすることです。オブジェクト指向アーキテクチャを与えると、これは許可されません。
- ポリモーフィズムは、不要な関数呼び出しのオーバーヘッドを追加します。
- 比較的難しい呼び出し規則を使用する必要があり、移植性が低下します。
- オブジェクト指向アーキテクチャをラップして手続き型にすることはできませんが、逆にすることはできます。したがって、物事を可能な限り柔軟にすることは理にかなっています。必要に応じて、OpenGL の周りにオブジェクト指向のラッパーを作成するのは簡単です。
最後に、OOP について教えられたことを本当に疑う必要があります。カレッジや大学が何を言っているとしても、OOP はプログラム設計の万能薬ではありません。C++ STL (およびほとんどの Boost) にオブジェクト指向がまったくないのには、十分な理由があります。
オブジェクト指向は便利な場合もありますが、便利な場合とそうでない場合を学ぶ必要があります。OOP ではないものは「悪いスタイル」であると決して信じてはなりません。
OpenGL
- OpenGL はすべてのプラットフォームをサポートする必要があります。この点で C に近いものはありません。ほぼすべてのデバイスが同じ API を使用できるためです。
- OpenGL はすべての言語をサポートする必要があります-この点で C に近いものはありません-そのおかげで、C ライブラリの呼び出しをサポートする各言語 (およびほとんどすべての言語) で OpenGL を使用できます。
- OpenGL は API であり、エンジンではありません。グラフィック ハードウェアに低レベルのインターフェイスを提供することを目的としていますが、さまざまなハードウェアを抽象化するのに十分な高レベルです。C は C++ よりもはるかに低レベルであり、OOP は低レベルではありません。レベル
- OpenGL は構築するためのフレームワークであり、完全なソリューションではありません。グラフィックス コードを記述するための唯一かつ真の方法はなく、OpenGL は私たちに何かを強制するものではありません。
- OpenGL は特定のプログラミング パラダイムに結び付けられていません。したがって、OpenGL を関数型言語、論理型言語、または OOP 言語にラップするか、手続き的に使用できます。
- OpenGL は効率性に重点を置いており、関数を直接呼び出すよりも効率的な方法はありません。OOP は、特定のタスクに適しているのと同じくらい効率的です。
一般に、OpenGL は、私たちが自由に選択できるように設計されています。自由とは、プラットフォーム、言語、プログラミング パラダイム、エンジン設計、方法論、および効率と読みやすさのレベルを選択する自由を意味します。
その点で私は OpenGL を称賛し、その点で Direct X は嫌いです。
アーメン。
補足:誰もがオブジェクト指向プログラミングを教えていますが、それは最も理解しやすいからです。それは唯一無二の真のパラダイムではありません。関数型プログラミング、論理型プログラミング、コントラクト プログラミング、さらにはオブジェクト指向の C 言語の記述方法まであります。コンピューター サイエンスに唯一の真実はありません。デザイン パターンに関しては、OpenGL のアーキテクチャで使用されているものをいくつか挙げることができます。スタイルが悪い?私はaaaaallllグローバル関数を持った美しいCプログラムを見てきました...
一般に、OpenGLはオブジェクト指向です。OOP を直接サポートしていない言語で実装されているだけです。しかし、API はオブジェクト指向です。さまざまなオブジェクト タイプと、それぞれに定義された一連の操作で構成されています。また、各オブジェクト タイプの内部はユーザーから隠されています。OOP のすべての要件を満たします。たまたま C で実装されているため、便利なクラスまたはメンバー メソッドの構文がありません。
これとは別に、グローバル関数にはまったく問題はありません。C++ では、可能な限りメンバー メソッドよりも優先することが一般的に推奨されています。関数型プログラミングでは、グローバル関数がデフォルトです。
まあ、いくつかの理由があります。
- OpenGLコンテキストをステートマシンと考える必要があります。常にアクティブになっているのは1つだけです。すべての前に少しOpengl.whateverを置くことに違いはありません。
- スピード、OpenGLは最小限のAPIになるように設計されました
- オブジェクト指向の場合、どの言語で書きますか?C ++?そうすれば、誰もが複雑なバインディングを書く必要があります。Cはラップするのがはるかに簡単です。
OpenGL は C 用に C で作成されましたが、当時はそのようなものは存在しませんでした。Cは依然として広く使用されている言語であるため、今でもCインターフェースを維持したいと考えています。
C インターフェースと C++ ラッパーの両方を維持するべきか、C を捨てて C++ のみを使用するべきか、それとも C インターフェースを維持するべきか? 私は後者が最善の解決策であると主張します.
とはいえ、OpenGL インターフェースは確かに大雑把です。多くのものは非推奨になると「想定」されていましたが、残念ながらそれは後日に移動されました。