2016-07-08 12 views
1

Ich habe ein Problem beim Entwerfen einer Software. Ich habe ein sehr großes Objekt (BO), sagen wir eine Karte von dynamischen Arrays, auf die ich über verschiedene Klassen hinweg zugreifen muss. Jedes Mal, wenn eine Klasse BO verwendet, fügt sie neue Daten hinzu oder verwendet einige der Daten in BO, um Berechnungen durchzuführen.Erstellen einer systemweiten Ressource C++

Als Neuling bin ich verloren, wie ein solches Objekt in C++ zu entwerfen, so dass mein Code-Design und Architektur gut ist. Eine globale Variable zu erstellen ist nicht effizient genug. Sie wurde in Singleton erforscht, hat aber die Regel herausgefunden, dass Sie nur auf das Objekt zugreifen und es nicht ändern können.

Kann mir jemand in die richtige Richtung zeigen? Welches Designmuster sollte ich verfolgen, das am effizientesten und am besten skalierbar ist?

Dank

Basierend auf den Antworten hier ist die folgende eine korrekte design- es psudo ist!

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

Erstellen des Objekts in der Anwendung Wurzel, am wahrscheinlichsten Haupt, und es passieren zu Klassen/Funktionen, die für seine Änderung verantwortlich sind. Wenn du jedoch sagst, dass du ein riesiges Objekt hast, ist das auch eine riesige rote Flagge, die dich in der Zukunft verletzen kann, abhängig davon, was genau dieses riesige Objekt tut. –

+1

Die von einem Singleton verwalteten Daten können Sie bei Bedarf abrufen und ändern. Benötigen Sie mehrere Threads, um auf das sehr große Objekt zuzugreifen und es zu ändern? Müssen Sie aus anderen Anwendungen auf das große Objekt zugreifen? –

+2

Warum ist die globale Variable nicht effizient? – user4581301

Antwort

6

„fand aber heraus die Regel, die Sie nur auf das Objekt zugreifen können, ist es nicht ändern.“

Sie haben wahrscheinlich etwas missverstanden?
Der einzige Zweck eines Singleton ist es, eine Einzelinstanz einer Klasse zu gewährleisten. Sie können den Status immer noch ändern, wie es die Klassenelementfunktionen zulassen.


In Bezug auf die Singleton-Implementierung Sie in Ihrer aktualisierten Frage gestellt haben Sie es Thread-sicher zu sein (nach Scott Meyer's Singleton) verbessern sollten:

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); 
    } 
}; 

Aber als Singleton eng Paare Ihren Client Code an die Singleton-Klasse, sollten Sie wahrscheinlich eine Schnittstelle für Ihre BigObject deklarieren, nehmen Sie Referenzen in den Klassen, die benötigen eine Instanz von der Konstruktion haben, Zugang, und übergeben:

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

Jeder Singleton-Code, den ich nur online gesehen habe, hat Zugriffsmethode, um die Instanz der Klasse zu erhalten. Was meinst du "eine Instanz von der Konstruktion weitergeben"? –

+0

@ user4581301 Genauer gesagt jetzt hoffe ich. –

+2

@ Ashl7 Sie können also den Status ändern, sobald Sie die Instanz zur Hand haben? –