2010-02-23 3 views
5

Ich habe eine Klasse, die auf einer Datenbank, die eine historische Extraktion definiert:Der beste Weg, Last/der Organisation speichern Funktionen in Bezug auf statische/nicht-statischen

class ExtractionConfiguration 
{ 
    string ExtractionName; 
    time ExtractionStartTime; 
    time ExtractionEndTime; 

    // Should these functions be static/non-static? 
    // The load/save path is a function of ExtractionName 
    void SaveConfigruation(); 
    void LoadConfiguration(); 
} 

Diese ExtractionConfigurations zu/geladen von der Festplatte gespeichert werden müssen, . Wie können die Speicher-/Ladefunktionen am besten statisch/nicht-statisch organisiert werden? Für mich ist klar, dass SaveConfiguration() eine Memberfunktion sein sollte. Jedoch mit LoadConfiguration(), macht es mehr Sinn machen

ExtractionConfiguration newExtraction; 
newExtraction.LoadConfiguration(); 

und haben eine temporäre leere Instanz anzurufen oder die Ladefunktion statisch

static ExtractionConfiguration LoadConfiguration(string filename); 

und nur

ExtractionConfiguration newExtraction = ExtractionConfiguration::LoadConfiguration(filename); 

nennen machen die fühlt sich besser an, bricht aber die "Symmetrie" des Lade-/Speichermechanismus (ist das überhaupt eine sinnvolle/sinnvolle Überlegung?).

Ich denke, die Frage nach der "besten" Antwort ist etwas naiv. Ich versuche wirklich, ein besseres Verständnis für die hier auftretenden Probleme zu bekommen.

P.S. Das ist meine erste Frage zu SO, also wenn ich sie nicht richtig vorgestellt habe, lass es mich wissen und ich werde versuchen, das Problem klarer zu machen.

+0

Willkommen. Um als Code zu formatieren, ziehen Sie den Codeabschnitt um 4 Leerzeichen oder 1 Tabulator ein. Siehe http://stackoverflow.com/editing-help. – kennytm

+0

Danke Kenny, ich war * sicher * mir fehlte ein Trick mit der Formatierung da! –

+3

Sie sollten kürzere Namen verwenden. Z.B. einfach speichern und laden, da sie bereits in der Klasse sind. Nicht jeder benutzt Intellisense :) – Tronic

Antwort

1

Sie sollten in Betracht ziehen, die Serialisierungsfunktion Boost.Serialization style zu verwenden, die separate Funktionen zum Speichern und Laden vermeidet (auch wenn Sie die Bibliothek nicht selbst verwenden).

Bei diesem Ansatz können Sie die Funktion jedem Objekttyp übergeben, der über den Operator & verfügt, um eine Operation für alle Elementvariablen auszuführen. Ein solches Objekt könnte die Daten in einer Datei speichern, ein anderes könnte aus einer Datei geladen werden, ein drittes könnte die Daten auf der Konsole ausgeben (zum Debuggen usw.).

Wenn Sie separate Funktionen beibehalten möchten, ist es möglicherweise eine bessere Option, sie als nicht statische Elemente zu verwenden. Für die Speicherfunktion ist dies offensichtlich, aber das Laden ist eine andere Sache, da Sie das Objekt konstruieren müssen. Wie auch immer, recht häufig wird das Laden durch Standard-Konstruieren und dann Aufruf der nicht statischen Ladefunktion geladen, aus Symmetriegründen, nehme ich an.

Das Laden als eine Funktion, die ein neues Objekt zurückgibt, scheint in mancher Hinsicht besser zu sein, aber dann müssen Sie entscheiden, wie es das Objekt zurückgibt. Wird es neu vergeben oder einfach nach Wert zurückgegeben? Die Rückgabe nach Wert erfordert, dass das Objekt kopierbar ist, und das Zurückgeben eines Zeigers erfordert das Ressourcenverwaltungsschema (kann das Objekt nicht einfach auf dem Stapel speichern).

+0

Guten Ruf auf die Serialisierung. Es ist nicht schwer, eigene Serialisierungsfunktionen zu verwenden, wenn Sie Boost aus irgendeinem Grund nicht mögen. @Rodion, Überlegen Sie, ob Sie einen Konstruktor oder eine Initialisierungsfunktion erstellen, die den Dateinamen als Argument verwendet, wenn Sie zusätzliche Kopien vermeiden möchten. Sie könnten Ihre Lade- oder Deserialisierungsfunktion als Helfer behalten. – thebretness

+0

Ich werde mir die Serialisierungsbibliothek ansehen, das klingt sinnvoll. Leider hat mein Chef eine "glaube nicht den Hype" -Einstellung gegenüber OOP und in der Tat fast alles, was du nicht persönlich codiert hast, weshalb ich eine grundlegende Lade-/Speicherstruktur verwende. Ihre Punkte auf dem Laden/Speichern entsprechen ziemlich meinen Gefühlen. Ich werde mich für nicht statische Ladung/Speicherung entscheiden. Was die Rückgabe einer statischen Last angeht, denke ich, dass eine Rückgabe am besten ist. Wie du sagst, diktiert das Übergeben von Zeigern deine Methode der Ressourcenverwaltung, die dein Design über etwas ziemlich Minderwertiges fesseln würde. –

Verwandte Themen