C ++ライブラリAPIの設計


12

C ++ライブラリの優れたAPIデザインについて学び、共有オブジェクト/ dllなどを調べるための優れたリソースを探しています。ソースレベルでの優れたAPI、優れたクラス、テンプレートなどの記述に関する多くのリソースがありますが、共有ライブラリと実行可能ファイルに物事をまとめる。John LakosのLarge-Scale C ++ Software Designのような本は興味深いものですが、非常に時代遅れです。

私が探しているのは、テンプレートの取り扱いに関するアドバイスです。APIのテンプレートでは、実行可能ファイル(または他のライブラリ)にライブラリコードが含まれることが多いため、そこでバグを修正すると、新しいライブラリを単純に展開することはできませんが、そのコードのすべてのクライアントを再コンパイルして再配布する必要があります。(そして、はい、少なくともライブラリ内の最も一般的なバージョンをインスタンス化するなどのいくつかのソリューションを知っています。)

また、C ++ライブラリでの作業中にバイナリ互換性を維持するために注意すべき他の注意事項や事柄も探しています。

そのようなことに関する良いウェブサイトや本はありますか?


:私はそれをこのように処理sivut.koti.soon.fi/~terop/GameApi.html ... libの内部のテンプレートがありますが、そのどれもが、APIでされていないすなわち-
TP1

1
std::unique_ptrかなり新しいものです。提案されたAPIについて、より適切だと思いましたか?すべてのリソースを手動で管理する必要があり、たとえばリークや二重削除を事実上保証する方法はありますか?または、あなたのタイプの多くが1つまたは2つの文字名を持っていて、それらの目的を占うことを不可能にする方法は?
DeadMG

1
@ tp1:しかし、あなたは私がそれらを処理したことを確認することに気をつけませんでした。あなたはそれについて何もせずに「ハンドル」と言いました。私はそれらを処理しませんでしたが、今は何ですか?そのような間違いを許さないRAIIクラスを使用する代わりに。使用しunique_ptrていた場合、そのようなコードを記述することはできません。
DeadMG

1
@ tp1:Envが破壊されることに気付きました。それはほとんどそれです。オブジェクトを管理する機能はまったくないようです。「今までに作成したすべて」や「何も」よりもきめ細かなメモリを管理したい場合は、失敗したように見えます。
DeadMG

3
延長された会話は、ソフトウェアエンジニアリングチャットまでお寄せください。質問や回答に役立つ情報を組み込むことはできますか?
ChrisF

回答:


12

実際にあなたが求めるものである本があります。API Design for C ++の呼び出しです。本のWebサイトには、本のソースコードErrataもあります。


1
本のための明確な+1!私はこれを提案するようになりましたが、あなたは私にそれを打ち負かしたことが判明しました。
zxcdw

+1:私はこの本を読み終えており、素晴らしいリソースです。強くお勧めします。
コルチキ

3

これはほとんど不可能です。単純な事実は、時々、仕事をするためにコンパイラが必要であり、その必要性をただ魔法でかけることはできないということです。std::vectorヘッダーのみのライブラリを作成できない関数はありません。コンパイラーは多くの魔法を機能させることができますが、それを呼び出さずにそれを実現することはできません。それは事実です。

できることは次のとおりです。必要のない場所ではテンプレートを使用しないでください。できないことは次のとおりです。

簡単な事実は、新しいバージョンで再コンパイルすることは、静的に型付けされたライブラリで得られるパフォーマンス、安全性、および機能の利点と比較して、それほど大きな負担ではないということです。


2
考えるべき例としてそれを挙げました。私が探しているのは、準備すべき他の同様の問題に関するガイダンスと、それらを処理するためのベストプラクティスです。
ヨハネス

ABI互換性を破るすべての新しいバージョンが新しいインライン名前空間に配置される場合、それがヘッダーのみのライブラリであるかどうかは重要ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.