C ++: Unterschied zwischen NVI und Vorlagenmethodenmustern?

7

Was ist der Unterschied zwischen NVI ( Nicht-virtuelle Schnittstelle ) und < a href="http://en.wikipedia.org/wiki/Template_method_pattern"> Vorlagenmethode Muster?

Sie scheinen mir sehr ähnlich zu sein und ich habe beide gelesen, dass sie im Grunde genommen die gleichen sind und dass sie sich subtil unterscheiden, da Template irgendwie allgemeiner ist.

    
Robert S. Barnes 20.06.2010, 09:20
quelle

2 Antworten

11

NVI ist ein Idiom, Template-Methode ist ein Muster. NVI ist eine Implementierung des Vorlagenmethodenmusters unter Verwendung des dynamischen Versands in C ++; Es ist auch möglich, Vorlagen-Methoden in C ++ zu erstellen, indem die Metaprogrammierung der Vorlage verwendet wird, um den dynamischen Versand zu eliminieren.

Ein Muster ist allgemeiner als ein Idiom, und Sprachen können verschiedene Idiome verwenden, um das Muster zu implementieren.

    
Pete Kirkham 20.06.2010, 10:11
quelle
8

Wie gesagt wurde, ist NVI eine Programmiersprache, die sich auf eine Kategorie von Sprachen bezieht. Es wurde unter anderem von Herb Sutter gefördert, weil es hilft, Verträge durchzusetzen:

  • Klasseninvarianten
  • function contracts (Behauptungen über die übergebenen Parameter und den erzeugten Rückgabewert)
  • sich wiederholende Operationen (wie Protokollierung)
  • Kontrolle über die erzeugten Ausnahmen (schlechte Idee;))

Die Implementierung kann jedoch tatsächlich erheblich abweichen. Ein anderes Beispiel für die NVI-Implementierung ist die Kombination mit Pimpl:

%Vor%

Und für die Implementierung:

%Vor%

Ich habe immer festgestellt, dass es den Punkt besser vermittelt hat. Hast du es herausgefunden?

Der Hauptpunkt ist, dass virtual ein Implementierungsdetail ist. Es ist eine schlechte Idee, Implementierungsdetails in der Schnittstelle offenzulegen, weil Sie sie möglicherweise ändern möchten.

Darüber hinaus neigen die Implementierungsdetails dazu, die Binärkompatibilität zu stören. Zum Beispiel kann das Hinzufügen einer neuen virtual -Methode in einer Klasse das Layout der virtuellen Tabelle (allgemeine Implementierungstechnik) ändern und somit die Binärkompatibilität verpfuschen. Auf gcc müssen Sie sicherstellen, dass Sie es zuletzt (unter den virtuellen) hinzufügen, wenn Sie die Kompatibilität beibehalten möchten.

Wenn Sie die obige Kombination aus NVI + Pimpl verwenden, gibt es in der exponierten Klasse überhaupt kein virtual (nicht einmal privat). Das Speicherlayout ist rückwärts und vorwärtskompatibel. Wir haben Binärkompatibilität erreicht.

Hier verwenden wir mehrere Muster gleichzeitig:

  • Vorlagenmethode
  • Strategie (da wir den Zeiger beliebig tauschen können)
  • Factory (um zu entscheiden, welche Implementierung wir bekommen)
Matthieu M. 20.06.2010 11:11
quelle