2016-04-17 14 views
0

はのは、私は次のスキームでJSONオブジェクトを返すRESTサービスがあるとしましょう。オブジェクトを格納するデータ構造が必要です。の実装モデル、構造体対クラス

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 */); 

またはゲッター、セッターとAとクラスを持ちます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/getterを使って値を設定/取得する以外の何かを起動してはいけません)、私は個人的な好み以外の何かの利点を考えることはできません。

答えて

2

私はクラスルートに行きます。その場合、作業しているオブジェクトは、必要な作業(オブジェクトを作成するためのヘルパーメソッドはありません)を行うことができます。また、作業内容が明確かつ明白です。さらに、アプリケーションがより複雑になるにつれて、オブジェクトの構造と機能を論理的にも有用に保つことが容易になります。 C++で

+0

ありがとう、これらは良い点です。 –

2

structclassの唯一の違いは、structsとクラスのためのprivateためpublicあるデフォルトのアクセス指定子です。メンバー関数、コンストラクタ、移動割り当てなどを使用してstructを持つことができます。これはclassと同じです。コンストラクタでデシリアライゼーションを行うか、フリー関数を使用するかは、あなた次第です。もう1つのオプションは、personオブジェクトを返すメンバ関数をpersonに持つことです。

いずれの場合においても
class person { 
public: 
    static person fromJSON(JsonObject const& src) { ... } 
}; 

auto p = person::fromJSON(source); 

、あなたが効果的に任意のJSONオブジェクト何ができるかに渡しているので、検証コードの多くを必要とし、あなたが「ドン3/5/0のルールに従ってくださいます誤って移動セマンティクスを禁止します。

+0

はい。私は検証について知っていますが、私が選んだ実装が何であれ、それをやらなければならないので、私は質問に含めませんでした。ルールの+1。私はこれまで考えていませんでした。 –

関連する問題