汎用プログラミング、業界で使用される頻度


11

現在、アカデミックな環境でプログラミングを行っているので、好きなものを使用できます。ブーストグラフライブラリをいくつかの目的に使用していますが、GPをより深く理解するための努力に投資する価値があるかどうか疑問に思っています。

私は興味があります-ジェネリックプログラミング(GP)は業界で多く使用されていますか?私の推測では、ほとんどのプログラマーはOOPにはるかに慣れているか、GPを強調またはサポートしていない言語を使用しているため、C ++でSTLデータ構造/関数を呼び出す以外に、GPはそれほど頻繁に使用されないという印象です実際には。しかし、現時点では業界の外にいるので、これについて実務家から聞いてうれしいです。

(私がこれを書いているとき、ジェネリックプログラミングは有効なタグではないことがわかりました!)


StackOverflowでのタグの配布は、おそらくここにあるものよりも統計的証拠としてはるかに有用です。参照stackoverflow.com/questions/tagged/generic-programmingstackoverflow.com/questions/tagged/generics
ペーテルTörök

回答:


7

私は興味があります-ジェネリックプログラミング(GP)は業界で多く使用されていますか?

チームとプロジェクトのコンテキストに本当に大きく依存しています。

たとえば、ビデオゲームでは、多くの場合、コードは「最も単純な」(場合によっては単純すぎる)こともありますが、大規模なアーキテクチャです。これは、ゲーム開発者が修正すべき多くの問題を抱えており、メタプログラミング(C ++内で非常に抽象的で把握しにくい言語)に煩わされたくないためです。

同時に、これらのショップでもテンプレートの基本的な使用法は一般的であり、一部のエンジンの特定の機能でテンプレートベースの最適化を確認できます。

しかし、ゲーム開発では、ほとんどの人はメタプログラミングを避けます。

さて、もう一方の極端な側面では、一般的ではない本当に複雑または重い処理アプリケーションには、一般的ではないパフォーマンスと柔軟性(コンパイル時)の要件のために、ある種の重いメタプログラミングが必要です。私は今、1つで働いています。

それは一般的ではありませんが、存在し、一部のニッチドメイン(一部の科学的または数値計算の埋め込みコンテキスト)では、メタプログラミングについて多くの知識があるか、学習を希望しています。

途中で、ほとんどの人はメタプログラミングを「デザイナー」としてではなく「クライアント」として使用します。ライブラリはコード用のツールであり、これまで使用してきたカスタムタイプに適応できるライブラリよりも優れているため、ほとんどのメタプログラミングコードはライブラリにバンドルされています。

Boost(http://boost.org)は一連のライブラリで、一部は重いメタプログラミングブラックマジックで作られており、多くのC ++ショップでSTLの拡張機能である「STL ++」として使用されています(現在もそうです)。一部の開発者は理解できないことを好まないため、すべてのショップがコンパイラー互換性などのいくつかの理由で使用しているわけではありません。内部でのツールの動作(Boost.Spiritを理解してみてください...)

どんな会社に勤めようと、このパラダイムを使用する企業もあれば、まったく使用しない企業もあれば、禁止する企業もあります。

誰も同じニーズ、コンテキスト、またはチームを持っていないため、コンセンサスはありません。

それでも、明らかに、それは使用されます。メーリングリストでブーストを使用している人に、より現実的な例を持っている人に尋ねるかもしれません。


1
クライアント対デザイナーの+1。私の経験では、保守性を大幅に改善しない限り、アプリケーションで新しい汎用コードを作成しても意味がないほど実装を理解している開発者はほとんどいません。広範囲に再利用できるように設計されたライブラリは、個々のアプリケーションよりもはるかに頻繁にこの条件に該当します。
カールビーレフェルト

詳細な回答をありがとう。私はBoost自身のファンであり、他のBoostライブラリよりもかなり多くのGP知識を必要とするBGLを掘り下げるかどうかを検討しているので、これを尋ねました。ゲーム開発の世界についてのあなたのコメントは非常に興味深いものです。私は、現代のゲームの開発の偉業に驚いています。そして、それらが最前線ではなく、おそらくより新しいプログラミング方法論から隔離されていることを聞くのは興味深いです。
bd1

ゲーム開発者は、ゲームの概念をアーキテクチャ化するだけで、複雑さを管理しています。メタ命令を追加すると、すべてが複雑になり、本当に正当化する必要があります。もう1つは、多くのゲーム開発者が、boostが試行するすべてを許可しない非常に特定のコンパイラーを備えた非常に特定のハードウェアであるコンソールで動作することです(たとえば、例外や多重継承がない、またはコンパイラ(実話))。それには、正当な理由があります。
クライム

5

私は興味があります-ジェネリックプログラミング(GP)は業界で多く使用されていますか?

学術的にパラメトリックポリモーフィズムと呼ばれる汎用プログラミングは、フィールドで非常によく使用されます。私の会社では、データの種類に関係なく、主にデータのタイプに依存しないエディターを構築するために使用しています。他の機能ほど頻繁には必要ありませんが、絶対に見逃せない機能です。ビヘイビアーが多数のタイプに適合する場合に使用します。異なる型に対して同じコードを複数回記述していることに気付いたとき、ジェネリックが必要であることは明らかです。

私の推測では、ほとんどのプログラマーはOOPにはるかに慣れているか、GPを強調またはサポートしていない言語を使用しているため、C ++でSTLデータ構造/関数を呼び出す以外に、GPはそれほど頻繁に使用されないという印象です実際には。

少なくとも私の経験から、あなたの視点は間違っています。OOPと汎用プログラミングは相互に排他的ではありません。実際、それらを組み合わせた相乗効果を使用する必要があります。前述したように、他のテクニックほど頻繁に表示されないのは、それほど頻繁に必要ないためです。ただし、これは強力な機能であり、コードをDRYに保つのに非常に役立ちます。高レベルのプログラミングでGPのサポートを本当に強調していない言語はどれですか?Tiobe Top 5の5言語のうち3言語は、ジェネリック/テンプレートをサポートしています。また、PHPは動的に型指定されるため、実際には必要ありません。だから何?


要点は、OOPとGPがどちらかまたは両方の選択肢であることを意味するものではありませんでした。しかし、私が見たプロジェクトの多くは、厳密にはJavaのOOPのようです。最近のバージョンのJavaはGPをサポートしていると思いますが、Javaプログラマーのどの部分が実際にその機能を使用していますか?私が言ったように、私は産業界で働いていないので、私の見方が歪んでいるかもしれないので、質問をしました。
bd1

@ bd1:Javaがジェネリックをサポートする前に、または特定のツールセットがそのバージョンのJavaをサポートする前に記述された古いアプリケーションは、コードの一貫性を保つために、その特定のプロジェクトでジェネリックを回避し続ける場合があります。私はそれを見てきましたが、プロジェクトや開発者によって異なります。Javaジェネリックのサポートが普及した後に開始されたプロジェクトは、適切な場合に頻繁に使用される傾向があります。
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner:Javaのジェネリックは、C ++テンプレートとはまったく異なります。Javaジェネリックは100%純粋な構文糖であり、メタプログラミングをサポートしていません。
ケビンクライン

「OOPとジェネリックプログラミングは相互に排他的ではありません。」:実際、どちらもポリモーフィズム、アドホックおよびパラメトリックポリモーフィズムの形式です。したがって、これらは異なる種類のポリモーフィズム用の2つの異なるツールです。
ジョルジオ

4

C ++テンプレートは、コンテナとは異なるものに広く使用されています-少なくとも私の問題領域(定量的財務)では。単純に古い仮想関数で十分な場合(そしてコンパイル時間をそれほど増加させない場合)に、あまりにも頻繁に使用されると言ってさえ思います。

人々は、コードの重複を避け、コンパイル時のポリモーフィズムを実現するために(仮想ディスパッチなしで)使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.