实现模型,结构与类

时间:2016-04-17 01:44:45

标签: c++ design-patterns data-structures

假设我有一个REST服务,它使用以下方案返回JSON对象:

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

我有一个用C ++编写的应用程序,它接收这个对象并反序列化以供以后使用。我需要一个数据结构来存储对象。

我可以使用结构实现它:

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

并有一个辅助函数来初始化struct:

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

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

或者有一个带有getter,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)

我会去上课路线。在这种情况下,您正在使用的对象可以执行所有需要执行的操作(没有辅助方法来创建对象),并且清楚且明显地使用了什么。更重要的是,随着您的应用程序变得越来越复杂,它将使您更容易保持对象的结构和功能的逻辑性和实用性。

答案 1 :(得分:2)

在C ++中,structclass之间的唯一区别是默认访问说明符,public structs和类private。您可以拥有struct成员函数,构造函数,移动分配等,它与class相同。在构造函数中执行反序列化或具有自由函数完全取决于您。另一种选择是在static中使用person成员函数返回person个对象。

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

auto p = person::fromJSON(source);

在任何情况下,您都需要大量的验证代码,因为您传递的是有效的JSON对象,并且一定要遵循3/5/0的规则,这样您就不会意外抑制移动语义。