Richtlinienbasierte Design-C ++ - Fragen

9

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.

    
mekhai 25.02.2014, 21:48
quelle

1 Antwort

17

Policies sind ein geschickter Switch-Mechanismus, sie werden für Folgendes verwendet:

  • Ein Factory-Muster mit einer Template Factory, die zwischen den Produkten
  • wechselt
  • Ein Strategie-Muster mit einer Template-Klasse, die das Verhalten zwischen dem Verhalten
  • umschaltet
  • Eine Klasse mit verschiedenen Attributtypen, z. B. mit einem Fahrzeug, und in den Richtlinien könnten Sie die Verhaltensweisen haben.

Idee ist, von Datei zu erben und eine andere Vorlage zu erstellen, die später bei Bedarf 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.

Sie können gehen, wie Sie gerade gesagt haben, hier sind die Vor- / Nachteile von jedem:

  • Globale statische Funktionen
    • PROS
      • Wenn Sie planen, ein kleines Programm zu machen, was ist dann die Sorge? Benutze sie einfach und lass sie los und stoppe die Entwicklung von
    • VERBRAUCHER
      • Ihre Implementierung könnte zusätzliche Daten von anderen Orten erfordern, was bedeutet, dass die Dinge unproportioniert werden könnten.
      • Wenn ein Programm wächst, möchten Sie vielleicht Dinge zwischen globalen statischen Funktionen teilen, also entfernen Sie die statische, dann beginnen Sie mit globalen Variablen, dann Chaos, es dauert etwa 3 Jahre, bis dies passiert. Wenn es auf Ihren Fall zutrifft, dann passen Sie auf.
      • Sie möchten einen Satz von Funktionen in einem Thread und einen anderen in einem anderen Thread ausführen, also erstellen Sie einen Klassenmanager von Funktionen, mit globalen statischen Funktionen könnte das Refactoring ermüdend werden.
  • Klasse für jeden Dateityp
    • PROS
      • Viele Tutorials, wie man es macht
    • VERBRAUCHER
      • Da ein Programm mehr Klassen zum Nachverfolgen entwickelt.
      • Umschreiben von viel ....... BOILERPLATE
      • Es ist im Grunde das Gleiche wie die Verwendung von Vorlagen. Wenn Sie eine Vorlagen-Master-Klasse erstellen können, sind einige Ausführungsprobleme darauf beschränkt, anstatt auf die restlichen Dateien verteilt zu werden.
  • Richtlinien (Disclaimer: Ich liebe Richtlinien)
    • PROS
      • Ein Master-Interface, um alle zu regeln
      • Erzeugt Code zum Zeitpunkt der Kompilierung, also erstellen Sie eine Klasse für jede von Ihnen verwendete Klasse.
      • Einfach zu pflegen im Vergleich zu vielen Boilerplatty-Klassen.
    • VERBRAUCHER
      • Wie Alexandrescu feststellt, könnte eine Template-Codierung die Kompilierungs-Optimierungen nutzlos machen.
      • Es ist schwieriger zu gestalten, schwerer zu verstehen, schwerer zu implementieren.
      • Der leichtere Pfad mag Sie faszinieren und Sie können die Implementierung beenden und wieder zu globalen statischen Funktionen zurückkehren, die wie ein kleines Mädchen weinen.

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.

es wäre zumindest für mich sinnvoll, den Transportlayer aufgrund seines Platzes auf dem Netzwerkstack als Richtlinie zu verwenden.

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:

  • Methode senden
  • Methode empfangen (für TCP)
  • Methodeneinstellung

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.

Was ist der Vorteil?

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.

Warum nicht Vererbung?

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.

Warum so viele Methoden in der Richtlinie?

Da die Wellenform selbst privat ist, kann ein Benutzer Ton erstellen, aber nicht ändern.

Warum so viel überladen?

Ich möchte meine Waveforms wie Matlab nur in C ++ verwenden können.

Was meinst du? Die Umsetzung der Politik könnte groß werden

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.

    
Claudiordgz 25.02.2014, 22:15
quelle