2008-12-23 6 views
5

Betrachten wir eine C++ - Klasse. Zu Beginn der Ausführung möchte ich eine Menge von Werten aus einer XML-Datei lesen und sie 7 der Datenmitglieder dieser Klasse zuordnen. Diese Werte ändern sich während der gesamten Ausführung nicht und müssen von allen Objekten/Instanzen der betreffenden Klasse gemeinsam genutzt werden. Sind statische Datenelemente der eleganteste Weg, um dieses Verhalten zu erreichen? (Natürlich betrachte ich keine globalen Variablen)Soll ich statische Datenelemente verwenden? (C++)

Antwort

3

Klingt wie eine gute Verwendung von statischen Variablen für mich. Sie verwenden diese mehr als feste Parameter als Variablen, und die Werte müssen legitimerweise geteilt werden.

3

statische Mitglieder würden hier arbeiten und sind durchaus akzeptabel. Eine andere Option ist die Verwendung eines singleton pattern für die Klasse, die diese Member enthält, um sicherzustellen, dass sie nur einmal erstellt/festgelegt werden.

5

Wie andere erwähnt haben, scheint die Verwendung von statischen Elementen in diesem Fall angemessen. Vergiss nicht, dass es nicht narrensicher ist. einige der Probleme mit globalen Daten gelten für statische Mitglieder:

  • Sie nicht die Reihenfolge der Initialisierung des statischen Elemente steuern können, so müssen Sie sicherstellen, dass keine Globals oder andere Statik auf diese Objekte verweisen. Weitere Details finden Sie unter this C++ FAQ Question und einige Tipps zur Vermeidung dieses Problems.
  • Wenn Sie in einer Multithread-Umgebung darauf zugreifen, müssen Sie sicherstellen, dass die Mitglieder vollständig initialisiert sind, bevor Sie Threads spawnen.
+0

Die Werte werden am Beginn der Ausführung festgelegt, so dass hier diese Probleme sind nicht wirklich anwendbar. –

+0

David, werden Sie einmal entscheiden, ein XML-Objekt als statisches Objekt irgendwo zu setzen. auch die Reihenfolge der Zerstörung ist relevant. Siehe meine Antwort unten. –

2

klingt wie eine angemessene Verwendung von statischen Klassenmitgliedern. Vergiss nicht, dass sie wirklich globale Variablen mit einem Namensraum und (vielleicht) etwas Schutz sind. Wenn es also die Möglichkeit gibt, dass Ihre Anwendung eines Tages verschiedene "Umgebungen" entwickeln könnte oder etwas, das für jede dieser Welten eine Menge dieser Globalen benötigen würde, hätten Sie sich in eine Ecke gemalt.

Wie von Rob vorgeschlagen, sollten Sie ein Singleton verwenden, das später leichter in eine Art verwaltete Umgebungsvariable umgewandelt werden kann.

3

Es ist kein sauberes Design. Statische Klassenmitglieder sind globaler Status und global state is bad.

Es kann Ihnen keine Probleme bereiten, wenn es sich um ein kleines bis mittleres Projekt handelt und Sie keine hohen Ziele für automatische Tests haben, aber da Sie fragen: Es gibt bessere Wege.

Ein saubereres Design wäre, eine Factory für die Klasse zu erstellen und die Factory übergibt ihre sieben Variablen an die Klasse, wenn sie es konstruiert. Es ist dann Aufgabe der Factory, sicherzustellen, dass alle Instanzen die gleichen Werte teilen.

Auf diese Weise wird Ihre Klasse testbar und Sie haben Ihre Bedenken ordnungsgemäß getrennt.

PS. Don'tusesingletonseither.

+2

Jedes Mal, dass ich „xxx ist schlecht“, mein oversimplification Detektor lesen beginnt zu blinken. Wie bei anderen Postern glaube ich, dass diese Verwendung von statischen Variablen vollkommen gültig ist. –

+1

Der globale Status ist hauptsächlich schlecht, wenn er sich ändert. Unveränderlicher globaler Zustand, der das ist, funktioniert gut. –

+0

Lesen Sie einfach Ihren Link; es besagt, dass Singletons (und der ungefähr gleichwertige globale Zustand) nichts schädigen, wenn sie unveränderliche Daten enthalten, was das ist. –

0

Solange Sie an Testbarkeit denken und Sie eine andere Möglichkeit haben, die statischen Variablen neben dem Einlesen einer Datei festzulegen, und Sie sich nicht auf die Daten benig unverändert für die gesamte Ausführungszeit des Prozesses verlassen - Sie sollten fein.

Ich habe festgestellt, dass der Gedanke, Tests zu schreiben, wenn Sie Ihren Code entwerfen, hilft Ihnen, den Code gut durchdacht und wiederverwendbar zu halten.

1

Ja, statische Daten sind, was Sie suchen.Sie müssen jedoch auf die Initialisierungs-/Zerstörungsreihenfolge Ihrer statischen Variablen achten. In C++ gibt es keinen Mechanismus, um sicherzustellen, dass Ihre statischen Variablen initialisiert werden, bevor Sie sie in Übersetzungseinheiten verwenden. Um sicher zu sein, verwenden Sie etwas, das wie das Singleton-Muster aussieht, und ist dafür bekannt, dieses Problem zu beheben. Es funktioniert, weil:

  1. Alle statischen Objekte werden vollständig nach der vollständigen Erstellung einer xml_stuff-Instanz erstellt.
  2. Die Reihenfolge der Zerstörung von statischen Objekten in C++ ist das genaue Gegenteil der Vollendung ihrer Konstruktion (wenn ihre Ausführung beendet Konstruktor).

Code:

class xml_stuff { 
public: 
    xml_stuff() { 
     // 1. touch all members once 
     // => 2. they are created before used 
     // => 3. they are created before the first xml_stuff instance 
     // => 4. they will be destructed after the last xml_stuff instance is 
     //  destructed at program exit. 
     get_member1(); 
     get_member2(); 
     get_member3(); 
     // ... 
    } 

    // the first time their respective function is called, these 
    // objects will be created and references to them are returned. 
    static type1 & get_member1() { static type1 t; return t; } 
    static type2 & get_member2() { static type2 t; return t; } 
    static type1 & get_member3() { static type1 t; return t; } 
    // ... all other 7 members 
}; 

Nun werden die Objekte von xml_stuff zurück :: get_memberN() gelten die gesamte Lebensdauer einer xml_stuff Beispiel, weil jedes dieser Mitglieder vor jeder xml_stuff Instanz errichtet wurden. Wenn Sie einfache statische Datenelemente verwenden, können Sie dies nicht sicherstellen, da die Reihenfolge der Erstellung über Übersetzungseinheiten in C++ nicht definiert ist.

2

Zu Beginn der Ausführung I eine Reihe von Werten aus einer XML-Datei lesen möchten, und ordnen sie 7 der Daten Mitglieder dieser Klasse. Diese Werte während der gesamten nicht Ausführung ändern und sie müssen durch alle Objekte/Instanzen der Klasse in Frage geteilt werden.

Der Satz in Fettschrift ist der Kicker hier. Solange diese Aussage zutrifft, ist die Verwendung von statischen Variablen OK. Wie wird dies durchgesetzt?

Es ist schwer zu. Also, wenn für Ihren Gebrauch jetzt die Aussage immer wahr ist, gehen Sie voran. Wenn Sie von einem zukünftigen Entwickler sein gleiche wollen (oder Sie) mit Ihren Klassen falsch (wie eine andere XML-Datei auf halbem Wege in dem Programm zu lesen), dann tun Sie etwas wie das, was Rasmus Farber sagt.

Verwandte Themen