Nasza dziedzina wiedzy obejmuje osoby chodzące boso po płycie rejestrującej ciśnienie. Dokonujemy rozpoznawania obrazu, co powoduje powstanie obiektów klasy „Foot”, jeśli ludzka stopa zostanie rozpoznana w danych czujnika.
Istnieje kilka obliczeń, które należy wykonać na danych stopy.
Teraz, który interfejs API byłby lepszy:
class Foot : public RecognizedObject {
MaxPressureFrame getMaxPressureFrame();
FootAxis getFootAxis();
AnatomicalZones getAnatomicalZones();
// + similar getters for other calculations
// ...
}
Lub:
class Foot : public RecognizedObject {
virtual CalculationBase getCalculation(QString aName);
// ...
}
Teraz jest wiele plusów i minusów, które mogę wymyślić, ale tak naprawdę nie mogę zdecydować, które są najważniejsze. Uwaga: jest to aplikacja dla użytkowników końcowych, a nie biblioteka oprogramowania, którą sprzedajemy.
Jakakolwiek rada?
Niektórzy pro dla pierwszego podejścia mogą być:
- KISS - wszystko jest bardzo konkretne. API, ale także implementacja.
- mocno wpisane wartości zwracane.
- dziedziczenie z tej klasy jest głupie. Nic nie można zastąpić, tylko dodać.
- Interfejs API jest bardzo zamknięty, nic nie wchodzi, nic nie można zastąpić, więc mniej może się nie udać.
Niektóre wady:
- Liczba pobierających będzie rosła, ponieważ każde nowe obliczenie, które wymyślimy, jest dodawane do listy
- API jest bardziej prawdopodobne, że zmieni się, a jeśli wprowadzane są przełomowe zmiany, potrzebujemy nowej wersji API, Foot2.
- w przypadku ponownego wykorzystania klasy w innych projektach możemy nie potrzebować wszystkich obliczeń
Niektórzy pro dla drugiego podejścia:
- bardziej elastyczne
- API jest mniej prawdopodobne, że zmieni się (zakładając, że otrzymaliśmy poprawną abstrakcję, jeśli nie, zmiana będzie kosztować więcej)
Niektóre wady:
- luźno wpisane. Potrzebuje rzutów na każde połączenie.
- parametr string - mam złe przeczucia (rozgałęzienie na wartościach string ...)
- Nie ma obecnie przypadku użycia / wymogu, który wymagałby dodatkowej elastyczności, ale może być w przyszłości.
- API nakłada ograniczenia: każde obliczenie musi pochodzić z klasy podstawowej. Uzyskanie obliczeń będzie wymuszone tą metodą 1, a przekazanie dodatkowych parametrów będzie niemożliwe, chyba że opracujemy jeszcze bardziej dynamiczny, superelastyczny sposób przekazywania parametrów, który jeszcze bardziej zwiększy złożoność.
getCalculation().
enumi włączyć jego wartości. Myślę jednak, że druga opcja jest zła, ponieważ odbiega od KISS.