Erstellen von internen und externen Schnittstellen für eine Klasse / Information Hiding
-
22-09-2019 - |
Frage
Für einige Klassen einer statischen C ++ Bibliothek, die ich verschiedene Schnittstellen für den Benutzer der Bibliothek und für die Bibliothek selbst anbieten möchten.
Ein Beispiel:
class Algorithm {
public:
// method for the user of the library
void compute(const Data& data, Result& result) const;
// method that I use only from other classes of the library
// that I would like to hide from the external interface
void setSecretParam(double aParam);
private:
double m_Param;
}
Mein erster Versuch war die externe Schnittstelle als ABC zu erstellen:
class Algorithm {
public:
// factory method that creates instances of AlgorithmPrivate
static Algorithm* create();
virtual void compute(const Data& data, Result& result) const = 0;
}
class AlgorithmPrivate : public Algorithm {
public:
void compute(const Data& data, Result& result) const;
void setSecretParam(double aParam);
private:
double m_Param;
}
Vorteile:
- Der Benutzer des Algorithmus kann die interne Schnittstelle sehen
Nachteile:
- Der Benutzer hat eine Factory-Methode zu verwenden, Instanzen erstellen
- Ich muss gesenkten Algorithmus zu AlgorithmPrivate, wenn ich die geheimen Parameter aus dem Inneren der Bibliothek zugreifen möchten.
Ich hoffe, Sie verstehen, was ich versuche zu erreichen, und ich freue mich auf Ihre Anregungen.
Lösung
Der einfachste Weg, könnte es sein, setSecretParam()
private
zu machen und die nach einem friend
von Algorithm
machen:
void setSecretParam(Algorithm& algorithm, double aParam)
{
void setSecretParam(double aParam);
}
Andere Tipps
Die „üblichen Verdächtigen“ Vererbung zu ersetzen ist Brücke Muster . Sie könnten eine Hierarchie von „Imps“ abgeleitet von der abstrakten Klasse AlgorithmImp definieren und nur geeignete Algorithmen in der Bibliothek Header aus. Dann kann eine Instanz von Algorithmus wie erstellt werden
ConcreteAlgorithm ca1(SomeParam, new LibraryUserAlgorithm());
ConcreteAlgorithm ca2(SomeParam, new InternalAlgorithm());