15

私は C# のバックグラウンドを持ち、最近 C++ の学習を開始しました。私が遭遇したことの 1 つは、pimpl イディオムです。私はいくつかの大企業で C# 開発を行ったことがありますが、これに遭遇したことはありません。

これは間違っているかもしれませんが、ヘッダー ファイルを使用し、部分クラス オプションがないため、C++ では必要であると理解しています。

しかし、C# では、常にクラス ライブラリを使用してアプリケーションを構築していました。ライブラリ コードで何かが変更された場合、それを dll に再コンパイルし、アプリケーション プロジェクトで新しい dll を参照します。

同じことがC++でできない理由がよくわかりません。ピンプルは、私には醜いハックのように見えます。

4

3 に答える 3

26

pimplイディオムはC#で使用されていますか?

これは、このイディオムの意味によって異なります。

問題のイディオムは、基本的に、型の実装の詳細を1つのクラスに分離し、パブリックサーフェス領域を実装クラスへのポインターを保持するラッパークラスに分離することです。

これには2つの利点があります。

まず、C ++では、パブリックサーフェス領域のコンシューマーは、パブリックサーフェス領域を含むヘッダーファイルを解析するだけでよいため、コンパイル時間の改善につながる可能性があります。実装の詳細を含むヘッダーファイルを解析する必要はありません。

第二に、それは実装からのインターフェースの非常にクリーンな分離につながります。消費者には実装の詳細が表示されないため、消費者に影響を与えることなく、実装を完全に変更できます。

最初の利点は、C#では関係ありません。C#コンパイラは高速です。(もちろん、言語は高速にコンパイルできるように設計されているためです。)

2番目の利点は、C#でかなり役立つことです。C#では、このパターンを実装する慣用的な方法は、「実際の」作業を行うプライベートのネストされたクラスと、パブリック表面積を持つ単なるファサードであるパブリッククラスを作成することです。

私がC#で特に気に入っている手法は、パブリッククラスをプライベートネストクラスの基本クラスにし、基本クラスにプライベートコンストラクターを与えてサードパーティの拡張を防ぎ、ファクトリパターンを使用してプライベートネストクラスのインスタンスを配布することです。

C++で同じことができない理由がよくわかりません。

次に、そうするC++コンパイラを作成してみることをお勧めします。はるかに高速なC++コンパイラの作成に成功するか、C++で同じことができない理由がわかります。どちらの方法でもメリットがあります。

于 2012-04-26T18:07:18.797 に答える
4

はい、そうです(「ハック」)。これは、ANSI C ++のテキストベースのコンパイルモデルが原因です。コンパイラは、有用なものを生成するために、コードのテキスト表現を確認する必要があります。それがそのようでなければならないというわけではありませんが、それが今日行われている方法です。

于 2012-04-26T17:52:15.423 に答える
1

エリックが指摘したように、pimplイディオムには2つの目的があります。2番目の目的(インターフェイスと実装を分離する)は、よく知られているソフトウェアデザインパターンの1つであるブリッジ(ハンドル/ボディとも呼ばれます)であることを付け加えておきます。あなたはここでそれについてもっと読むことができます

于 2012-04-26T20:16:44.340 に答える