2017-11-08 11 views
0

のためのインタフェース誰かがI/O(特定のファイル形式を扱う)を扱うためのCライブラリを構築したい場合には、彼らはかなり次を提供する必要が後に、いくつかの一般的なものを提供します。I/Oライブラリ

/* Open directly from file */ 
my_context_t* my_open_file(const char * filename); 

/* Open from an existing memory block */ 
my_context_t* my_open_memory(const char* buf, size_t len); 

は限り理解などとしてそこに他の人は、おそらくですが、矛盾を減らすために考えられ、この1、設計における危険な慣行や非効率である、またはベストプラクティスと考え何か他のものがありますか?このコンベンション/ベストプラクティスの名前はありますか?

+2

あなたが示していることは、ファイルI/O用のAPIを作成するための「標準的な」方法ではありません。それは*可能な方法ですが、それは唯一の方法ではありません。だからあなたの質問に答える:いいえ、 "参照"インターフェイスはありません。 –

+0

あなたが提示したものが、特定のファイルフォーマットに焦点を絞ったAPIのために、私が望むようなものを提供しているとは言えません。そのようなフォーマットは存在しますが、私が "ファイルフォーマット"を聞いたときに私がいつも考えているのは、より構造化され、アプリケーション固有です。 –

+0

ベストプラクティス?それはすべて依存している、これは確かに一般的で、不合理なパターンではない。一般に、_caller_エンドのためのより便利で柔軟な基本インターフェースは、アプリケーションがプログレッシブ・パーサーにデータを供給することによってコールバックを反転させることです。もちろん、呼び出し元と呼び出し先の複雑さの間のトレードオフは、後でどれくらいの数が期待されるかによって決まります。私の小さなペットは、関数ポインタの過度使用です。 'my_read_cb'関数を宣言し、呼び出し側で実装する必要があります。必要に応じてそこからさらにルーティングすることができます。 – doynax

答えて

0

これらはインターフェイスの設計に関する質問です。優れたインタフェースは、便利な抽象化を提供し、実装の詳細を隠します。あなたの例では、my_context_tは、パブリックヘッダの型を完全に定義していない場合、ユーザの実装の詳細の一部を削除します。これにより、ユーザー全体がコードを書き直すことなく、実装を大幅に変更する自由を提供します。残りの部分が問題空間に適している場合は、非常に良い方法です。場合によっては、インタフェースレベルで詳細を公開するだけで済む場合もあります。