2016-04-17 74 views
0

比方说,我有它返回一个JSON对象下面的方案REST服务:实施模型,结构与类

{ 
    "id" : 1 
    "name" : "Peter" 
    "age" : 25 
} 

我有一个应用程序写在接收到该对象和反序列化以备后用C++ 。我需要一个数据结构来存储对象。

我可以实现使用一个结构:

struct person 
{ 
    int id; 
    string name; 
    int age; 
}; 

并具有辅助函数初始化结构:

// Returns a person deserialized from a JSON object 
person fromJson(JsonObject obj); 

// Usage: 
auto personInfo = fromJson(/* JSON object from REST service */); 

或与干将,setter和一类构造函数以JsonObject作为参数并自行完成解串操作:

class person 
{ 
public: 
    // Deserialized a JSON object and initializes the private fields 
    person(JsonObject obj); 

    int id() const; 
    string name() const; 
    int age() const; 

    void setId(int id); 
    void setName(string name); 
    void setAge(int age); 

private: 
    int _id; 
    int _name; 
    int _age; 
}; 

// Usage: 
person personInfo{ /* JSON object from REST service */ }; 

鉴于数据将存储在客户端机器上,显示,可能编辑然后发送回REST服务,哪个实现更适合使用?因为我只会使用数据结构来存储数据(使用setter/getters不应触发除设置/获取值之外的任何其他内容),我无法真正想到除个人偏好之外的其他任何好处。

回答

2

我会走班级路线。在这种情况下,你正在使用的对象可以完成所有需要做的事情(没有帮助者方法来创建对象),而且清楚明白正在处理的内容。更重要的是,随着应用程序变得越来越复杂,它将使保持对象的结构和功能更加容易逻辑和有用。

+0

谢谢你,这些都是好的。 –

2

在C++中,一个structclass之间的唯一区别是默认的访问说明符是用于publicstructsprivate为类。您可以使用struct以及成员函数,构造函数,移动赋值等,它与class完全相同。在构造函数中进行反序列化或具有自由函数完全取决于您。另一个选项是person中的static成员函数返回person对象。

class person { 
public: 
    static person fromJSON(JsonObject const& src) { ... } 
}; 

auto p = person::fromJSON(source); 

在任何情况下,你将需要大量的验证代码,因为你是在传递什么可以有效地任意JSON对象,并确保遵循3/5/0的规则,所以你不要”无意中禁止移动语义。

+0

是的。我知道验证,但我没有包括在我的问题中,因为无论我选择何种实现,我都必须这样做。规则+1。到目前为止,我没有想到这一点。 –