さまざまな種類のオブジェクトの小さなデータベースを構築する必要があります。基本的なテンプレート化されたクラスを用意することをお勧めします。それをデータベースと呼び、そこから他のクラスを派生させましょう。
例えば:
template< typename Record,
size_t RECORD_SIZE,
char RECORD_SEP = '!',
char RECORD_PARAM_SEP = ',',
char RECORD_FIELD_SEP = '~',
size_t MAX_RECORDS_PER_QUERY = 5000,
size_t MIN_RECORD_COUNT = 15000
>
class Database
{
public:
typedef Record Record_t;
typedef std::vector< unsigned char > QueryBuffer;
Database( const std::string& basePath, const std::string& recordPath, const std::string tableFilename );
enum class QueryResult
{
OK,
NO_DATA,
OVERFLOW,
FUTURE_DATE,
FUTURE_RANGE,
ERROR
};
void add( void add( const Record_t& r )
{
Lock lock( mMutex );
// ... lots of stuff here
}
QueryResult query(QueryBuffer &qb, time_t first, time_t last )
{
Lock lock( mMutex );
// ... lots of stuff here
}
QueryResult query(QueryBuffer &qb, time_t first )
{
Lock lock( mMutex );
// ... lots of stuff here
}
// protected and private data
};
次に、この方法でクラスを派生させます
class GameDatabase : public Database< GameType, 9 >
{
private:
using MyBase Database< GameType, 9 >;
public:
GameDatabase( const std::string& basePath )
: MyBase{ basePath, "g/", "g.dat" }
{
}
// another query method
QueryResult query(QueryBuffer &qb, size_t first, size_t last )
{
Lock lock( mMutex );
// use protected methods of MyBase
// .... lots of stuff here
}
};
これは良い考えですか、それともより良い解決策ですか? 問題は、データベースの定義はすべてインライン化する必要があり、これは長いコードです。