Ich habe das Buch von Andrei Alexandrescu Modern C ++ Design gelesen. Und ich habe eine Frage über die Dekomposition einer Klasse in Richtlinien.
Was wäre eine gute Politikgröße? Die meisten Beispiele zeigen Teile wie Konstruktion, Zerstörung, Fadensicherheit und so weiter. Setzen Sie einfach kleine Richtlinien:).
Was ist, wenn ich eine Datei-io-Klasse erstellen möchte, die einen Dateityp als Richtlinie verwendet, z. B.
%Vor%Idee ist, von Datei zu erben und eine andere Vorlage zu erstellen, die bei Bedarf später erzeugt werden kann. Wäre das für Richtlinien gut geeignet oder sollte ich das Datei-Handle einfach an globale statische Funktionen übergeben oder sollte ich nur eine Klasse für jeden Dateityp erstellen? Ich möchte sicherstellen, dass die Benutzerfehler niedrig sind :) und Richtlinien scheinen weniger fehleranfällig zu sein.
Bearbeiten:
Danke @Claudiordgz für eine große unabhängige Antwort
Um ein anderes Beispiel zu geben, wäre der Netzwerkansatz.
UPD und TCP sind sehr ähnlich und gleichzeitig sehr unterschiedlich. Beide benötigen eine Steckdose, aber die eine ist verbindungslos die andere verbindungsorientiert. Aber logischerweise bleiben sie immer noch ein Teil des Transports und wenn ich ein höheres Abstraktionsniveau schaffen möchte, sagen wir ein Application Layer Protokoll, so würde es für mich bei Verwendung von @Claudiordordz zumindest sinnvoll sein, den Transportlayer als Richtlinie zu verwenden auf dem Netzwerkstapel platzieren.
Policies sind ein geschickter Switch-Mechanismus, sie werden für Folgendes verwendet:
Sie können gehen, wie Sie gerade gesagt haben, hier sind die Vor- / Nachteile von jedem:
Eine run-Methode kann sich je nach Algorithmus auf Tausende von Codezeilen erstrecken.
"Die meisten Beispiele zeigen Teile wie Konstruktion, Zerstörung, Thread-Sicherheit usw. Setzen Sie einfach kleine Richtlinien", weil sie kleine Beispiele sind, Richtlinien können sich nur auf Ihre Vorstellungskraft erstrecken, denken Sie daran, Sie sind der Programmierer und Sie nehmen die Code zu Höhen, die noch niemand gemacht hat. Wenn du es nicht tust, wird es niemand tun.
Und erinnere dich an Frodo ... Diese Aufgabe wurde für dich bestimmt, und wenn du keinen Weg findest, wird es niemand tun.
Sagen wir zum Beispiel, Sie haben eine Klasse namens Verbindung. Dann haben Sie eine Klasse TCP_conn und eine Klasse UDP_conn, die jeweils Pakete, Header und Methoden definieren, zum Beispiel:
Dann erben Sie wie Ihr Beispiel:
%Vor%Zum Beispiel ... Nehmen wir an, Sie haben eine Waveform-Klasse, die Wellenformen generiert
%Vor%Aber Sie brauchen Richtlinien für 128 Samples und für 1024 Samples, Sie tun dies nicht bei dynamischer Zuweisung, weil Sie die Sampling-Rate zur Kompilierungszeit und nicht zur Laufzeit ... (in diesem Fall zu Testzwecken) benötigen / p>
Also würde eine 128 Punkte pro Beispiel-Richtlinie wie
aussehen %Vor%Und eine 1024 Punkte pro Beispiel-Richtlinie würde aussehen wie
%Vor%Wie Sie sehen, können die Dinge so lange dauern, wie Sie möchten.
Eine andere Sache ist, dass ich meine Richtlinien mit Hilfe von Komposition statt Vererbung implementiert habe, was Alexandrescu in seinem anderen Buch der C ++ - Richtlinien mit Herb Sutter motiviert.
Hauptsache nach Hause zu nehmen ist
Sie müssen Code speichern, je weniger Sie codieren, desto mehr Wert nehmen Sie mit nach Hause. Aber das bedeutet nicht, dass es nicht schwer wird.
Es hängt also wieder von Ihrem Problem ab.
Um meinen Code zum Beispiel zu verwenden, mache ich folgendes
%Vor%In der 60 ist die Frequenz und 1000 ist die Amplitude. Beide werden nur unterschiedlich große Arrays zurückgeben.
Die 1024-Größe wird bei der grafischen Darstellung wesentlich glatter.
Das ist wirklich bequem für mich, wenn ich Dinge in Bezug auf Wellenformen direkt in C ++ teste, und ich kann verschiedene Wellenformen durch Hinzufügen oder Subtrahieren zusammenstellen.
Nun, die Setup-Methode ist in der Wellenform-Klassenvorlage definiert. Das Array wird jedoch für die Richtlinie sowie die Zugriffsmethoden für das Array und die Größe des Arrays beibehalten. Außerdem können Sie die Funktionalität für die Richtlinie erweitern.
Persönliche Präferenz und einige andere Gründe basierend auf einigen Büchern. Sie können die Vererbung verwenden, solange Sie nicht mit der Basisklassenfunktionalität verrückt werden.
Da die Wellenform selbst privat ist, kann ein Benutzer Ton erstellen, aber nicht ändern.
Ich möchte meine Waveforms wie Matlab nur in C ++ verwenden können.
Nehmen wir an, Sie implementieren Partikelschwarmoptimierung. Sie codieren das PSO in einer Vorlage, die ein Array von Daten empfängt, und optimiert Ihr Problem darauf.
Aber Ihre Richtlinien sind verantwortlich für die Gewichte für jedes Partikel und auch für den Übergang von der N Datenstruktur in das Datenfeld.
So rufen Sie Setup im Template Manager auf, wie gesagt, der Manager erhält ein Array, ruft aber eine Methode der Policy auf, um das Array zu erhalten. Diese Methode in der Richtlinie bildet eine Matrix in ein Array oder eine Datenbank in ein Array ab.
Sie müssen jetzt also wie I / O in der Richtlinie und den Gewichtungen arbeiten.
Es könnte sehr groß werden.
Tags und Links c++ design-patterns design templates