C++ C++;对象设计问题:高效安全地构造对象并使用数据库保存/加载

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

我的英语不够好,无法解释我的问题。但我会尽力的

我以前是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 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
} 
我不确定我会走哪条路。在一个方面,您将加载/保存逻辑封装在对象类中,这对局部性很有好处,但它可能会将持久性和业务逻辑紧密地耦合在一个位置