Frage

Ich entwickle eine C ++ Klassenbibliothek Domänenmodell Klassen enthalten, und ich möchte, Unterstützung für diese Klassen aus verschiedenen Persistenzmechanismen instanziiert wird, das heißt Datenbanken und Datei. Der Benutzer der Klassenbibliothek sollte eine Schnittstelle gegeben werden (?), Gegen das eine Klasse zu programmieren, der die Daten vom / zum Persistenzmechanismus übertragen kann.

Ich weiß, das Objekt Muster-Datenzugriff, die für Java zu funktionieren scheint, aber ich bin mir nicht ganz sicher, wie es C ++ anzuwenden. Gibt es andere Lösungen?

War es hilfreich?

Lösung

C ++ unterstützt Mehrfachvererbung, so dass Sie eine allgemeine Persistenz-API haben kann und einen Persistenzmechanismus erben. Dies würde immer noch Innerlichkeit verwenden, um die Klasse Metadaten zu erhalten, aber man würde immer noch dieses Problem mit jeder Persistenz-Schicht hat.

Alternativ können Sie etwas ähnliches tun, aber die Metadaten verwenden, um einen Code-Generator antreiben, die für die Persistenz-Schicht.

in dem ‚Getter‘ und ‚Setters‘ füllen

Jede Persistenz-Schicht wird in der Regel eine oder die andere Methode verwenden, um Ihr Problem des Lademechanismus in die Persistenz-Schicht hakt. Ich denke, das macht das Problem etwas anders aus einer einzigen Persistenz-Schicht, aber es aus der anderen Richtung Angriff zu nehmen. Anstatt der Aufbau Domain-Klassen auf einem Persistenz-Framework Sie mit dem Haken für eine Persistenz-Framework eine Reihe von Domain-Klassen bieten, die Dritter ihres Datenzugriffsmechanismus in anschließen kann.

Ich denke, wenn Sie den Zugriff auf Klassen Metadaten bereitstellen und Rückrufe der perisistence Mechanismus relativ einfach ist. Schauen Sie sich die Metadaten-Komponenten von jedem beliebigen C ++ O / R-Mapping-Framework und verstehen, wie sie funktionieren. Kapselt dies mit einer API in einer der Basisklassen Ihrer Domain-Klassen und bietet ein generisches Getter / Setter-API für Instanziierung oder persistierenden. Der Rest ist bis zu der Person, die Umsetzung der Persistenz-Schicht.

Edit: Ich kann nicht denken Sie an eine C ++ Bibliothek mit dem Typ des steckbaren Persistenzmechanismus Sie beschreiben, aber ich habe etwas in Python, die diese Art der Anlage gehabt haben könnte hinzugefügt. Die spezielle Implementierung verwendete Einrichtungen in Python ohne direkten C ++ gleichwertig, obwohl das Grundprinzip wahrscheinlich angepasst werden könnte, mit C ++ zu arbeiten.

In Python können Sie abfangen Zugriffe auf Instanzvariablen durch zwingende __getattr()__ und __setattr()__. Der Persistenzmechanismus beibehalten tatsächlich seine eigenen Daten-Cache hinter den Kulissen. Wenn die Funktionalität in die Klasse (done durch Mehrfachvererbung) gemischt wurde, überwog es das Standard-Systemverhalten für zugreifenden Mitglied und überprüft, ob das Attribut abgefragt etwas in seinem Wörterbuch abgestimmt ist. Wo dies geschah, wurde der Anruf umgeleitet zu erhalten oder ein Element in dem Daten-Cache eingestellt.

Der Cache hatte Metadaten für sich. Es war bekannt, Beziehungen zwischen Entitäten in ihrem Datenmodell, und wusste, dass die Attributnamen abfangen Daten zuzugreifen. Die Art und Weise dies funktionierte getrennt von der Datenbank-Zugriffsschicht und könnte (zumindest theoretisch) den Persistenzmechanismus durfte mit verschiedenen Fahrern genutzt werden. Es gibt keinen inhärenten Grund, dass Sie nicht (zum Beispiel) haben könnten einen Treiber gebaut, dass es in eine XML-Datei serialisiert werden.

wäre ein bisschen mehr knifflig sein, etwas wie diese Arbeit in C ++ zu machen, und es kann nicht möglich sein, das Objekt Cache-Zugriff als transparent zu machen, wie es mit diesem System war. Sie würden wahrscheinlich mit einem expliziten Protokoll am besten sein, die Lasten und den Zustand in den Cache des Objekts spült. Der Code, dies wäre durchaus zugänglich zu Generation aus den Cache-Metadaten, aber dies würde bei der Kompilierung durchgeführt werden muß. Sie können in der Lage sein, etwas mit Vorlagen zu tun oder mit dem -> Betreiber überschreibt das Zugriffsprotokoll transparenter zu machen, aber das ist wahrscheinlich mehr Mühe, als es wert ist.

Andere Tipps

Serialisierung Erhöhung einige ziemlich bietet nützliches für ++ Typen mit Serialisierung C arbeiten, aber wie gut es die Schnittstelle übereinstimmen, weiß ich nicht wünschen. Es unterstützt sowohl intrusive und nicht-intrusive Designs, so ziemlich flexibel ist.

würde ich vermeiden, Serialisierung, IMHO, wir implementiert dies für einen unserer Anwendungen in MFC im Jahr 1995, wir intelligent genug waren unabhängige Objektversionierung zu verwenden und Dateiversionierung, aber Sie mit vielen alten messy Code am Ende um nach der Zeit.

Stellen Sie sich vor bestimmte Szenarien ironische Klassen, ironische Mitglieder, usw., jedes stellt ein neues Problem. Jetzt compreseds „XML-Typ“ Streams verwenden wir, können wir neue Daten hinzufügen und die Abwärtskompatibilität beibehalten.

Lesen und Schreiben der Datei wird abstrahiert von Abbildung der Daten zu den Objekten können wir jetzt wechseln Dateiformate, fügen Sie Importeure / Exporteure ohne Änderungen in unseren Kerngeschäftsobjekte.

Dass gesagt wird einige Entwickler lieben Serialisierung, meine eigenen Begegnungen ist, dass Code-Basis wechseln, Plattformen, Sprachen, Toolkits die ganze Zeit viele Probleme mit sich bringen, zu lesen und Ihre Daten schreiben sollte einer von ihnen nicht sein.

mit zusätzlich ein Standard-Datenformat, mit einigen proprietären Schlüsseln, bedeutet, seine viel einfacher, mit dritten Parteien zu arbeiten.

Vielleicht möchten Sie unter Serialisierung steigern . Nicht genutzt hat, kann ich nicht sagen, ob es empfehlen oder nicht. Boost-Bibliotheken sind in der Regel hohe Qualität.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top