2016-04-17 72 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。到目前爲止,我沒有想到這一點。 –