Unser Wissensgebiet umfasst Menschen, die mit bloßen Füßen über eine Druckplatte laufen. Wir machen eine Bilderkennung, die Objekte der Klasse 'Fuß' ergibt, wenn ein menschlicher Fuß in den Sensordaten erkannt wird.
Es gibt verschiedene Berechnungen, die an den Daten des Fußes durchgeführt werden müssen.
Nun, welche API wäre besser:
class Foot : public RecognizedObject {
MaxPressureFrame getMaxPressureFrame();
FootAxis getFootAxis();
AnatomicalZones getAnatomicalZones();
// + similar getters for other calculations
// ...
}
Oder:
class Foot : public RecognizedObject {
virtual CalculationBase getCalculation(QString aName);
// ...
}
Nun gibt es eine Menge Vor- und Nachteile, die ich mir einfallen lassen kann, aber ich kann mich nicht wirklich entscheiden, welche die wichtigsten sind. Hinweis: Dies ist eine Endbenutzeranwendung, keine von uns verkaufte Softwarebibliothek.
Irgendein Rat?
Einige Profis für den ersten Ansatz könnten sein:
- KISS - alles ist sehr konkret. Die API, aber auch die Implementierung.
- stark typisierte Rückgabewerte.
- Das Erben von dieser Klasse ist narrensicher. Nichts kann überschrieben, nur hinzugefügt werden.
- API ist sehr geschlossen, nichts geht rein, nichts kann überschrieben werden, so dass weniger schief gehen kann.
Einige Con's:
- Die Anzahl der Getter wird zunehmen, da jede neue Berechnung, die wir erfinden, zur Liste hinzugefügt wird
- Es ist wahrscheinlicher, dass sich die API ändert. Wenn wichtige Änderungen vorgenommen werden, benötigen wir eine neue API-Version, Foot2.
- Im Falle der Wiederverwendung der Klasse in anderen Projekten benötigen wir möglicherweise nicht jede Berechnung
Einige Profis für den zweiten Ansatz:
- flexibler
- Es ist weniger wahrscheinlich, dass sich die API ändert (vorausgesetzt, wir haben die richtige Abstraktion, wenn nicht, kostet eine Änderung mehr).
Einige Con's:
- lose getippt. Muss bei jedem Anruf besetzt werden.
- der String-Parameter - ich habe schlechte Gefühle darüber (Verzweigung auf String-Werte ...)
- Es gibt keinen aktuellen Anwendungsfall / keine aktuelle Anforderung, die die zusätzliche Flexibilität vorschreibt, aber möglicherweise in der Zukunft.
- Die API legt Einschränkungen fest: Jede Berechnung muss von einer Basisklasse abgeleitet werden. Das Erhalten einer Berechnung wird durch diese 1 Methode erzwungen, und das Übergeben zusätzlicher Parameter wird unmöglich sein, es sei denn, wir entwickeln eine noch dynamischere, superflexible Methode zum Übergeben von Parametern, die die Komplexität noch weiter erhöht.
getCalculation()
.
enum
und seine Werte einschalten. Trotzdem denke ich, dass die zweite Option böse ist, weil sie von KISS abweicht.