C++ C++;对象设计问题:高效安全地构造对象并使用数据库保存/加载
我的英语不够好,无法解释我的问题。但我会尽力的 我以前是java程序员,但C++使用了一年多了。一直困扰我的一件事是从网络创建业务对象(如通过SNMP、Web服务或其他数据源…)并将其保存到数据库,并在应用程序启动时加载。通常我的设计如下:C++ C++;对象设计问题:高效安全地构造对象并使用数据库保存/加载,c++,object,C++,Object,我的英语不够好,无法解释我的问题。但我会尽力的 我以前是java程序员,但C++使用了一年多了。一直困扰我的一件事是从网络创建业务对象(如通过SNMP、Web服务或其他数据源…)并将其保存到数据库,并在应用程序启动时加载。通常我的设计如下: class Object{ /* this is just a demonstration, in real code, there are all kinds of Object and has relationships*/ friend class
class Object{
/* this is just a demonstration, in real code, there are all kinds of Object and has relationships*/
friend class DBConnection;
friend class SNMPConn
private:
std::string& m_strName;
//... all kinds of properties
}
class DBConnection
{
int load(Object& obj);
int save(Object& obj);
int modify(Object& obj);
int loadAll(std::vector);
}
class SNMPConn
{
int load(Object& obj);
...
}
我不喜欢的是“朋友班……”这句话。我发现了一些框架,比如litesql(sourceforge.net/apps/trac/litesql)和其他商业框架,但是这些框架很难与我现有的代码集成。我试图手动完成这项工作,并试图为这类工作找到一个共同的策略
我是一个java开发者,C++设计是我不擅长的。我不知道这种设计工作的最佳实践是什么。我从这个问题(在读写DB或SNMP连接时破坏封装)中了解到,首先,您需要一个适当的设计来消除这些“朋友”。请为连接(即IDBConnection)和持久对象(即IPersistent)定义一个抽象类。您可以使用“抽象工厂”模式来创建它们。此外,将load和save方法隔离到另一个类,并使用“访问者模式”从数据库初始化或保存对象
另一点,如果你需要一个嵌入的DB用于你的应用程序,那么就有好的C++包装器。希望它有帮助
以下是我如何用伪代码实现它:class Result {
public:
int getField(name);
string getField(name);
}
class Connection {
public:
void save(list<pair<string, string>> properties);
Result query();
}
class DBConnection {
private:
class DBResult : public Result {
}
public:
Result query() {
return ( DBResult );
}
void save
}
class Object {
public:
void load(Result);
void save(Connection) {
// make properties list
connection.save(properties);
}
}
类结果{
公众:
int getField(名称);
字符串getField(名称);
}
类连接{
公众:
作废保存(列表属性);
结果查询();
}
类DBConnection{
私人:
类DBResult:公共结果{
}
公众:
结果查询(){
返回(DBResult);
}
无效保存
}
类对象{
公众:
孔隙荷载(结果);
无效保存(连接){
//制作属性列表
连接。保存(属性);
}
}
如果没有Java风格的反射,我可能会这样做,而不会陷入“朋友关系”。那么您就没有将连接逻辑的知识紧密地耦合到连接类中
您也可以构建模板函数来实现这一点,但您仍然需要朋友关系
class Object {
public:
friend template<class Conn, class Obj> load(Conn c, Obj o);
friend template<class Conn, class Obj> save(Conn c, Obj o);
}
load<Connection, Object>(Connection c, Object o) {
//access o.private to load into c
}
类对象{
公众:
朋友模板加载(连接c、对象o);
朋友模板保存(Conn c,Obj o);
}
加载(连接c,对象o){
//访问o.private以加载到c
}
我不确定我会走哪条路。在一个方面,您将加载/保存逻辑封装在对象类中,这对局部性很有好处,但它可能会将持久性和业务逻辑紧密地耦合在一个位置