他の開発者が使用する API の一部として抽象基本クラスを定義しています。これは、Android API を定義し、開発者がそれを使用して電話アプリを作成できるようにするようなものです。API の作成者 (それは私です) はいつ特定の機能を提供する必要があり、いつ作成者は開発者 (つまり API のユーザー) にその機能の定義を任せるべきでしょうか?
関連する例を次に示します。たとえば、 MyObjの一般的なツリーを定義しているとしましょう(ここで、ユーザーはMyObjから派生し、子 (親) を持つクラスを作成でき、型と値によってフィルター処理できます。
class MyObj
{
public:
// These must be provided
MyObj const * parent();
bool setParent(MyObj const * i_obj);
std::vector<MyObj const * > children() const;
bool addChild(MyObj const * i_obj);
bool removeChild(MyObj const * i_obj);
// The following functions can be implemented
// by using the functions listed above.
// Should I provide them (by leaving them in the class or
// defining them as utility functions, etc), or should I let
// the developers define them?
MyObj const * root() const;
bool hasChild(MyObj const * i_obj) const;
std::vector<MyObj const * > descendants() const;
std::vector<MyObj const * > childrenFiltered(FilterType i_type, FilterValue i_val) const;
std::vector<MyObj const * > descendantsFiltered(FilterType i_type, FilterValue i_val) const;
private:
std::vector<MyObj * > m_children;
MyObj * m_parent;
};
考慮事項:
- 開発者 (API のユーザー)がその機能を提供できないようなプライベート変数の使用が含まれる場合は、私がそれを提供する必要があります。
- 多くの開発者 (API のユーザー) が使用する機能がある場合は、自分で定義します。そうすれば、開発者 A は、開発者 B が作成する非常に便利なユーティリティ関数の同じセットを作成する必要がなくなります。どちらも私が提供するものを使用します。
- 一方で、基本クラスがどのように使用されるかを予測しようとするのではなく、開発者がやりたいことを何でもできるようにするために必要な最小限の機能を提供するのが最善かもしれません。
- 機能がコア機能である場合は、それを提供します (他のパブリック関数のみを使用して実装できる場合でも)。
- 何かがコア機能であるかどうかを判断することは、かなりあいまいなビジネスのようです
関連記事: