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()
.
enum
i włączyć jego wartości. Myślę jednak, że druga opcja jest zła, ponieważ odbiega od KISS.