2016-07-08 14 views
1

ソフトウェアの設計に問題があります。私は非常に大きなオブジェクト(BO)を持っています。動的配列のマップを考えてみましょう。さまざまなクラスにまたがってアクセスする必要があります。クラスがBOを使用するたびに、クラスは新しいデータを追加したり、BO内のデータの一部を使用して計算を行います。システム全体のリソースを作成するC++

初心者の方で、私はこのようなオブジェクトをC++で設計する方法について迷っています。そのため、私のコード設計とアーキテクチャは良好です。グローバル変数を作ることは十分に効率的ではなく、Singletonで研究されていますが、ルールを見つけただけではオブジェクトにアクセスでき、それを変更することはできません。

誰でも正しい方向に向けることができますか?最も効率的でスケーラブルなデザインパターンは何ですか?ここでの回答に基づいて

おかげ

は、それはpsudoだ、次の正しい設計 - です!

Class BigObject { 

private static BigObject instance = null; 
private map; 
private BigObject() { } 

public static BigObject getInstance() { 
    if (instance == null) { 
     instance = new BigObject(); 
    } 
    return instance; 
} 

public getArray(string key) { 
    return map[key]; 
} 

public setBigObject(string key, Array value) { 
    map.insert(key, value); 
} 
+1

は、アプリケーションのルートの中で最も可能性の高いメインのオブジェクトを作成し、それを渡しますその変更の責任を負うクラス/関数に渡す。しかし、あなたが巨大な物体を持っていると言うと、それはまた、巨大な赤い旗であり、この巨大な物体が正確に何であるかによって、将来あなたを傷つける可能性があります。 –

+1

シングルトンで管理されているデータは、必要に応じてアクセスしたり変更することができます。大きなオブジェクトにアクセスして変更するには、複数のスレッドが必要ですか?大きなオブジェクトに他のアプリケーションからアクセスする必要がありますか? –

+2

グローバル変数が効率的でないのはなぜですか? – user4581301

答えて

6

「しかし、ルールがあなただけにそれを変更しないで、オブジェクトにアクセスすることができますされて発見しました。」

あなたはおそらく何か誤解していますか?
シングルトンの唯一の目的は、クラスの単一インスタンスを保証することです。そのクラスメンバ関数で許可されているように、その状態を変更することはできます。


あなたはそれが(Scott Meyer's Singleton以下)、スレッドセーフであることを改善する必要があり、あなたの更新の質問に投稿したシングルトンの実装について:

class BigObject { 
    std::map<std::string,Array> map; 
    BigObject() { } 

public: 
    static BigObject& getInstance() { 
     static BigObject instance; 
     return instance; 
    } 

    const Array& getArray(std::string key) const { 
     return map[key]; 
    } 

    void setBigObject(string key, Array value) { 
     map.insert(key, value); 
    } 
}; 

しかしとしてシングルトンしっかりカップルあなたのクライアントコードをシングルトンクラスに追加するには、BigObjectのインターフェイスを宣言する必要があります。アクセス権を持っている、と建設からインスタンスを渡す:

struct IBigObject { 
    virtual void doCostlyCalculations() = 0; 
    virtual void updateData(std::vector<int> record) = 0; 
    virtual ~IBigObject() {} 
}; 

class BigObject : public IBigObject { 
    virtual void doCostlyCalculations() { 
      // Implementation ... 
    } 
    virtual void updateData(std::vector<int> record) { 
      // Implementation ... 
    } 
}; 

class ClientA { 
    IBigObject& bo_; 
public: 
    ClientA(IBigObject& bo) : bo_(bo) {} 
} 

class ClientB { 
    IBigObject& bo_; 
public: 
    ClientA(IBigObject& bo) : bo_(bo) {} 
} 

int main() { 
    BigObject bo; 
    ClientA ca(bo); 
    ClientB cb(bo); 

    // ... 
}; 
+0

私がオンラインで見たシングルトンのコードには、そのクラスのインスタンスを取得するアクセサメソッドしかありません。 「建設からインスタンスを渡す」とはどういう意味ですか? –

+0

@ user4581301もっと正確に言い換えれば、私は願っています。 –

+2

@ Ashl7したがって、インスタンスを手元に持ってすぐに状態を変更することはできますか? –

関連する問題