关于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 ++所以模板等,很好......
答案 0 :(得分:2)
您可以在db
类中定义静态SmallObject
属性,并在运行时将数据库分配给它。然后,SmallObject
的所有实例都可以使用此属性,而无需拥有指向它的指针副本。
答案 1 :(得分:2)
如果您使用唯一的数据库,则可以使用Singleton Pattern。
答案 2 :(得分:2)
如果我没记错的话,模式被称为FlyWeight。
只需将数据库作为参数传递给每个方法。
它可以提高执行效率,方便性和保证,减少内存使用量。
干杯&第h。,
答案 3 :(得分:1)
你说10000个实例,但是在一个只有40K内存的32位系统上。除非您在嵌入式上下文中工作,否则我建议您将指针存储在每个实例中,如您在第二个示例中演示的那样。
这也使您可以灵活地在不同的对象实例上插入不同的数据库,这可以启用其他未来的功能。
答案 4 :(得分:1)
如果您正在寻找效率,那么很可能是您分配大量小对象的方式,并且可能想要使用某种类型的池。
关于数据库,我会质疑你的耦合以及你的类的用户正在做什么和看到什么。理想情况下,您不希望他们看到您的实现细节,如果您的类中包含此私有“数据库”成员,则可能会出现问题,尽管您可以向前声明它。
您的构造函数应如下所示:
explicit SmallObject(Database& db) : db_(db) {}
您还应该正确处理SmallObjectFactory以管理基础数据库成员的生命周期,可能使您的类不可复制或使用shared_ptr。
您的另一个选择可能是维护一个小对象集合并执行通过容器而不是对象访问数据库的功能。这是一种常见的设计模式,但取决于您的模型。