タグ付けされた質問 「templates」

10
Javaのテンプレート「メタプログラミング」は良いアイデアですか?
非常にパフォーマンスに敏感ないくつかの関数(1秒あたり数百万回と呼ばれる)を持つかなり大きなプロジェクトにソースファイルがあります。実際、以前のメンテナーは、1つの関数で条件のチェックに費やす時間を節約するために、それぞれわずかに異なる関数のコピーを12個書くことにしました。 残念ながら、これはコードが維持するPITAであることを意味します。重複するコードをすべて削除し、テンプレートを1つだけ作成したいと思います。ただし、Java言語はテンプレートをサポートしていないため、ジェネリックがこれに適しているかどうかはわかりません。 私の現在の計画は、代わりに関数の12個のコピーを生成するファイル(実際には1回限りのテンプレート拡張機能)を書くことです。もちろん、ファイルをプログラムで生成する必要がある理由については、豊富な説明を提供します。 私の懸念は、これが将来のメンテナーの混乱につながり、変更後にファイルを再生成するのを忘れると厄介なバグを引き起こす可能性があることです。残念ながら、C ++ですべてを書き直すまで、これを修正する方法はありません。 このアプローチの利点は欠点を上回っていますか?代わりに: パフォーマンスに打撃を与え、単一の保守可能な機能を使用します。 関数を12回複製する必要がある理由の説明を追加し、保守の負担を丁寧に負担します。 ジェネリックをテンプレートとして使用することを試みます(それらはおそらくそのようには動作しません)。 単一の関数にコードをパフォーマンスに依存させるという古いメンテナーに大声で叫ぶ。 パフォーマンスと保守性を維持する他の方法は? PSプロジェクトの設計が貧弱であるため、関数のプロファイリングはかなりトリッキーです...しかし、前のメンテナーは、パフォーマンスの低下は許容できないと私に確信させました。これは彼が5%以上を意味すると思いますが、それは私の側の完全な推測です。 おそらく少し詳しく説明する必要があります。12個のコピーは非常によく似たタスクを実行しますが、わずかな違いがあります。違いは関数全体のさまざまな場所にあるため、残念ながら多くの条件文があります。事実上、6つの操作の「モード」と2つの操作の「パラダイム」があります(自分で作成した単語)。関数を使用するには、操作の「モード」と「パラダイム」を指定します。これは決して動的ではありません。コードの各部分は、厳密に1つのモードとパラダイムを使用します。12のモードパラダイムペアはすべて、アプリケーションのどこかで使用されます。これらの関数には、func1〜func12という適切な名前が付けられ、偶数が2番目のパラダイムを表し、奇数が最初のパラダイムを表します。 保守性が目標であれば、これは最悪の設計であることを認識しています。しかし、それは「十分に速い」と思われ、このコードはしばらく変更を必要としませんでした...元の関数が削除されていないことにも注意する価値があります(ただし、私が知る限り、それはデッドコードです) 、したがって、リファクタリングは簡単になります。

3
C ++テンプレートのエラーメッセージはなぜ恐ろしいのですか?
C ++テンプレートは、読み取り不能な長いエラーメッセージを生成することで有名です。C ++のテンプレートエラーメッセージがなぜそんなに悪いのかについての一般的な考えがあります。基本的に、問題はコンパイラーがテンプレート内の特定の型でサポートされていない構文に遭遇するまでエラーがトリガーされないことです。例えば: template <class T> void dosomething(T& x) { x += 5; } 演算子がTサポートされていない場合+=、コンパイラはエラーメッセージを生成します。そして、これがどこかライブラリの奥深くで発生した場合、エラーメッセージは数千行に及ぶ可能性があります。 ただし、C ++テンプレートは基本的に、コンパイル時のダックタイピングのメカニズムにすぎません。C ++テンプレートエラーは、Pythonなどの動的言語で発生する可能性のあるランタイムタイプエラーに概念的に非常に似ています。たとえば、次のPythonコードを考えます。 def dosomething(x): x.foo() ここでx、foo()メソッドがない場合、Pythonインタープリターは例外をスローし、問題を示す非常に明確なエラーメッセージとともにスタックトレースを表示します。インタプリタが何らかのライブラリ関数の奥深くになるまでエラーがトリガーされない場合でも、ランタイムエラーメッセージは、典型的なC ++コンパイラによって吐き出される読み取り不能な嘔吐物ほど悪いものではありません。それでは、なぜC ++コンパイラが何が問題なのかをより明確にできないのでしょうか?一部のC ++テンプレートエラーメッセージにより、文字どおり、コンソールウィンドウが5秒以上スクロールするのはなぜですか?

5
C ++テンプレートは単なるマクロの一種ですか?
このようなC ++テンプレートとC#/ Javaジェネリックのさまざまな比較から、 https://stackoverflow.com/questions/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929 C ++テンプレートは、コンパイルではなく、何らかの種類の前処理(解析前のプレーンテキスト置換)によって実装されているという認識を得ました。C ++テンプレートの型チェックはCマクロに似ているためです。エラーがある場合、それらはテンプレート自体からではなく、テンプレートコードブロックを処理した後に生成されたコードからのエラーです。言い換えれば、それらはCのマクロの一種の上位バージョンにすぎません。 次に、これをサポートする他のいくつかの事実を見つけました- C ++テンプレートが前処理によって実装される場合、動的リンク(.dllを使用)に問題があると思いました。そして、クイックグーグルがこれをサポートしました。 もう1つのポイントは、整数定数を引数としてテンプレートに渡すことができるということです。また、何らかの再帰をサポートします。ただし、この再帰は、コンパイルされたアセンブリ/マシンコードにはありません。再帰的なことは、すべての再帰呼び出しに対して関数を生成することにより、コンパイル時に管理されます。したがって、より大きく、より高速な実行可能バイナリを持ちます。 Cマクロとは異なりますが、いくつかの優れた機能があります。しかし、C ++テンプレートは何らかの前処理で実装されていませんか?これは異なるC ++コンパイラでどのように実装されていますか?
27 c++  c  compiler  templates  macros 

3
Pythonビジネスロジックを正確にdjangoに配置する場所
Django / Python / Web Developmentを学び始めたばかりです。この問題は、しばらく私を悩ませてきました。 Djangoで複数のテンプレートを使用してアプリケーションを作成しています。私は、基本的にそれぞれのテンプレートへの応答をレンダリングするだけのviews.pyを持ち、DBを構造化したmodels.pyを持っています。テンプレートの1つで、画像をアップロードする必要があります(実行できます)。アップロードされた画像の機能に基づいたロジックを実行する必要があります(まだ実行されていません)。このロジックには、多くの重い計算が含まれます。計算の実行後、ロジックは処理済みの情報(座標)をテンプレートに返す必要があります。 pythonファイルを次々に呼び出すスタンドアロンのPythonデスクトップアプリケーションで、これらすべてのアクションを正常に実行できました。ただし、これをWebアプリケーションにしたいので、Djangoフレームワークの使用を開始しました。 私は多くの検索を行いましたが、すべてのロジックを含むこのPythonファイルをどこに正確に配置すべきかをまだ理解できていません。別のクラスベースのファイルが(logic.py)あり、それを呼び出す必要がありview.pyますか?グーグルで調べたところ、多くの開発者がDjangoのmodels.pyにビジネスロジックを配置していることがわかりました。ただし、モデルはバックエンドと排他的に通信する必要があるため、直感的には正しくないと感じています。助けていただければ幸いです。事前に感謝します。

4
LISPがあれば、マクロシステムの実装を容易にしますか?
私はSICPからSchemeを学んでいますが、Schemeを作るものの大きな部分、さらにLISPが特別なのはマクロシステムであるという印象を受けています。しかし、マクロはコンパイル時に拡張されるので、C / Python / Java / whateverに同等のマクロシステムを作成しないのはなぜですか?たとえば、pythonコマンドをexpand-macros | python何にでもバインドできます。このコードは、マクロシステムを使用しないユーザーにも移植可能です。コードを公開する前にマクロを拡張するだけです。しかし、私が収集したC ++ / Haskellのテンプレートを除いて、私はそのようなものを知りません。実際には同じではありません。LISPがあれば、マクロシステムの実装を容易にしますか?

8
一般的なプログラミングに対する認識をチームメンバーに広めるにはどうすればよいですか?
私は人々が信じる環境にとどまっています: Javaジェネリックは、実際のコーディングではなく、ライブラリの書き込み専用に使用される機能です。 C ++はオブジェクト指向プログラミング言語です。templateオプションで回避可能な機能です ただし、これらの人々は、汎用プログラミング(STL、Javaコンテナーなど)を使用して作成されたライブラリーに大きく依存しています。templatesまたはを使用してコードを記述する場合generics、コードレビューアはそれを拒否する可能性が高く、「適切/理解可能/エレガント」な方法でそれを記述するようコメントします。 このような考え方は、通常のプログラマーから上級管理職まで適用できます。90%の時間、これらの人々はロビー活動をしているため、逃げ道はありません。 それらを説明する最良の方法(のどを切らない)、OOと汎用プログラミングの両方を同時に構成するコードを記述する実際的なアプローチは何ですか?
20 java  c++  templates  generics 

5
なぜC ++はDのアプローチをその概念の実装に採用できないのですか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 8年前に移行され ました。 あなたの多くが知っているように、テンプレート引数の可能な型を制限するためのC ++のアプローチ、概念、C ++ 11には含まれていませんでした。 Dプログラミング言語2.0には、一般的なプログラミングと同様の機能があることがわかりました。その解決策は私には非常にエレガントでシンプルなようです。 私の質問は、C ++が同様のアプローチを使用できない理由です。 C ++の概念の目標は、Dの実装が提供するものよりも大きいでしょうか? または、C ++のレガシーにより、そのようなアプローチを採用できませんか? または他の? ご回答ありがとうございます。 ps Dの汎用プログラミングパワーの例を参照するには、これを参照してください:https : //stackoverflow.com/questions/7300298/metaprogramming-in-c-and-in-d/7303534#7303534
19 c++  templates  d 

5
プレーンなPHPを使用してテンプレートシステムを構築する方法は?
私はstackoverflowでこの質問を読んでいた: /programming/104516/calling-php-functions-within-heredoc-strings そして受け入れられた答えは、このような単純なPHPテンプレートを実行するように言っています: template.php: <html> <head> <title> <?= $ title?> </ title> </ head> <本体> <?= getContent()?> </ body> </ html> index.php: <?php $ title = 'デモタイトル'; 関数getContent(){ return '<p> Hello World!</ p>'; } include( 'template.php'); ?> 私には、template.phpが他のスクリプトで定義された変数に依存するという意味で、上記の構造はうまくありません。また、実行時にコードを実行するためにinclude()をinclude('template.php')使用しています(include()を使用して、すぐには実行されないクラスまたは関数を含めるのとは対照的です)。 テンプレートを関数内にラップするのがより良いアプローチだと思います: template.php: <?php 関数template($ title、$ content){ ob_start(); ?> <html> <head> <title> <?= …
15 php  templates 

2
ラッパーに多くのパススルー関数を記述しないようにするにはどうすればよいですか?
共通の基本型の別のクラスをラップするクラスがあります。基本型インターフェースは非常に大きいため、これには多くのパススルー関数の作成が含まれます。これを回避する方法を探しています。 例を作りましょう: Car / \ Volvo VolvoWithTrailer ここで、VolvoWithTrailerの車のインターフェイスにすべての関数を実装し、ラップされたVolvoオブジェクトで適切な関数を呼び出す必要があります。ただし、GetMaxSpeed()は、より低い値を返します。基本的に次のような多くの機能があります int VolvoWithTrailer::GetNumSeats() { return mVolvo.GetNumSeats() } これを解決する明白な方法は、VolvoWithTrailerをVolvoのサブクラスにすることです。 Car | Volvo | VolvoWithTrailer しかし、それは継承よりも構成を優先するという原則に違反しているようです。 これらのすべてのラッパー(言語はC ++)を書くことを他にどのように回避できますか?または-それがあなたの立場である場合-なぜ私はそれらを書くだけですか/単に継承を使用するのですか?これに役立つテンプレートの魔法はありますか?

3
テンプレートを使用する場合、ますます長いコンパイル時間をどのように処理しますか?
私はVisual Studio 2012を使用していますが、ユニットテストでこれらのパーツをモックオブジェクトに置き換えることができるように、「継ぎ目」を導入するためにクラスパラメーターにテンプレートパラメーターを追加した場合があります。 通常、C ++でどのようにシームポイントを導入しますか。テンプレートパラメーターを使用して、暗黙的なインターフェースとのいくつかの基準に基づいてインターフェースを使用したり、混合したりしますか?これを求める理由の1つは、1つのC ++ファイル(テンプレートファイルを含む、他のテンプレートも含む可能性がある)をコンパイルすると、開発者のマシンで約5〜10秒かかるオブジェクトファイルが生成されるためです。 。 VSコンパイラは、私が理解している限り、テンプレートをコンパイルするのに特に高速ではありません、テンプレートインクルードモデルのために(実際にテンプレートの定義を間接的に使用するすべてのファイルに含め、変更するたびにそのテンプレートを再インスタンス化する可能性がありますそのテンプレートとは何の関係もない)コンパイル時間に問題がある可能性があります(インクリメンタルコンパイルを行う場合)。 テンプレートを操作するときに、コンパイル時間をインクリメンタルに(そしてそれだけでなく)処理する方法は何ですか(より良い/より速いコンパイラに加えて:-))。
13 c++  tdd  templates 

4
JSON応答にHTMLマークアップを含める必要がありますか?
eコマースサイトで、カートにアイテムを追加するときに、選択可能なオプションを含むポップアップウィンドウを表示したいと思います。iPod Shuffleを注文していて、彫刻する色とテキストを選択する必要があるとします。 ウィンドウをモーダルにしたいので、Ajax呼び出しで生成されたライトボックスを使用しています。現在、2つのオプションがあります。 オプション1:データのみを送信し、JavaScriptを使用してHTMLマークアップを生成する これの良い点は、Ajaxリクエストを最小限に抑えて、データをマークアップと混合しないことです。 この点でそれほど優れていないのは、サーバー側のテンプレートエンジンを使用する代わりに、JavaScriptを使用してレンダリングを行う必要があることです。クライアント側のテンプレートソリューションを使用して、アプローチを少しクリーンアップできる場合があります。 オプション2:HTMLマークアップを送信する これの良い点は、残りのレンダリングタスク(Django)で使用しているのと同じサーバー側テンプレートエンジンを使用して、ライトボックスのレンダリングを実行できることです。JavaScriptは、HTMLフラグメントをページに挿入するためにのみ使用されます。そのため、レンダリングは明らかにレンダリングエンジンに委ねられます。私には理にかなっています。 しかし、何らかの理由で、Ajax呼び出しでデータとマークアップを混合することに不安を感じています。何が私を不安にさせているのか分かりません。つまり、すべてのWebページが提供されるのと同じ方法で、データとマークアップが正しいのですか?
13 mvc  django  templates  json 

2
C ++では、SFINAEとメタプログラミングは意図的でしたか、それとも単なるテンプレートの副産物でしたか?
SFINAEとtemplateメタプログラミングは素晴らしいことを行うことができ、多くのライブラリーもそれらをかなり使用しています。 歴史的に、これらの「魔法の概念」は両方とも、C ++で意図的に導入/サポートされていましたか?または、それらは後にオリジナルのtemplateプログラミングの有用な副産物(副産物)として発見されましたか?

4
大きなテンプレートの実装を処理するC ++推奨の方法
通常、C ++クラスを宣言する場合は、宣言のみをヘッダーファイルに配置し、実装をソースファイルに配置することをお勧めします。ただし、このデザインモデルはテンプレートクラスでは機能しないようです。 オンラインで見ると、テンプレートクラスを管理する最良の方法について2つの意見があるようです。 1.宣言とヘッダーの実装全体。 これはかなり簡単ですが、私の意見では、テンプレートが大きくなるとコードファイルを保守および編集することが困難になります。 2.最後にインクルードするテンプレートインクルードファイル(.tpp)に実装を記述します。 これは私にはより良い解決策のようですが、広く適用されているようには見えません。このアプローチが劣っている理由はありますか? 多くの場合、コードのスタイルは個人の好みやレガシースタイルによって決定されます。私は新しいプロジェクト(古いCプロジェクトをC ++に移植)を開始しており、OO設計は比較的初心者なので、最初からベストプラクティスに従いたいと考えています。

1
doxygenはHTML出力用のテンプレートをサポートしていますか?
のコードをドキュメント化しましたが、コードdoxygenが提供するデフォルトのHTMLは必要ありません。(GNOMEのように)カスタムCSS、ヘッダー、フッターなどを提供することでカスタマイズできること、そして一般的なPHPコードをファイルに追加してとして保存するように指示する方法を.php知っていますが、それは本当に望んでいることではありません。 私が欲しいのはMSDNのような出力です。私はそれを本当に説明することはできません。私の質問は、テンプレートのようなものでdoxygenを使用してこれは可能ですか、それともXMLを出力して別のプログラムで解析する必要がありますか(私は書いてもかまわないでしょう)。

1
「C ++テンプレート:完全ガイド」(c)2002 — C ++ 11で最新ですか?
『C ++ Templates:The Complete Guide』(c)2002は非常に魅力的に見えますが、12歳なので、古くなっているのではないかと心配しています。最近1年前の非常に好意的なAmazonレビューがいくつかあり、C ++テンプレートに他の最近のタイトルはありません。2002年に発行されたテンプレートに関する本(特にSTLに関する本ではなく)に、たとえばC ++ 11によって置き換えられたり、追加されたりした構文や概念があるかどうかは誰にもわかりますか? 以下はアマゾンの本の説明からです: テンプレートはC ++の最も強力な機能の1つですが、無視されたり、誤解されたり、誤用されたりすることがよくあります。C ++テンプレート:コンプリートガイドは、テンプレートを使用して、よりクリーンで、より高速で、よりスマートなソフトウェアをより効率的に構築および維持する理由、時期、および方法を明確に理解することをソフトウェアアーキテクトおよびエンジニアに提供します。 C ++テンプレートは、基本的な概念と言語機能に関する洞察に満ちたチュートリアルから始まります。本の残りの部分は、最初に言語の詳細に焦点を当て、次に幅広いコーディング手法に焦点を当て、最後にテンプレートの高度なアプリケーションに焦点を当てた包括的なリファレンスとして機能します。本全体で使用されている例は、抽象的な概念を示し、ベストプラクティスを示しています。 読者は学ぶ テンプレートの正確な動作 テンプレートに関連する落とし穴を回避する方法 イディオムとテクニック、基本的なものから以前に文書化されていないものまで パフォーマンスや安全性を脅かすことなくソースコードを再利用する方法 C ++プログラムの効率を上げる方法 より柔軟で保守可能なソフトウェアを作成する方法
10 c++  templates 

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