gpt4 book ai didi

c++ - 将数据部分保存在持久性存储 (SQL) 中,部分保存在 RAM(内存)中的设计模式是什么?

转载 作者:太空狗 更新时间:2023-10-29 21:38:16 24 4
gpt4 key购买 nike

我正在使用 C++ 和 Qt 设计一个应用程序。我在 Object 类中有经常需要 的数据,在 ObjectExtended 类中有很少需要 的数据。每个 Object 都与 ObjectExtended 相关联。

例子:

 Class Object 
{
string importantData; //we need that very often
int id;
}

Class ObjectExtended
{
date dateCreated; //meta info, we need this rarely
int assosiatedObjectId; //to know to which Object this extended data relates
}

我有对象列表 list<Object>list<ObjectExtended>

我想要的是将列表保存在 RAM(内存)中,并将列表保存在 ROM(本地存储,例如 SQL)中。需要它来节省内存。我已经将数据保存在 SQL 中以保存应用程序状态和数据。

我可能面临的问题是我的数据可能会改变,如果我为 ObjectObjectExtended 分离数据,我将不得不重写大量代码。

是否有一些设计模式最适合我的问题?

最佳答案

在应用代码中,使用Object的虚拟getter和setter,这样当你改变Object的实现时,你就不需要改变它。

class Object {
public:
virtual string getA() { return ""; }
virtual void setA(const string&) {}

virtual string getB() { return ""; };
virtual void setB(const string&) {}
};

然后,在继承自 ObjectPartialObject 中实现具体的数据字段:

class PartialObject {
public:
PartialObject() : k(KeyValueStore::invalidKey()) {}
virtual string getA() { return a; }
virtual void setA(const string& str) { a = str; }

protected:
KeyValueStore::key k; // This is for persistency

private:
string a;
};

并实现 FullObject,以及其余的数据字段,并具有持久性功能:

class FullObject : public PartialObject {
public:
FullObject(const PartialObject& partial) {
*this = partial;
}

virtual string getB() { return b; };
virtual void setB(const string& s) { b = s; }

// This function persists the full object, and returns a partial object, so that the full object can be deleted.
PartialObject save(KeyValueStore& kvStore) {
if (!KeyValueStore::isKeyValid(k))
k = kvStore.generateNewKey();
kvStore.setValue(k, serialize());
return PartialObject(reinterpret_cast<PartialObject&>(*this));
}

void load(KeyValueStore& kvStore) {
deseriaize(kvStore.getValue(k));
}
private:
string serialize() {
// Here you should implement the code for serializing all fields, and return serialized data as string.
}
void deseriaize(const string& str) {
// Here you should set "this" to the deserialized version of str.
}
private:
string b;
};

KeyValueStore 类是数据访问层:

class KeyValueStore {
public:
typedef unsigned long key;

string getValue(unsigned long long key);
void setValue(unsigned long long key, const string& value);

static bool isKeyValid(key k) { return k > 0; }
static key invalidKey() { return 0; }
key generateNewKey();
};

关于c++ - 将数据部分保存在持久性存储 (SQL) 中,部分保存在 RAM(内存)中的设计模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35794784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com