Вопрос о дизайне и эффективности c ++ ... Представьте себе этот код -
Database db;
class SmallObject
{
private:
/* Some small amount of data and functions */
public:
/* Constructor, more functions */
void fn1() { /* Code that uses global db to do it's job */ }
void fn2() { /* Code that uses global db to do it's job */ }
void fn3() { /* Code that uses global db to do it's job */ }
void fn4() { /* Code that uses global db to do it's job */ }
};
Это хорошо, эффективно и хорошо работает.Однако база данных является глобальным состоянием, что плохо.Это делает очень трудным тестирование класса в изоляции и т. Д. И означает, что SmallObject зависит от конкретной реализации базы данных.
Поэтому я реструктурирую его следующим образом: -
class SmallObject
{
private:
/* Some small amount of data and functions */
public:
SmallObject(Database& db) { db_ = db; }
void fn1() { /* Code that uses global db_ to do it's job */ }
void fn2() { /* Code that uses global db_ to do it's job */ }
void fn3() { /* Code that uses global db_ to do it's job */ }
void fn4() { /* Code that uses global db_ to do it's job */ }
};
И, возможно, сделаюфабрика для их создания, чтобы я мог использовать их примерно так же, как и раньше.
class SmallObjectFactory
{
private:
Database* db_;
public:
SmallObjectFactory()
{
db_ = new SpecificDatabaseSubclass;
}
SmallObject* create() { return new SmallObject(db_); }
};
Это тоже работает, означает, что мой SmallObject больше не связан с точной реализацией базы данных, но все еще удобен в использовании.
Однако представьте, что существует 10000 экземпляров SmallObject.Теперь у каждого есть указатель на один и тот же объект базы данных.Это ужасно неэффективно, а также я не чувствую, что дублирование данных столько раз - это хороший дизайн ...
Итак, есть ли шаблон в C ++, который позволяет мне не делать базу данных глобальной, но позволяет мнене хранить повторяющиеся данные в каждом экземпляре SmallObject?
Это специально C ++, поэтому шаблоны и т. д. вполне подойдут ...