Ich habe die folgenden zwei Methoden, die (wie man sieht) in den meisten seiner Aussagen ähnlich sind mit einer Ausnahme (Details siehe unten)Umgestalten die beiden folgenden C++ Methoden doppelten Code, um aus
unsigned int CSWX::getLineParameters(const SURFACE & surface, vector<double> & params)
{
VARIANT varParams;
surface->getPlaneParams(varParams); // this is the line of code that is different
SafeDoubleArray sdParams(varParams);
for(int i = 0 ; i < sdParams.getSize() ; ++i)
{
params.push_back(sdParams[i]);
}
if(params.size() > 0) return 0;
return 1;
}
unsigned int CSWX::getPlaneParameters(const CURVE & curve, vector<double> & params)
{
VARIANT varParams;
curve->get_LineParams(varParams); // this is the line of code that is different
SafeDoubleArray sdParams(varParams);
for(int i = 0 ; i < sdParams.getSize() ; ++i)
{
params.push_back(sdParams[i]);
}
if(params.size() > 0) return 0;
return 1;
}
Gibt es irgendeine Technik, die ich verwenden kann, um die gemeinsamen Codezeilen der beiden Methoden auf eine separate Methode zu verschieben, die aus den beiden Varianten OR aufgerufen werden könnte - möglicherweise die beiden Methoden zu einer einzigen Methode kombinieren?
Nachfolgend sind die Einschränkungen:
- Die Klassen SURFACE und CURVE sind von 3rd-Party-Bibliotheken und damit als nicht änderbar. (Wenn es hilft sie sowohl von IDispatch abgeleitet)
- Es gibt noch weitere ähnliche Klassen (zB FACE), die in diese „Vorlage“ passen könnte (nicht C++ Vorlage, nur der Fluss von Codezeilen)
ich folgendes wissen könnte (vielleicht?) als Lösungen implementiert werden, aber wirklich bin der Hoffnung, es eine bessere Lösung ist:
- ich einen dritten Parameter zu den 2 Methoden hinzufügen könnte - zB eine Enumeration - die den ersten Parameter identifiziert (zB enum :: input_type_surface, enum :: input_type_curve)
- Ich könnte einen IDispatch übergeben und dynamic_cast <> ausprobieren und testen, welche Besetzung NON_NULL ist und ein if-else, um das Recht aufzurufen Verfahren (zB getPlaneParams() vs. get_LineParams())
Das folgende ist keine Einschränkung, sondern wäre eine Forderung wegen meines Mitspielers Widerstand sein:
- nicht eine neue Klasse implementieren, die von der Oberfläche erbt/CURVE usw. (Sie würden es viel lieber lösen, wenn sie die Enum-Lösung verwenden, die ich oben angegeben habe)
Sie nicht 'Params' Vektor löschen. Beabsichtigen Sie, es mit Parametern aus vielen Objekten zu füllen? Vielleicht gibt es viel bessere Möglichkeiten, Ihren Code umzuformen, je nachdem, was Sie vor dem Aufruf von geXXXXParameters-Methoden tun. –
Warum wird ein 'unsigned int' zurückgegeben, wenn ein' bool' genügt? –
Was ist der Typ von 'SafeDoubleArray'? Ich vermute, das könnte mehr refaktoriert werden, aber wir brauchen das zuerst. Ich zweite @ Matthieu Bewegung für eine 'bool'. – GManNickG