5

ユーザーが行列や四元数などの複雑な入力を提供する C++ ライブラリを開発しています。これらの型を再実装する必要はないので、内部的にはEigenライブラリを使用します。

これらの型をライブラリのクライアントに公開する最善の方法を決定しようとしており、API のいくつかのオプションを考え出しました。例としてクォータニオン型を使用しますが、これは行列などにも同様に適用できます。また、私は特に Eigen の型を公開することについて話していますが、この質問は使用中の他の外部ライブラリにも同様に当てはまると思います。

1) 基本的な C++ 型のみを使用する

このオプションでは、クライアントは基本型を介してデータを渡す必要があります。たとえば、クォータニオン (4 つの要素) を渡すには、次のようにします。

void my_func(double my_quat[4])

2) 固有の型を公開する

Eigen は、配列とクォータニオンに対していくつかのテンプレート化された型を提供します。たとえば、関数が四元数を必要とする場合、Eigen のQuaterniond 型 (実際には の typedef ですQuaternion<double>)を使用できます。

void my_func(const Eigen::Quaterniond& my_quat)

3)クライアントのさまざまなタイプの単純なラッパーを作成します

API に渡すためにクライアントが (おそらく何らかのファクトリ関数を介して) 作成する必要がある非常に単純な四元数型 (たとえば、ある種の単純な構造体) を作成できます。

void my_func(const quaternion_t& my_quat)

quaternion_t私のライブラリは、型を内部固有表現に変換します。

オプション 1 はあまり好きではありません。なぜなら、API で入力する感覚をより強くしたいからです。オプション 2 では、私のクライアントも Eigen を使用する必要があります。別のバージョンの Eigen を使用した場合の互換性に関する潜在的な問題は言うまでもありません (ちなみに、Eigen はヘッダーのみのライブラリです)。残りはオプション 3 です。

人々はどう思いますか?基本的に自分の質問に答えましたか?例はありますか?

関連する質問

関連する質問がここで尋ねられましたが、外部型を公開する必要があるかどうかの詳細には実際には入りませんでした。

4

2 に答える 2

3

サード パーティのライブラリを公開することは、短期的には最も簡単ですが、長期的には不利になる可能性が高くなります。最も簡単なのは、型が既に存在するため、独自の型を考え出す必要がないことです。将来、別の実装ライブラリを使用したい場合や、クライアントが渡すデータの拡張を許可したい場合は、あなたを悩ませます。

基本的な型だけを使用することは、独自の型を考え出すようなものですが、正当な理由もなく、はるかに低レベルです。ユーザーは、何が何であるかに関するドキュメントを常に参照しないと、ライブラリを使用するのに苦労します。

将来的に柔軟性が必要な場合は、独自の型を使用するのが最適なオプションです。既存のすべての型を再作成する必要があるため、前もって多くの作業を行うように思えるかもしれませんが、少し頑張れば、ライブラリのインターフェースでわずかに異なる型を使用すると、実装が容易になることがわかるかもしれません。後で良く変わります。

したがって、答えは実際には目標と長期的な計画/予測に依存します。現在の実装から変更する予定がない場合は、既存の型を再利用できますが、変更を予見/計画している場合は、将来的には、独自の独立したインターフェイスを作成する必要があります。

于 2012-05-14T01:45:03.603 に答える
2

ラップ/カプセル化します。実装の変更として、クォータニオンのノルムなどの計算結果のキャッシュなど、いくつかの追加機能を追加するとします。クライアントコードに呼び出しを変更させることなくサードパーティのタイプを公開する場合、それを(簡単に)行うことはできません。

于 2012-05-14T01:20:24.257 に答える