Erweitern Sie eine vorhandene API: Verwenden Sie Standard-Argument oder Wrapper-Funktion?

StackOverflow https://stackoverflow.com/questions/940877

  •  06-09-2019
  •  | 
  •  

Frage

Ich habe eine bestehende Methode (oder Funktion im Allgemeinen), die ich brauche, um zusätzliche Funktionalität zu wachsen, aber ich will keine Anwendung des Verfahrens an anderen Stelle im Code brechen. Beispiel:

int foo::bar(int x)
{
 // a whole lot of code here
 return 2 * x + 4;
}

ist weit verbreitet in der Codebasis verwendet. Jetzt muss ich die 4 in einen Parameter machen, aber jeder Code, der bereits foo :: bar Anrufe sollten noch erhalten, was sie erwartet. Sollte ich die alte Methode erweitern und umbenennen und wickeln Sie es in ein neues wie

int foo::extended_bar(int x, int y)
{
 // ...
 return 2 * x + y;
}

int foo::bar(int x)
{
 return extended_bar(x,4);
}

oder soll ich ein Standardargument in der Header-Datei wie

erklären
int bar(int x, int y=4);

und erstrecken sich nur die Funktion

int foo::bar(int x, int y)
{
 // ...
 return 2 * x + y;
}

Was sind Vor- und Nachteile jeder Variante?

War es hilfreich?

Lösung

ich in der Regel verwenden, um eine Wrapper-Funktion (über die meiste Zeit eine Überlastung) anstelle von Standardparametern.

Der Grund dafür ist, dass es zwei Ebenen von Abwärtskompatibilität :

  1. Mit source-level Abwärtskompatibilität bedeutet, dass Sie die Telefonvorwahl ohne Änderungen neu kompilieren, da die neuen Funktionssignaturen zu den alten kompatibel sind. Dieses Niveau kann sowohl erreicht werden; Standardwerte und Wrapper / Überlastung.

  2. Eine stärkere Ebene ist Binär-Ebene Abwärtskompatibilität, die ohne erneute Kompilierung funktioniert sogar, z.B. wenn Sie keinen Zugriff auf die Telefonvorwahl. Stellen Sie sich vor Sie Ihre Funktion in binärer Form, wie in einer DLL bereitstellen, usw. In einem solchen Fall werden die Signaturen haben die genau das gleiche, damit es funktioniert, was nicht der Fall für die Standardwerte - sie brechen diese Ebene der Kompatibilität .

Ein weiterer Vorteil der Wrapper-Funktionen ist - wenn Ihre Anwendung Protokollierung jeglicher Art hat - eine Warnung in der alten Funktion auskippen kann, dass es in zukünftigen Versionen obsolet wird und dass es empfohlen wird, um die neuen zu verwenden.

Andere Tipps

Je länger ich C ++, desto weniger Ich mag Standardfunktionsparameter. Ich kann keinen bestimmten Grund für meine Abneigung lokalisieren, aber ich finde, dass, wenn ich sie benutzen, ich am Ende fast immer um sie später zu entfernen. Also meine (subjektive) Stimme geht für die neue benannte Funktion -. Der Name natürlich wie die der alten identisch sein könnte

Ich persönlich glaube, dass implizite Verhalten sind (einer) die Wurzeln aller Übel.

Alles, was für einen Betreuer oder Anrufer der Identität des Ziels verschleiert sollte eine sehr starke Rechtfertigung hat geltend gemacht wird, vor allem, wenn es Teil eines großen API ist.

Deshalb würde ich mit dem Standard-Betrieb stark gegen die Option argumentieren.

Darüber hinaus glaube ich, dass, wenn eine bestimmte Funktion kann mit einer unterschiedlichen Anzahl von Parametern aufgerufen wird, dann ist es etwas von Natur aus unterschiedlich beiden Versionen der Funktion oder sie sind zu viel zu tun. Die Unterscheidung soll wohl im Namen sein und soll wahrscheinlich sinnvoller sein als „_extended“

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