Was ist der Vorteil dieses indirekten Funktionsaufrufs?

8

Ich habe den folgenden Code in einer Bibliothek gefunden:

%Vor%

Nun frage ich mich: Warum würdest du diese Indirektion benutzen? Könnte es Gründe geben, warum das Obige besser wäre als die einfache Alternative:

%Vor%     
Frank 19.03.2009, 17:50
quelle

4 Antworten

10

Dies ist das Non-Virtual Interface Idiom (NVI). Diese Seite von Herb Sutter hat ein gutes Detail. Wie auch immer, temperieren Sie, was Sie dort gelesen haben, was die C ++ FAQ Lite hier sagt > und hier .

Der Hauptvorteil von NVI liegt in der Trennung der Schnittstelle von der Implementierung. Eine Basisklasse kann einen generischen Algorithmus implementieren und ihn der Welt präsentieren, während seine Unterklassen die Details des Algorithmus durch virtuelle Funktionen implementieren können. Externe Benutzer sind von Änderungen in den Algorithmusdetails abgeschirmt, besonders wenn Sie später entscheiden, dass Sie vor und nach der Verarbeitung Code hinzufügen möchten.

Der offensichtliche Nachteil ist, dass Sie extra Code schreiben müssen. Außerdem sind private virtuelle Funktionen für viele Leute verwirrend. Viele Programmierer denken fälschlicherweise, dass Sie sie nicht außer Kraft setzen können. Herb Sutter scheint private virtuals zu mögen, aber IMHO ist es in der Praxis effektiver, der Empfehlung von C ++ FAQ Lite zu folgen und sie zu protected zu machen.

    
Michael Kristofik 19.03.2009, 18:02
quelle
3

Dies wird oft als Template-Hook-Paar (a.k.a Hotspot) bezeichnet, geprägt von Wolfgang Pree.

Siehe PDF , PowerPoint , HTML

Ein Grund dafür, die Indirektion zu machen, wie Sie es nennen, ist, dass Dinge oft Setup vor einer Methode und einige cleaing post ein Methodenaufruf. In den Unterklassen müssen Sie nur das notwendige Verhalten liefern, ohne setup und cleaning ...

zu machen     
epatel 19.03.2009 17:54
quelle
2

Dies ist das Vorlagenmuster. Die foo-Methode enthält Code, der von allen Unterklassen ausgeführt werden muss. Es macht mehr Sinn, wenn Sie es so betrachten:

%Vor%

Es ist schöner als die Alternative, die versucht, sich daran zu erinnern, den allgemeinen Code in jeder Unterklasse einzeln aufzurufen. Zwangsläufig macht jemand eine Unterklasse, vergißt aber, den allgemeinen Code zu nennen, was zu einer Anzahl von Problemen führt.

    
mch 19.03.2009 17:58
quelle
0

Wenn eine Unterklasse die Definition von foo_? ändern könnte, aber die Verbraucher eine statische Funktion benötigen (für Effizienz)? Oder für ein Delegationsmuster?

    
MarkusQ 19.03.2009 17:55
quelle